Python Selenium上的StaleElementReferenceException错误

时间:2019-11-14 13:58:57

标签: python selenium selenium-webdriver

能帮您解决这个问题吗?

当我运行此代码时:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
from selenium.common.exceptions import StaleElementReferenceException

class ActionsMy():
def test(self):
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://demoqa.com/")
    driver.implicitly_wait(3)

    action = ActionChains(driver)

    # Sortable
    driver.find_element(By.XPATH, "//a[contains(text(),'Sortable')]").click()
    item1 = driver.find_element_by_xpath("//li[contains(text(),'Item 1')]")
    action.drag_and_drop_by_offset(item1, 0, 150).perform()
    time.sleep(1)

    # Resizable
    driver.find_element_by_link_text("Resizable").click()
    resizableElement = driver.find_element_by_xpath(
            "//div[@class='ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se']")
    action.drag_and_drop_by_offset(resizableElement, 200, 200).perform()

 dd = ActionsMy()
 dd.test()

我收到此错误:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

我的研究表明,此问题与元素不再在DOM中或已更改的事实有关。

我使用了此解决方案:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
from selenium.common.exceptions import StaleElementReferenceException

class ActionsMy():
def test(self):
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://demoqa.com/")
    driver.implicitly_wait(3)

    action = ActionChains(driver)

    # Sortable
    driver.find_element(By.XPATH, "//a[contains(text(),'Sortable')]").click()
    item1 = driver.find_element_by_xpath("//li[contains(text(),'Item 1')]")
    action.drag_and_drop_by_offset(item1, 0, 150).perform()
    time.sleep(1)

    # Resizable
    driver.find_element_by_link_text("Resizable").click()
    try:
        resizableElement = driver.find_element_by_xpath(
            "//div[@class='ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se']")
    except StaleElementReferenceException:
        action.drag_and_drop_by_offset(resizableElement, 200, 200).perform()


 dd = ActionsMy()
 dd.test()

在这种情况下,没有错误,但是未执行操作。

我也曾经使用过WebDriverWait,但这也没有帮助。

1 个答案:

答案 0 :(得分:1)

问题出在ActionChains中,它保留了之前的所有操作,包括drag_and_drop_by_offsetitem1,因此当调用perform()时,它会尝试再次执行此操作,但是item1是陈旧的。

reset_actions()函数可以清除这些操作,但是不起作用。 a bug report表示将在硒4中修复。

同时,创建新的ActionChains实例并使用它

resizable_element = driver.find_element_by_xpath("//div[@class='ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se']")
action = ActionChains(driver)
action.drag_and_drop_by_offset(resizable_element, 200, 200).perform()