我知道这是一个普遍的问题,但是我相对缺乏经验,并且一直在努力解决此问题。
我的代码是:
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元素引用:元素未附加到页面文档”。
任何帮助将不胜感激。
答案 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)
此外,隐式等待只能在初始化时设置一次,并且在驱动程序的生命周期内有效。如果您希望为每个查询提供自定义的等待时间,请考虑使用显式等待。另外,请勿混合使用隐式等待和显式等待,因为根据文档可能无法预测结果。