StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

Viewed 1037

i am trying to perform a loop over school from all districts and blooks and collect the data from table. but when i use click() for go button it shows error ("StaleElementReferenceException: Message: stale element reference: element is not attached to the page document") in (" if (k.text=='Select School'):")line. can anyone help me.

import requests
import scrapy
import selenium
from bs4 import BeautifulSoup
import csv
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import Select
driver=webdriver.Chrome()
url='https://rajshaladarpan.nic.in/SD1/Home/Public/EmployeeSearch.aspx'
driver.get(url)
driver.find_element_by_css_selector('#ContentPlaceHolder1_EmployeeDetail_rbtSchOffSeclection').click()
driver.find_element_by_css_selector('#ContentPlaceHolder1_EmployeeDetail_btnSearch').click()

dist=Select(driver.find_element_by_xpath('/html/body/form/div[3]/div[5]/div/div/div[2]/div/div/div/div[1]/div[3]/div/div[3]/div[1]/div[1]/div/select'))
for i in dist.options:
    if i.text == '--Select District--':
        continue
    dist.select_by_visible_text(i.text)
    print(i.text)
    dis.append(i.text)
    block=Select(driver.find_element_by_xpath('/html/body/form/div[3]/div[5]/div/div/div[2]/div/div/div/div[1]/div[3]/div/div[3]/div[1]/div[2]/div/select'))
    for bloc in block.options:
        if (bloc.text == 'Select Block') or (bloc.text == 'ALL') or (bloc.text == ''):
            continue
        block.select_by_visible_text(bloc.text)
        print(bloc.text)
        time.sleep(10)
        school=Select(driver.find_element_by_xpath('/html/body/form/div[3]/div[5]/div/div/div[2]/div/div/div/div[1]/div[3]/div/div[3]/div[2]/div[1]/div[2]/select'))
        for k in school.options:
            if (k.text=='Select School'):
                continue
            print(k.text)
            time.sleep(2)
            school.select_by_visible_text(k.text)
            driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_EmployeeDetail_Button6"]').submit()
            time.sleep(10)
1 Answers

org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document

The literal meaning is about , The referenced element is out of date , No longer attached to the current page . Usually , This is because the page has been refreshed or skipped , The solution is , Reuse findElement or findElements Method to locate the element .

so you have to change all your loops and refresh each time to avoid this error.

i show you the fix for district, block and school , i have fixed the number of each item to 5 for the test.

And i suggest you to search the id when available instead xpath

driver.maximize_window()
url='https://rajshaladarpan.nic.in/SD1/Home/Public/EmployeeSearch.aspx'
driver.get(url)
driver.find_element_by_css_selector('#ContentPlaceHolder1_EmployeeDetail_rbtSchOffSeclection').click()
driver.find_element_by_css_selector('#ContentPlaceHolder1_EmployeeDetail_btnSearch').click()
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'ContentPlaceHolder1_EmployeeDetail_ddlDistrictsch')))
dist=Select(driver.find_element_by_id('ContentPlaceHolder1_EmployeeDetail_ddlDistrictsch'))
nbrdist = len(dist.options)
nbrdist = 5 if nbrdist > 5 else nbrdist
print("nbr district", nbrdist)
for r in range(0, nbrdist):
    try:
        d = dist.options[r]
        if d.text == '--Select District--':
            continue
    except StaleElementReferenceException:
        dist = Select(driver.find_element_by_id('ContentPlaceHolder1_EmployeeDetail_ddlDistrictsch'))
        d = dist.options[r]
        if d.text == '--Select District--':
            continue

    dist.select_by_visible_text(d.text)
    print(d.text)

    time.sleep(2)
    block=Select(driver.find_element_by_id('ContentPlaceHolder1_EmployeeDetail_ddlBlock'))

    nbrblock = len(block.options)
    nbrblock = 5 if nbrblock > 5 else nbrblock
    print("nbr block:",nbrblock)
    for b in range(0, nbrblock):
        try:
            bloc = block.options[b]
            if (bloc.text == 'Select Block') or (bloc.text == 'ALL') or (bloc.text == ''):
                continue
        except StaleElementReferenceException:
            block = Select(driver.find_element_by_id('ContentPlaceHolder1_EmployeeDetail_ddlBlock'))
            bloc = block.options[b]
        if (bloc.text == 'Select Block') or (bloc.text == 'ALL') or (bloc.text == ''):
            continue

        block.select_by_visible_text(bloc.text)
        print(bloc.text)
        time.sleep(2)

        school=Select(driver.find_element_by_id('ddlSchool'))
        nbrschool = len(school.options)
        print("nbr school:", nbrschool)
        nbrschool = 5 if nbrschool > 5 else nbrschool
        for s in range(0, nbrschool):
            try:
                sc = school.options[s]
                if (sc.text=='Select School'):
                    continue

            except StaleElementReferenceException:
                school = Select(driver.find_element_by_id('ddlSchool'))
                sc = school.options[s]
                #print("ersc", len(school.options))
                if (sc.text == 'Select School'):
                    continue

            print(sc.text)
            school.select_by_visible_text(sc.text)
            time.sleep(0.5)
            driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_EmployeeDetail_Button6"]').click()
            time.sleep(3)
Related