1

Can you please help solve this problem?

When I run this code:

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

I get this error:

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

My research showed this problem related to the fact that the element is no longer in the DOM, or it changed.

I have used this solution:

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

In this case, there are no errors, but the operation is not performed.

I have also used WebDriverWait, but it did not help either.

1

1 Answer 1

1

The problem is in ActionChains, it retains all the previous actions, including the drag_and_drop_by_offset with item1 so when perform() is called it tries to do this action again, but item1 is stale.

There is reset_actions() function to clear those actions, but it doesn't work. There is a bug report that indicates it will be fixed in Selenium 4.

In the meantime, create new ActionChains instance and use it

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()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.