【问题标题】:StaleElementReferenceException: Message: The element reference of is staleStaleElementReferenceException:消息:元素引用已过时
【发布时间】:2020-06-05 18:15:50
【问题描述】:

我正在使用 selenium 抓取链接。我可以用我的循环打印我的链接,但我无法导航到它们,因为并获取所有信息 我收到以下错误: 消息:元素引用已过时;要么元素不再附加到 DOM,它不在当前框架上下文中,要么文档已被刷新

from selenium import webdriver
author=[]
MAX_PAGE_NUM = 2
url=r"C:\\Users\\PERSONL\\Downloads\\geckodriver-v0.26.0-win64\\geckodriver.exe"

driver=webdriver.Firefox(executable_path=url)
with open('results.csv', 'w') as f:
    f.write("Name")

for i in range(1, MAX_PAGE_NUM + 1):
    url = url = "https://www.oddsportal.com/soccer/england/premier-league-2017-2018/results/" + "#/page/" + str(i) 
    driver.get(url)
    names = driver.find_elements_by_xpath('//td[@class="name table-participant"]')
    num_page_items = len(names)
    with open('results.csv', 'a') as f:
        for i in range(num_page_items):
            author.append(names[i].text)
            f.write(names[i].text)

driver.close()

对于此代码,您能否也为此代码添加 wedriverwait :

ff=['https://www.oddsportal.com/soccer/england/premier-league-2017-2018/tottenham-manchester-city-ddkDE7Ld/#over-under;2','https://www.oddsportal.com/soccer/england/premier-league-2017-2018/burnley-bournemouth-xSUUEVHO/#over-under;2']
webD=wb.Chrome(r'C:\Users\PERSONL\Downloads\chromedriver_win32 (1)\chromedriver.exe')
k=len(ff)
for i in range(k):
    webD.get(ff[i])
    c03= webD.find_elements_by_class_name('bt-2')
    c05=c03.find_elements_by_class_name('table-container')
    c04=c03.find_elements_by_tag_name('strong')
    kk.append(c04)

    
fla=kk[0]

print(fla)
for i in fla:
    m=i.text
    num.append(m)

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    对您的脚本进行了一些调整。

    避免StaleElementReferenceException 的关键是在收集names 之前允许表加载。在元素的可见性上使用WebDriverWait

    您也可以直接遍历names,而不需要索引(参见for name in names: 行)。我还添加了一个.rstrip(),它删除了收集的文本中的任何尾随空格。您可以将其删除,看看您的 .csv 将如何理解需求。

    author=[]
    MAX_PAGE_NUM = 2
    
    with open('resultss.csv', 'w') as f:
        f.write("Name\n")
    
    for i in range(1, MAX_PAGE_NUM + 1):
        url = "https://www.oddsportal.com/soccer/england/premier-league-2017-2018/results/" + "#/page/" + str(i)
        driver.get(url)
        WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table#tournamentTable')))
        names = driver.find_elements_by_xpath('.//td[@class="name table-participant"]')
        print(len(names))
        print(names[0].text)
        with open('resultss.csv', 'a') as f:
            for name in names:
                author.append(name.text.rstrip())
                f.write(name.text.rstrip()+"\n")
    
    driver.close()
    

    WebDriverWait 需要这些导入:

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

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 2021-12-19
      • 2019-09-30
      • 2022-01-21
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 2018-10-23
      • 2022-08-17
      相关资源
      最近更新 更多