使用 Python 的 Selenium Webdriver 4 - 过时元素引用异常(过时元素引用:未找到过时元素)

Selenium Webdriver 4 with Python - Stale Element Reference Exception (stale element reference: stale element not found)

提问人:Aagam Shah 提问时间:7/14/2023 更新时间:7/15/2023 访问量:1175

问:

我正在为 Cookie Clicker 游戏开发一个游戏机器人。机器人点击cookie并自动购买物品。一旦你自己尝试游戏,你就会明白机器人会做什么。友情链接: https://orteil.dashnet.org/experiments/cookie/

问题:在执行后的几秒钟内不断收到此异常:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found
(Session info: chrome=114.0.5735.198)

现在我尝试多次执行它,但它在不同的时间间隔崩溃。我什至在多次执行后重新编码了整个项目。根据我在网上的理解,当浏览器中有更新或在执行过程中有任何用户干预时,就会发生这种情况。但是在执行过程中我没有碰键盘。 代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get(url="http://orteil.dashnet.org/experiments/cookie/")
clicker = driver.find_element(By.XPATH, '//*[@id="cookie"]')
while True:
    clicker.click()
    money = int(driver.find_element(By.XPATH, '//*[@id="money"]').text)
    cursor_price = int(driver.find_element(By.XPATH, '//*[@id="buyCursor"]/b').text.split()[-1])
    if money > cursor_price:
        driver.find_element(By.XPATH, '//*[@id="buyCursor"]/b').click()

我应该尝试使用其他浏览器吗?

python-3.x selenium-webdriver selenium-chromedriver chrome-web-driver

评论

0赞 Ajeet Verma 7/14/2023
可以清楚地看到,当您使用更改/更新浏览器时,您正在与用户交互click()

答:

1赞 Bhairu 7/14/2023 #1
StaleElement Exception occurs when an element is stale from the DOM sheet, and it probably happens when the page gets refreshed, below code helped me when I am in the same situation.

Webelement ele=driver.findelement(By.xpath(""));
wait.until(ExpectedCondition.Invisiblityofelemntlocated(ele));

评论

0赞 Francesco 8/31/2023
这是解决我问题的唯一方法,使用Invisiblityofelemntlocated
0赞 undetected Selenium 7/15/2023 #2

StaleElementReferenceException

当对某个元素的引用不再出现在页面的 DOM 上并且已过时时,将引发 StaleElementReferenceException

StaleElementReferenceException 的一些可能原因可能是:

  • 您不再在同一页面上,或者该页面可能在找到该元素后已刷新。
  • 该元素可能已被删除,然后再次添加到屏幕中,因为它最初是被定位的。
  • 元素可能位于 iframe 或其他已刷新的上下文中。

此用例

Cookie Clicker 游戏中,要连续单击 cookie,直到计数为 15,然后单击光标 - 15,您需要诱导 WebDriverWait 进行 element_to_be_clickable(),您可以使用以下定位器策略之一:

driver.get("https://orteil.dashnet.org/experiments/cookie/")
while True:
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='cookie']"))).click()
    money = int(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='money']"))).text)
    cursor_price = int(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='buyCursor']/b"))).text.split()[-1])
    if money > cursor_price:
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='buyCursor']/b"))).click()
        break
        

浏览器快照:

Cookie Clicker

评论

0赞 Aagam Shah 7/15/2023
我尝试在代码中添加等待,就像你说的那样。它比以前的尝试运行时间更长,但仍然引发了相同的异常。谢谢,但感谢您的回复!
0赞 Aagam Shah 7/15/2023
没关系,我通过忽略异常😂来强行运行它。尝试,除了是一颗宝石!
0赞 undetected Selenium 7/15/2023
很高兴能够帮助你