Ссылка на устаревший элемент Python / Selenium в цикле For - PullRequest
0 голосов
/ 05 июля 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)

Traceback:

File "<ipython-input-5-3766dfd38c2f>", line 1, in <module>
runfile('C:/Users/kdixon/Desktop/Business_Intelligence/PROJECTS/Scripts/Pull Tearsheets.py', wdir='C:/Users/kdixon/Desktop/Business_Intelligence/PROJECTS/Scripts')

File "C:\Users\kdixon\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)

File "C:\Users\kdixon\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/kdixon/Desktop/Business_Intelligence/PROJECTS/Scripts/Pull Tearsheets.py", line 42, in <module>
company_id.send_keys(Keys.ENTER)

File "C:\Users\kdixon\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 479, in send_keys
'value': keys_to_typing(value)})

File "C:\Users\kdixon\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
return self._parent.execute(command, params)

File "C:\Users\kdixon\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 314, in execute
self.error_handler.check_response(response)

File "C:\Users\kdixon\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)

StaleElementReferenceException: stale element reference: element is not attached to the page document

(Session info: chrome=67.0.3396.99)
(Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.16299 x86_64)

Ответы [ 2 ]

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

Согласно трассировке, в частности тому факту, что исключение выдается из строки company_id.send_keys(Keys.ENTER) и тип исключения, оказывается, что окно поиска (с идентификатором SearchTopBar) заменяется другим элементом при запуске типирование.

Полагаю, что если вы отправите Enter, нажмите вместе со значением, это решит проблему. I.e.:

company_id.send_keys(line + Keys.ENTER)

Если это не так, откройте Инструменты разработчика в браузере и посмотрите, какой элемент заменяет элемент SearchTopBar, когда вы начинаете печатать. В коде после отправки нажатий line на элемент company_id найдите элемент, который вы нашли для его замены, и отправьте нажатие клавиши Enter на этот элемент вместо company_id.

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

Попробуйте это:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

company_id = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//*[@id='SearchTopBar']"))
)

будет ждать, пока элемент появится в DOM

Полный код:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

company_list = open('Company_List.txt')
for line in company_list:
  company_id = WebDriverWait(driver, 10).until(EC.presence_of_element_located((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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...