尝试move_to_element(Python)

时间:2017-09-27 12:44:31

标签: python selenium selenium-chromedriver

我正在尝试.click()网页上弹出式列表中的一些元素,但在尝试move_to_elements时继续获取StaleElementReferenceException

代码基于Feed中的许多可点击元素。单击时,这些元素会生成一个弹出框,其中包含我想要访问的更多可单击元素。

我使用以下代码访问弹出框,其中popupbox_links是一个包含弹出框坐标和链接的列表:

for coordinate in popupbox_links:
    actions = ActionChains(driver)
    actions.move_to_element(coordinate["Popupbox location"]).perform()
    time.sleep(3)
    popupboxpath = coordinate["Popupbox link"]
    popupboxpath.click()
    time.sleep(3)

这很好用。但是当打开弹出框时,我想执行以下操作:

seemore = driver.find_element_by_link_text("See More") 
time.sleep(2)
actions.move_to_element(seemore).perform()
time.sleep(2)
seemore.click()
time.sleep(3)
findbuttons = driver.find_elements_by_link_text("Button")
time.sleep(2)
print(findbutton)
for button in findbuttons:
    time.sleep(2)
    actions.move_to_element(button).perform() 
    time.sleep(2)
    button.click()
    time.sleep(randint(1, 5))

麻烦始于actions.move_to_element“看到更多”和“按钮”。即使print(findbutton)实际上返回一个包含我想要点击的元素的内容列表,Selenium似乎也无法对这些元素进行move_to_element。相反,它会抛出StaleElementReferenceException

为了让它更加混乱,脚本似乎有时会起作用。虽然通常它只是崩溃。

有关如何解决此问题的任何线索?非常感谢。

我正在使用Chrome WebDriver在Python 3.6上运行最新的Selenium。

1 个答案:

答案 0 :(得分:0)

StaleElementReferenceException 表示该元素是stage,因为在您创建webElement对象后页面中的某些内容已更改。在你因button.click()而可能发生的情况。

最简单的解决方案是每次都创建新元素,而不是从循环中迭代元素。

以下更改可能有效。

findbuttons = driver.find_elements_by_link_text("Button")
time.sleep(2)
print(findbuttons)
for i in range(len(findbuttons)):
    time.sleep(2)
    elem = driver.find_elements_by_link_text("Button")[i]
    actions.move_to_element(elem).perform() 
    time.sleep(2)
    elem.click()
    time.sleep(randint(1, 5))