Ошибки InvalidSessionIdException и StaleElementReferenceException (Python 3 / Selenium) - PullRequest
0 голосов
/ 01 мая 2020

Я думаю, что у меня над головой! Я пытаюсь выучить python, и я начал с пересмотра веб-страниц и дошел до непроходимой точки. Я получаю ошибки InvalidSessionIdException и StaleElementReferenceException. Я пробовал явное и неявное ожидание ошибок Invalid Session Id и пробовал ожидаемые условия для устаревших ошибок. Я пробовал несколько разных вещей безрезультатно. Если бы кто-то мог мне помочь, это было бы хорошо и извините за код, я только три дня изучаю python с небольшим опытом.

'''
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
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException

all_tickers = ['A', 'AA', 'AAAU', 'AACG']

driver = webdriver.Chrome()
for i in range(0, 7661):
    page_num = ('&r=' + str(i * 20 + 1))
    url = 'website' + str(page_num)
    driver.get(url)
    tickers = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="screener-content"]/table/tbody/tr[4]/td/table/tbody//td[2]/a')))
    company = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="screener-content"]/table/tbody/tr[4]/td/table/tbody//td[3]/a')))
    price = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="screener-content"]/table/tbody/tr[4]/td/table/tbody//td[9]/a')))
    num_of_tickers = len(tickers)
    for i in range(num_of_tickers):
        print(tickers[i].text + " : " + company[i].text + " : " + price[i].text, '', end = '')
        driver.close()

        driver = webdriver.Chrome()
        for index in all_tickers:
            url = 'website' + index + '/cash-flow?p=' + index
            driver.get(url)
            FCF_TTM = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]/div[2]/div[7]/div[2]/div[3]/div[1]/div[2]/span')))[0].text
            FCF_2019 = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]/div[2]/div[7]/div[2]/div[3]/div[1]/div[3]/span')))[0].text
            FCF_2018 = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]/div[2]/div[7]/div[2]/div[3]/div[1]/div[4]/span')))[0].text
            FCF_2017 = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]/div[2]/div[7]/div[2]/div[3]/div[1]/div[5]/span')))[0].text
            FCF_2016 = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]/div[2]/div[7]/div[2]/div[3]/div[1]/div[6]/span')))[0].text
            print(FCF_TTM,  FCF_2019, FCF_2018, FCF_2017, FCF_2016, '', end = '')
            driver.close()

            driver = webdriver.Chrome()
            for index in all_tickers:
                url = 'website' + index + '/key-statistics?p=' + index
                driver.get(url)
                shares_outstanding = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="Col1-0-KeyStatistics-Proxy"]/section/div[3]/div[2]/div/div[2]/div/div/table/tbody/tr[3]/td[2]')))[0].text
                print(shares_outstanding, '', end = '')
                driver.close()

driver = webdriver.Chrome()
url = 'website'
driver.get(url)
year_10_bond = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="yfin-list"]/div[2]/div/div/table/tbody/tr[3]/td[3]')))[0].text
print(year_10_bond)
driver.close()
''' 

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

При написании кода я думал, что закрываю и открываю браузер для каждого для l oop. Вот почему я не понимал ошибки, которые я получал. Однако driver = webdriver. Chrome () был за пределами для l oop. Я поместил его внутрь для l oop, и он работает как задумано. Если учесть мелочи, то они очень важны при программировании, и когда у вас нет такого большого внимания к деталям, это убивает вас!

0 голосов
/ 01 мая 2020

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

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

Один из способов обойти это - избегать использования сохраненных веб-элементов и вызывать элементы во время выполнения. Так, например,

num_of_tickers = len(tickers)
for i in range(num_of_tickers):
    print(driver.find_element_by_xpath("(//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]/div[2]/div[7]/div[2]/div[3]/div[1]/div[2]/span)[{}]").format(i).text)

Этот код будет l oop через появление xpath, и поскольку он делает это во время выполнения, устаревший элемент не должен быть выброшен.

Также ваши xpaths могут быть более краткими, попробуйте использовать это как ссылку https://devhints.io/xpath

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