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

Я пытался запустить следующий код в трех разных веб-ссылках. Код отлично работает на одной ссылке. Однако он выдает сообщение об ошибке «Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы». Я просмотрел две предыдущие темы форума (исправление устаревшего элемента Python Selenium и Как перейти на новую веб-страницу в Selenium?) примерно то же самое сообщение об ошибке, но не удалось разобраться в проблеме. Вот мой код:

driver.get('https://github.com/avassalotti')
contributions = driver.find_elements_by_xpath(".//ul[@class='filter-list small']//li") 
print(contributions)
for item in contributions:
    print (item)
    print(item.text)
    item.click()
    time.sleep(3)
    contribution = driver.find_element_by_xpath(".//*[@class='f4 text-normal mb-2']").text
    print(contribution)

Программа работает для этой ссылки (https://github.com/alex) и не работает для (https://github.com/agronholm, https://github.com/avassalotti).

Любые советы по устранению проблемы.


person user2293224    schedule 29.08.2018    source источник
comment
Это идеальный вариант использования WATIR, он отлично восстанавливает элемент после того, как он устарел. Я запускал его в WATIR, работает отлично. Если вы не зашли слишком далеко в своем проекте, вы можете использовать WATIR, который находится в верхней части Ruby Selenium Binding.   -  person Rajagopalan    schedule 29.08.2018
comment
Попробуйте for item in driver.find_elements_by_xpath(".//ul[@class='filter-list small']//li"), чтобы список обновлялся на каждой итерации.   -  person Andersson    schedule 29.08.2018
comment
@Andersson Я не знаю Python, но у Ruby также есть аналогичный цикл for, он не будет выполнять driver.find_elements каждый раз, он начинает выполняться в коллекции, которая была возвращена driver.find_elements, поэтому она наверняка устареет .   -  person Rajagopalan    schedule 29.08.2018
comment
@Rajagopalan, Ага. конечно. Это было поспешное решение :)   -  person Andersson    schedule 29.08.2018


Ответы (1)


Чтобы получить подробную информацию о вкладах, избегая ссылки на устаревшие элементы, вы можете использовать следующее решение:

  • Блок кода:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    years = []
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://github.com/agronholm")
    contributions = WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='profile-timeline-year-list js-profile-timeline-year-list bg-white js-sticky float-right col-2 pl-5']/ul[@class='filter-list small']//li/a")))
    for item in contributions:
        print(item.get_attribute("innerHTML"))
        years.append(item.get_attribute("href"))
    for year in years:
        driver.get(year)
        print(WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='js-yearly-contributions']//h2[@class='f4 text-normal mb-2']"))).get_attribute("innerHTML"))
    
  • Консольный вывод:

          2018
    
    
          2017
    
    
          2016
    
    
          2015
    
    
          2014
    
    
          2013
    
    
          2012
    
    
          2011
    
    
          2010
    
    
          2009
    
    
          260 contributions in the last year
    
    
          637 contributions in 2017
    
    
          770 contributions in 2016
    
    
          298 contributions in 2015
    
    
          239 contributions in 2014
    
    
          101 contributions in 2013
    
    
          113 contributions in 2012
    
    
          90 contributions in 2011
    
    
          16 contributions in 2010
    
    
          2 contributions in 2009
    
  • Здесь вы можете найти подробное обсуждение исключения StaleElementReference Exception в PageFactory

person DebanjanB    schedule 29.08.2018