能帮您解决这个问题吗?
当我运行此代码时:
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,但这也没有帮助。
答案 0 :(得分:1)
问题出在ActionChains
中,它保留了之前的所有操作,包括drag_and_drop_by_offset
和item1
,因此当调用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()