【问题标题】:Python Selenium: Stale Element Reference Exception ErrorPython Selenium:过时元素引用异常错误
【发布时间】:2018-04-01 06:08:58
【问题描述】:

我面临的问题在于这些循环的迭代,一旦从网页下载第一个文件,我就会收到错误:

“selenium.common.exceptions.StaleElementReferenceException: 消息:过时的元素引用:要么元素不再附加到 DOM,要么页面已刷新”

“97081 数据扩展 xml”是迭代中的第二个可下载文件。我特此附上代码,任何纠正此问题的建议将不胜感激。

import os
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir", "F:\Projects\Poli_Map\DatG_Py_Dat")
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/xml")

driver = webdriver.Firefox(firefox_profile=fp)

driver.get('https://data.gov.in/catalog/variety-wise-daily-market-prices-data-cauliflower')
wait = WebDriverWait(driver, 10)

allelements = driver.find_elements_by_xpath("//a[text()='xml']")

for element in allelements:
    element.click()
    class FormPage(object):
        def fill_form(self, data):
            driver.execute_script("document.getElementById('edit-download-reasons-non-commercial').click()")
            driver.execute_script("document.getElementById('edit-reasons-d-rd').click()")
            driver.find_element_by_xpath('//input[@name = "name_d"]').send_keys(data['name_d'])
            driver.find_element_by_xpath('//input[@name = "mail_d"]').send_keys(data['mail_d'])
            return self

        def submit(self):
            driver.execute_script("document.getElementById('edit-submit').click()")

    data = {
        'name_d': 'xyz',
        'mail_d': 'xyz@outlook.com',
    }
    time.sleep(5)
    FormPage().fill_form(data).submit()

    time.sleep(5)
    window_before = driver.window_handles[0]
    driver.switch_to_window(window_before)
    driver.back()

【问题讨论】:

    标签: python loops selenium webdriver


    【解决方案1】:

    在您调用 submit() 后刷新页面后,allelements 内的 webElements 将不再有效

    代替

    allelements = driver.find_elements_by_xpath("//a[text()='xml']")
    
    for element in allelements:
        element.click()
    

    试试

    allelements = len(driver.find_elements_by_xpath("//a[text()='xml']"))
    
    for index in range(allelements):
        driver.find_elements_by_xpath("//a[text()='xml']")[index].click()
    

    【讨论】:

    • 感谢安德森及时回复。这工作正常。
    • 这对我不起作用。点击后,我使用driver.execute_script("window.history.go(-1)") 返回上一页。单击下一项时,我得到 "IndexError: list index out of range"
    • @Heinz ,这似乎是一个时间问题:当你回来时还没有元素......尝试实现ExplicitWait
    • @Andersson 我实现了等待,但无论timeout 设置多长时间,仍然会出现相同的错误。 driver.execute_script("window.history.go(-1)")后面的链接似乎驱动无法关注页面。
    • driver.back() 的工作方式不同吗?您可以提交有关此问题的新票,因为没有足够的信息为您提供好的解决方案
    【解决方案2】:
    >>>Customize the for loop as:  
    
    from selenium.common import exceptions  
    
    and customize your code of for loop as:  
    
    for element in allelements:
       try:  
         //your code to find element and operations with that element
       except exceptions.StaleElementReferenceException:  
            pass
    

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2020-08-04
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多