【问题标题】:Weird Python Selenium Button Click Behaviour奇怪的 Python Selenium 按钮单击行为
【发布时间】:2016-05-09 20:55:33
【问题描述】:

我试图点击的部分:

<ul class="btns right">
<li><a href="javascript:void(0)" onclick="hr_expand_event_tab_all(&quot;&quot;)" class="expand-all" id="btn_expand_all_10580503">View All Cards</a></li>
</ul>

我认为非常简单。但我似乎遗漏了什么。

问题现在在页面下方更新了一点。 xpath 不是我用更正的 xpath 尝试过的问题,它与使用类名相同。 CSS 隐藏了按钮的几个版本,但一个 common.exception 被抛出它实际使用 xpath 或类名找到的那些。

我已经检查了页面是否正确加载并且元素在那里。我有一张支票要等到整个页面加载完毕并截图确认。

loadbutton = Driver.find_element_by_xpath("//a[@class='expand-all']")

给予:

<class 'selenium.common.exceptions.ElementNotVisibleException'>

所以我试图找到一个带有锚点的onclick:

loadbutton = Driver.find_element_by_xpath("//li[contains(@onclick, 'View All Cards')]")

同样的结果。我也尝试了一些正则表达式来捕捉 id 变化,但我不确定我在哪里出错了。有一个 onlick 并且它已加载,但我无法找到它。

如果有人能告诉我我在这方面做错了什么,我将不胜感激。

/更新:

原来有多个版本的按钮,有些是可见的,有些是不可见的。

我循环了:

loadbutton = Driver.find_elements_by_xpath("//a[@class='expand-all']")
for button in loadbutton:
  print "button found"

它出现了多个结果。较早的那些是隐藏的,但最后的肯定会显示在我的浏览器和屏幕截图上。所以我预计早期的失败并添加了一个 .click() 尝试:除了:他们都失败了。没想到。

进一步更新:

所以我运行了这个:

loadbutton = Driver.find_elements_by_xpath("//a[@class='expand-all']")
for button in loadbutton:
  print "button found"
  try:
    button.click()
  except:
    e = sys.exc_info()[0]
    print e

第一对夫妇给了我这个:

<class 'selenium.common.exceptions.ElementNotVisibleException'>

好的,预计 CSS 会隐藏它。显示的最后两个给出了这个:

<class 'selenium.common.exceptions.WebDriverException'>

所以它可以看到它们。它不会点击它们。 “常见异常”似乎并没有太大帮助。

【问题讨论】:

  • 似乎该按钮是使用 css 隐藏的。当您在浏览器中获取此页面时,您能看到按钮吗?
  • //*/a[contains(text(), 'View All Cards')] 试试这个 xpath,你的 xpath 构造似乎错误
  • 当按钮有 id 时,为什么这一切都需要 xpath?
  • @e4c5 考虑到 id 中的数字,我猜它可能是自动生成的 id。
  • ID 似乎是动态的..框架生成.....

标签: python selenium web-scraping


【解决方案1】:

试试这个 xpath(用代码块更新,所以网站删除了我的 *)

//*[contains(concat(' ', @class, ' '), ' btns right ')]//*[contains(concat(' ', @class, ' '), ' expand-all ') and contains(text(), 'View All Cards')]

提供一些等待元素可点击(建议使用隐式)。

我只用于 java ,但我在这里参考了 python here 它可能会有所帮助!!

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
button = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[contains(concat(' ', @class, ' '), ' btns right ')]//*[contains(concat(' ', @class, ' '), ' expand-all ') and contains(text(), 'View All Cards')]')))
button.click()


Even if the above thing fails, try this

形成这些链接 link1link2

driver.execute_script("document.getElementsByClassName('expand-all')[0].click();")

在所需元素上注入人工 CLICK,删除(注释)所有其他代码

可能你的应用属于 link2 OP :)

【讨论】:

  • 感谢您的建议。它抛出 InvalidSelectorException 并且 xpath 超出了我的范围,所以我没有机会进行调试。就是说刚刚再次更新了问题,我认为问题不是发现它们循环遍历由 css 隐藏的那些失败,因为在单击时找不到它们,但后来的只是抛出一个常见异常。这对我来说是因为某些“常见”原因,使用类只是无法单击它们。
  • 工作和令人印象深刻的 xpath,但不幸的是得到了与使用类名完全相同的结果。
  • 试过了。从字面上看,它曾一度等待 10 分钟。它呈现在页面上,它正在查找所有按钮,异常处理那些 css 隐藏的按钮,只是向它可以看到但由于某种原因不想点击的按钮抛出一个 common.exception。()我还没有看到类似的东西这个以前。
  • 为这个建议干杯。
  • 你是一个了不起的人。发挥了一种我从不知道的魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2014-09-20
  • 2013-09-24
相关资源
最近更新 更多