Ссылка на устаревший элемент Python / Selenium - PullRequest
0 голосов
/ 03 июля 2018

Я знаю, что это был распространенный вопрос, но я относительно неопытен, и я изо всех сил пытался решить эту проблему.

Мой код:

company_list = open('Company_List.txt')
  for line in company_list:
  company_id = driver.find_element_by_xpath('//*[@id="SearchTopBar"]')
  company_id.send_keys(line)
  company_id.send_keys(Keys.ENTER)
  driver.implicitly_wait(10)
  driver.find_element_by_xpath('//*[@id="CompanyHeaderInfo_TearSheetReport_ReportImage"]/div/img').click()
  driver.implicitly_wait(10)

И он генерирует «StaleElementReferenceException: ссылка на устаревший элемент: элемент не прикреплен к документу страницы».

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

StaleElementReferenceException произойдет, когда вы удерживаете ссылку на веб-элемент, а затем элемент изменяется с помощью некоторого JavaScript или обновления страницы. В вашем случае у вас есть ссылка на company_id. Вы дважды используете send_keys для этого элемента. Возможно, первый send_key запускает некоторый javascript, который меняет ваш элемент. Попробуйте еще раз выполнить поиск company_id перед повторным выполнением send_keys .

company_list = open('Company_List.txt')
  for line in company_list:
  company_id = driver.find_element_by_xpath('//*[@id="SearchTopBar"]')
  company_id.send_keys(line)
  company_id = driver.find_element_by_xpath('//*[@id="SearchTopBar"]')     
  company_id.send_keys(Keys.ENTER)
  driver.implicitly_wait(10)
  driver.find_element_by_xpath('//*[@id="CompanyHeaderInfo_TearSheetReport_ReportImage"]/div/img').click()
  driver.implicitly_wait(10)

Кроме того, неявное ожидание должно быть установлено только один раз во время инициализации и действует в течение всего срока службы драйвера. Если вы хотите настраивать время ожидания для каждого поиска, рассмотрите возможность использования явного ожидания. Кроме того, не смешивайте неявные и явные ожидания, поскольку результат может быть непредсказуемым в соответствии с документацией.

0 голосов
/ 03 июля 2018

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

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

for line in company_list:
    ...
    xpath = '//*[@id="CompanyHeaderInfo_TearSheetReport_ReportImage"]/div/img'

    try:
        element = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, xpath))
        )
        element.click()
    finally:
        driver.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...