嗨,我想写注册机器人。
我正在将硒与python结合使用,开始时遇到以下问题。
elems = driver.find_elements_by_xpath("//a[@href]")
for elem in elems:
elem_ = elem.get_attribute("href")
regex = re.compile('signup')
match = re.search(regex, elem_)
if match:
print(elem_)
elem.click()
有了它我就可以找到注册链接,但是当我尝试单击它时,它会给我:
Message: stale element reference: element is not attached to the page document
我不好用这个元素吗?如何对find_elements_by_something创建的列表中的元素执行click功能?
答案 0 :(得分:1)
执行 click 函数的方式是正确的: find_elements 函数返回WebElements的列表,然后调用 click 功能之一。 问题出在其他地方。
文档: Stale Element Reference Exception
在以下两种情况之一中引发了陈旧元素引用异常: 第一个比第二个更普遍:
该元素已被完全删除。
该元素不再附加到DOM。
如您所见,当硒无法在DOM结构中定位元素时,就会引发异常。
此问题的通用解决方案不存在,因为它取决于您正在处理的网页。
通常,这类问题发生在动态页面中,顾名思义,其中的DOM结构是动态生成的。
很简单,似乎common solution是要重试一次,只是将其包围在 try 块中并重新执行代码:
from selenium.common.exceptions import StaleElementReferenceException
try:
...
except StaleElementReferenceException:
...
在最坏的情况下,如果唯一要做的就是单击click()按钮,则可以解决DOM通过ActionChain通过坐标移动到元素的问题。
from selenium.webdriver.common.action_chains import ActionChains
elem = driver.find_element(By.TAG_NAME, 'body')
ac = ActionChains(driver)
ac.move_to_element(elem).move_by_offset(x_offset, y_offset).click().perform()