Не удается исправить StaleElementReferenceException (элемент не прикреплен к документу) - PullRequest
0 голосов
/ 01 февраля 2019

В настоящее время я пытаюсь выполнить некоторые операции Selenium, но продолжаю сталкиваться с этой ошибкой:

StaleElementReferenceException: Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы

Код должен http://www.grownjkids.gov/ParentsFamilies/ProviderSearch, непрерывно нажимать следующую кнопку («>») результатов и очищать результаты со всех страниц в цикле.Он будет делать это правильно на нескольких страницах, но время от времени не будет работать на случайной странице с вышеупомянутым исключением.

Я уже просматривал многочисленные сообщения StackOverflow со схожими проблемами и пробовал некоторые из предложенных исправлений, напримеркак использование класса WebDriverWait для реализации явного ожидания, использование блоков try / исключением для зацикливания и повторного связывания элемента с использованием метода driver.find_element ... при условии возникновения исключения StaleElementReferenceException и попытки обоих

driver.find_element_by_id

и

driver.find_element_by_xpath.

Ниже мой код:

url = "http://www.grownjkids.gov/ParentsFamilies/ProviderSearch"
driver = webdriver.Chrome('MY WEBDRIVER FILE PATH')
driver.implicitly_wait(10)

driver.get(url)

#clears text box 
driver.find_element_by_class_name("form-control").clear()

#clicks on search button without putting in any parameters, getting all the results
search_button = driver.find_element_by_id("searchButton")
search_button.click()

#function to find next button 
def find(driver):
    try:
        element = driver.find_element_by_class_name("next")
        if element: 
            return element
    except StaleElementReferenceException:
            while (attempts < 100):
                element = driver.find_element_by_class_name("next")
                if element: 
                    return element
                attempts += 1

#keeps on clicking next button to fetch each group of 5 results 
while True: 
    try: 
        nextButton = WebDriverWait(driver, 2000).until(find)
    except NoSuchElementException:
        break
    nextButton.send_keys('\n') 
    table = driver.find_element_by_id("results")
    html_source = table.get_attribute('innerHTML')
    print html_source

IЯ догадываюсь, что WebDriverWait до 2000 и цикл 100 попыток на самом деле не работают (возможно, он не входит в этот блок?), потому что результаты одинаковы, независимо от того, насколько я их увеличу.Любые отзывы о моем коде также приветствуются, так как я впервые использую Selenium, и я довольно плохо знаком с Python.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

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

Я добавил свободное ожидание в ваш код, чтобы элемент был доступен для нажатия, попробуйтеследующий код:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException, WebDriverException, NoSuchElementException
from selenium.webdriver.common.by import By

driver= webdriver.Chrome('C:\NotBackedUp\chromedriver.exe')
url = "http://www.grownjkids.gov/ParentsFamilies/ProviderSearch"
driver.get(url)

#clears text box 
driver.find_element_by_class_name("form-control").clear()

#clicks on search button without putting in any parameters, getting all the results
search_button = driver.find_element_by_id("searchButton")
search_button.click()

#keeps on clicking next button to fetch each group of 5 results 
i=1
while True:
    wait = WebDriverWait(driver, timeout=1000, poll_frequency=1, ignored_exceptions=[StaleElementReferenceException, WebDriverException]);
    try:
        element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'next')))
        element.click()
        print("Clicked ===> ", i)
        i+=1
    except NoSuchElementException:
            break

    table = driver.find_element_by_id("results")
    html_source = table.get_attribute('innerHTML')
    print html_source

Беглое ожидание попытается нажать на следующий символ, игнорируя исключения StaleElementReferenceException и WebDriverException.

И цикл прервется, когда вы получите исключение NoSuchElementException.

Надеюсь, это поможет ...

0 голосов
/ 01 февраля 2019

StaleElementReferenceException обычно возникает, когда вы пытаетесь взаимодействовать с элементом, а не когда вы его изначально находите.

Оберните ваше взаимодействие с элементом в Try Except, который вместо этого перехватывает StaleElementReferenceException.

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