我正在尝试.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。
答案 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))