【问题标题】:Selenium - How to click on an 'unclickable' elementSelenium - 如何单击“不可点击”元素
【发布时间】:2019-02-12 07:45:20
【问题描述】:

我将 selenium 与 Python 一起用于浏览器自动化。 在这个特定的网页上,我需要为我上传的视频选择类别。显示的类别具有要单击的复选框,但实际上,它们不是复选框。用鼠标单击它们时,元素的类会发生变化。

之前-

<span class='foo', id='bar'>

之后-

<span class='foo.active', id='bar'>

我可以同时使用find_element_by_class_namefind_element_by_id 来定位元素

问题不在于定位元素,而在于点击它们。

  • 我试过.click()方法,明显不行
  • 我试过ActionChains,它给出了一个错误

rect 未定义。

  • 我尝试了execute_script 方法,它不会抛出任何错误,但也不会改变任何东西。

driver.execute_script("arguments[0].setAttribute('class','foo.active')", element)

还有其他方法可以检查该复选框吗?

更新:我意识到该元素不在视图中,因为它会引发错误

消息:元素无法滚动到视图中

另外,element.text 返回一个空字符串。

当我在浏览器中看到网页时,没有任何东西挡住视线。

代码如下:

<li id='categoryID1' class='categoryBtn list5'>        
<span class="categoryCheckbox"></span>
<span class="categoryLabel">Funny</span>
<div class="reset"></div>
</li>

我试过了: driver.find_element_by_xpath("//span[contains(text(),'Funny')]")

它会抛出这个错误:

selenium.common.exceptions.ElementNotInteractableException:消息:元素无法滚动到视图中

更新 2:我还意识到使用 contains(text()) 方法会返回一个不在视图中的元素。另一方面,当我从浏览器复制 XPath 然后使用它时,它返回一个可以单击的元素。

【问题讨论】:

  • 你能分享一下你用的是什么定位器吗?
  • 我尝试了 by_id 和 by_class
  • 您提供的span 节点中没有id,请尝试共享整个html 行和您迄今为止尝试过的定位器
  • 请通过 xpath 尝试(它永远是唯一的)。
  • 为什么 .click() 不起作用?如果元素没有被其他层覆盖,它应该可以工作。

标签: python-3.x selenium selenium-webdriver automation


【解决方案1】:

也许这会有所帮助:

elem = driver.find_element_by_xpath("[contains(@class, 'foo')]")

elem.click()

elem.send_keys(u'\ue007')  (or elem.send_keys(u'\ue00d') )

【讨论】:

  • 它会抛出这个错误selenium.common.exceptions.ElementNotInteractableException: Message: Element &lt;span class="categoryLabel"&gt; is not reachable by keyboard
【解决方案2】:

如果类是唯一的但动态变化的,则需要从该类中搜索并获取部分静态值。

你的情况可以试试

xPath = "//span[contains(@class, 'foo')]"
element = driver.find_element_by_xpath(xPath)
element.click()

如果有多个匹配项,那么您可以使用匹配的索引号,如下所示:

(//span[contains(@class, 'foo')])[Matching index number]

例如,如果您在索引号 3 处获得匹配,那么您可以执行以下操作:

xPath = "(//span[contains(@class, 'foo')])[3]"
element = driver.find_element_by_xpath(xPath)
element.click()

如果元素存在并且单击时遇到任何异常,请尝试延迟:

from time import sleep

sleep(3)
xPath = "(//span[contains(@class, 'foo')])[3]"
element = driver.find_element_by_xpath(xPath)
element.click()

希望对你有帮助……

【讨论】:

  • 我已经更新了这个问题。问题不在于定位元素,而在于选中复选框。一旦网站再次启动,我将使用原始代码进行更新(它现在正在维护中
  • 嗨。它给出了一个例外Element &lt;li id="categoryId_10_0" class="categoryBtn listCount_13"&gt; could not be scrolled into view。当我看到浏览器时它是可见的。不知道是什么问题
  • 我没有正确理解您的问题,&lt;span class='foo.active', id='bar'&gt;&lt;li id="categoryId_10_0" class="categoryBtn listCount_13"&gt; 是什么?随着班级的变化,您尝试的定位器可能无法正常工作。
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2017-04-16
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多