При использовании Python Selenium возникает ошибка «selenium.common.exceptions.StaleElementReferenceException» - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь получить все значения одного выпадающего поля, а затем зацикливаюсь на этих значениях. Во время цикла я пытаюсь выбрать каждое раскрывающееся значение. Теперь при каждом выборе заполняется другое раскрывающееся поле. Итак, это зависимое раскрывающееся поле.

Пока я могу получить все выпадающие значения и могу циклически перебирать эти значения. Но главная проблема заключается в том, когда я выбираю каждое значение. Когда я выбираю каждое значение, он отправляет запрос на публикацию, обновляет всю страницу и заполняет зависимый выпадающий список значениями.

Теперь я использую этот скрипт на Python ниже

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#from selenium.webdriver.support.expected_conditions import stalenessOf

import time

driver = webdriver.Firefox()
driver.set_script_timeout(10)

wait = WebDriverWait(driver, 10)

driver.get("https://test.aspx")

district_list = Select(driver.find_element_by_name("DistrictList"))

for district in district_list.options:
    wait.until(EC.visibility_of_element_located((By.NAME, 'DistrictList')))
    district_name = district.get_attribute("text")
    print("District is: %s" % district_name)
    district_list.select_by_visible_text(district_name)
    wait.until(EC.visibility_of_element_located((By.NAME, 'DistrictList')))

но я получаю эту ошибку

selenium.common.exceptions.StaleElementReferenceException: Message: ссылка на элемент устарела; либо элемент больше не присоединен к DOM, он не находится в текущем контексте фрейма, либо документ обновлен

РЕДАКТИРОВАТЬ: Полный ответ об ошибке:

(base) F:\Projects\GitHub\Capture_Ocr>python selenium_dropdown.py
District is: -- Select District --
District is: Ahmednagar
Traceback (most recent call last):
  File "selenium_dropdown.py", line 20, in <module>
    district_name = district.get_attribute("text")
  File "C:\Users\Kapil\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 141, in get_attribute
    self, name)
  File "C:\Users\Kapil\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 636, in execute_script
    'args': converted_args})['value']
  File "C:\Users\Kapil\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Kapil\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <option> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

Теперь я просмотрел некоторые ссылки на StackOverflow, например

Python Selenium: подождать, пока элемент больше не устареет?

и другие, но не смогли найти решение.

Ответы [ 2 ]

1 голос
/ 18 мая 2019

@ Кори Голдберг объяснил причину исключения устаревшего элемента.Вот решение для решения проблемы.

# get number of options in the district list
distrOptions= len(driver.find_elements_by_xpath("//select[@name='DistrictList']/option")))

# loop through all the options using the option index
for distNum in range(distrOptions):
    wait.until(EC.visibility_of_element_located((By.NAME, 'DistrictList')))
    # get the district element based on index
    districtEle = driver.find_element_by_xpath("(//select[@name='DistrictList']/option)[" + str(distNum+1) +"]"))
    # get district name
    district_name = districtEle.get_attribute("text")
    # print the district Name
    print("District is: %s" % district_name)
    # select district from the list box
    districtEle.click()
    wait.until(EC.visibility_of_element_located((By.NAME, 'DistrictList')))
0 голосов
/ 18 мая 2019

отправляет запрос на публикацию, обновляет всю страницу и заполняет зависимый выпадающий список значениями.

объяснение:

при загрузке новой страницы выпотерять все ссылки на элементы на предыдущей странице ... Итак, во второй раз в вашем цикле вы пытаетесь получить доступ к элементу на оригинальной странице, которая больше не существует ... поэтому вы получаетеStaleElementReferenceException.

По сути, вы не можете делать ничего, что запускает навигацию при переборе элементов, или вы получите это.Вам нужно извлекать новые элементы каждый раз, когда страница перезагружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...