注册机器人

时间:2020-04-09 08:51:32

标签: python selenium automation

嗨,我想写注册机器人。

我正在将硒与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功能?

1 个答案:

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