使用生成器返回结果时出现selenium.common.exceptions.StaleElementReferenceException: Message: stale element refere

原始代码

解析出百度网页上的a标签连接,把解析出的a标签链接以生成器的方式返回:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()


def parse_index():
    a_tags = browser.find_elements(By.CSS_SELECTOR, '#s-top-left a')
    for a_tag in a_tags:
        yield a_tag.get_attribute('href')  # 返回生成器


def main():
    try:
        browser.get('https://www.baidu.com')
        urls = parse_index() # 解析出a标签
        for url in urls:
            browser.get(url)# 访问解析出的a标签连接
    finally:
        browser.close()


if __name__ == '__main__':
    main()

结果报错:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found

原因

浏览器访问了新的页面或者刷新了页面,导致元素已经过时,找不到原来页面的元素。

a_tags = browser.find_elements(By.CSS_SELECTOR, '#s-top-left a')
    for a_tag in a_tags:
        yield a_tag.get_attribute('href')  # 返回生成器

每一次遍历生成器,生成器就运行一次a_tag.get_attribute('href'),如果中途浏览器刷新或者访问新的页面,就会导致找不到元素。

解决办法

1、放弃生成器直接以列表形式返回。

def parse_index():
    a_tags = browser.find_elements(By.CSS_SELECTOR, '#s-top-left a')
    return [a_tag.get_attribute('href') for a_tag in a_tags]

2、遍历并访问生成器中的连接时,把生成器转换成列表,这样a_tag.get_attribute('href')一次执行完,也可以防止浏览器刷新时再一次执行该代码。

def main():
    try:
        browser.get('https://www.baidu.com')
        urls = parse_index() # 解析出a标签
        for url in list(urls):  # ---------------------------遍历前先把生成器转换成列表------------------------
            browser.get(url)# 访问解析出的a标签连接
    finally:
        browser.close()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您遇到的问题是selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found。这个异常通常发生在您试图访问一个已经过的元素引用的候。有几种常见的情况可能导致这个异常的出现。 一种情况是页面在您访问元素之前已经被更新,导致您之前引用的元素不再存在。解决这个问题的方法是在访问元素之前,使用显式等待来确保元素的可见性。例如,您可以使用WebDriverWait来等待元素出现,如下所示: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By wait = WebDriverWait(driver, 10) element = wait.until(EC.visibility_of_element_located((By.ID, 'element_id'))) ``` 另一种情况是您的页面包含了一个iframe元素,并且您没有切换到该iframe中进行操作。在访问iframe中的元素之前,您需要先切换到该iframe中。例如,您可以使用switch_to.frame方法来切换到iframe中,如下所示: ```python frame = driver.find_element(By.ID, 'iframe_id') driver.switch_to.frame(frame) ``` 综上所述,您遇到的StaleElementReferenceException异常可能是由于页面更新或未切换到正确的iframe导致的。您可以使用显式等待来确保元素的可见性,并且在访问iframe中的元素之前,先切换到该iframe中进行操作,以解决这个问题。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [python+selenium自动化出现复杂情况解决方法](https://blog.csdn.net/qq_45095100/article/details/130042608)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Selenium.HtmlElements.Net:Selenium.WebDriver的元素模型](https://download.csdn.net/download/weixin_42131424/19039601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东篱把酒黄昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值