【问题标题】:Click button by find_element_by_class_name not working python selenium webdriver NOT working按 find_element_by_class_name 单击按钮不起作用 python selenium webdriver 不起作用
【发布时间】:2017-08-18 16:28:41
【问题描述】:

我正在尝试使用 Python 和 Selenium 在 LinkedIn 上添加联系人。我正在尝试通过在具有无限滚动功能的“网络”选项卡 (https://www.linkedin.com/mynetwork) 中添加 LinkedIn 提出的联系建议来实现。

基本上,我希望脚本找到每个建议配置文件旁边的“连接”按钮,单击该按钮,然后重复直到出现错误,脚本应向下滚动以加载更多“连接”按钮以重复。

我发现找到按钮元素的最佳方法是通过 find_element_by_class_name(),因为所有连接按钮都具有相同的类。我也尝试使用 CSS 和 Xpath 定位元素,但没有成功。

问题:脚本能够单击第一个连接按钮,但之后没有。我已经尝试了很多实现的想法(通过 Xpath、CSS 定位,使用要单击的按钮列表),但似乎没有一个可行。下面是脚本的相关部分。

while True:
    try:
        driver.find_element_by_class_name("mn-person-card__person-btn-ext.button-secondary-medium").click()
        time.sleep(1)
    except:
        pass
        print("trying to scroll")
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1) 

有什么想法吗?对我来说,似乎代码应该可以工作,并且好像还有其他东西阻碍了成功。也许是一个错误或类似的东西。可能会提到我对这一切都很陌生,这是我尝试制作的第一个用于操作浏览器的脚本。

我正在使用 Firefox 驱动程序。完整的脚本可以在这里找到:http://pastebin.com/qtdNsRtz

提前致谢!

【问题讨论】:

  • 您不能将复合类与by_class_name() 一起使用。您在那里使用了 CSS 选择器,这可能是它不起作用的原因。

标签: python class selenium firefox


【解决方案1】:

您应该使用find_elements 来查找具有相同类的所有元素 试试这个来获取所有元素:

elements = driver.find_elements_by_class_name("mn-person-card__person-btn-ext.button-secondary-medium")

然后使用 for 循环单击它们中的每一个。例如:

for e in elements:
    e.click()

【讨论】:

  • while 循环不工作时,for 循环如何工作?
  • 完美!我已经尝试过该解决方案,但是在阅读您的答案时,我意识到我正在尝试通过(按照您的符号)单击元素: for e in elements: browser.e.click() 您的评论让我意识到“浏览器" 没有必要添加。当然,它应该像您建议的那样: for e in elements: e.click() 现在它完美地工作了!非常感谢!
  • 如果元素在一个空列表中怎么办?
【解决方案2】:

您尝试使用 find_element_by_class_name 定位器的方式不正确,因为此定位器不支持其中的复合类。

如果类属性有多个类名,则需要使用xpathcssSelector

driver.find_element_by_xpath("//button[@class='mn-person-card__person-btn-ext button-secondary-medium']").click()

【讨论】:

  • 感谢您的回复!我使用了 Amit 的解决方案 :)
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多