Python /硒陈旧元素参考

时间:2018-07-03 17:49:46

标签: python selenium selenium-webdriver selenium-chromedriver

我知道这是一个普遍的问题,但是我相对缺乏经验,并且一直在努力解决此问题。

我的代码是:

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:stale元素引用:元素未附加到页面文档”。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我认为这是问题所在,而不是implicitly_wait尝试使用Explicit Waits,因为您尝试在页面上未包含的元素上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()

答案 1 :(得分:0)

StaleElementReferenceException将在您持有对Webelement的引用时发生,然后该元素通过某些javascript或页面刷新而更改。就您而言,您有对company_id的引用。您正在此元素上执行两次send_keys。可能第一个send_key会触发一些javascript来更改您的元素。 尝试在第二次执行send_keys之前再次查找company_id

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)

此外,隐式等待只能在初始化时设置一次,并且在驱动程序的生命周期内有效。如果您希望为每个查询提供自定义的等待时间,请考虑使用显式等待。另外,请勿混合使用隐式等待和显式等待,因为根据文档可能无法预测结果。