我正在将Selenium与Python结合使用以实现浏览器自动化。 在此特定网页上,我需要选择上传视频的类别。类别显示为具有要单击的复选框,但实际上,它们不是复选框。用鼠标单击它们时,元素的类将更改。
之前-
<span class='foo', id='bar'>
之后-
<span class='foo.active', id='bar'>
我可以同时使用find_element_by_class_name
和find_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并使用它时,它返回一个可以单击的元素。
答案 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()
希望对您有帮助...