硒-如何单击“不可点击”元素

时间:2019-02-12 07:45:21

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

我正在将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并使用它时,它返回一个可以单击的元素。

2 个答案:

答案 0 :(得分:0)

也许这会有所帮助:

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

elem.click()

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

答案 1 :(得分:0)

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

您可以尝试

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()

希望对您有帮助...