Search code examples
pythonseleniumselenium-webdriverstaleelementreferenceexception

Message: stale element reference: element is not attached to the page document - Web Table Python


enter image description hereenter image description hereI am getting the mentioned exception when trying to automate Web-table using selenium Python. below is my code

import time
from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException

driver = webdriver.Chrome("E:\pythonProject\Framefork1\BrowserDrivers\chromedriver.exe")
driver.maximize_window()
driver.get("https://admin-demo.nopcommerce.com/Admin/Customer/List")
driver.find_element_by_xpath("/html/body/div[6]/div/div/div/div/div[2]/div[1]/div/form/div[3]/input").click()

time.sleep(5)
table = driver.find_element_by_xpath("(//table[@class='table table-bordered table-hover table-striped dataTable no-footer'])[2]")
body = table.find_element_by_tag_name("tbody")
cells = body.find_elements_by_tag_name("td")
rows = body.find_elements_by_tag_name("tr")
links = driver.find_elements_by_xpath("//i[@class='fa fa-pencil']")
print(len(rows))

for i in range(len(rows)):
    col = rows[i].find_elements_by_tag_name("td")
    for j in range(len(col)):`enter code here`
        if col[j].text == "Registered":
            time.sleep(5)
            links[i].click()
            driver.find_element_by_link`_text("back to customer list").click()

For business scenario I have attached a doc for reference


Solution

  • selenium doesn't give you python's elements but references to objects on current page in web browser. When you click and load new page then you loose access to these objects.

    First you have to get all links as text and later use them with driver.get()


    import time
    from selenium import webdriver
    from selenium.common.exceptions import StaleElementReferenceException
    
    driver = webdriver.Chrome()#"E:\pythonProject\Framefork1\BrowserDrivers\chromedriver.exe")
    driver.maximize_window()
    
    driver.get("https://admin-demo.nopcommerce.com/Admin/Customer/List")
    driver.find_element_by_xpath("//input[@type='submit']").click()
    
    time.sleep(5)
    table = driver.find_element_by_xpath("(//table[@class='table table-bordered table-hover table-striped dataTable no-footer'])[2]")
    body = table.find_element_by_tag_name("tbody")
    cells = body.find_elements_by_tag_name("td")
    rows = body.find_elements_by_tag_name("tr")
    #links = driver.find_elements_by_xpath("//i[@class='fa fa-pencil']")
    links = driver.find_elements_by_xpath("//a[@class='btn btn-default']")
    
    print(len(rows))
    
    # -- first get all links ---
    
    links_to_click = []
    
    for i in range(len(rows)):
        col = rows[i].find_elements_by_tag_name("td")
        for j in range(len(col)):
            if col[j].text == "Registered":
                links_to_click.append(links[i].get_attribute('href'))
    
    print(links_to_click)
    
    # --- next visit all links ---
    
    for link in links_to_click:
        driver.get(link)
        #driver.find_element_by_link_text("back to customer list").click()