提问人:Aagam Shah 提问时间:7/14/2023 更新时间:7/15/2023 访问量:1175
使用 Python 的 Selenium Webdriver 4 - 过时元素引用异常(过时元素引用:未找到过时元素)
Selenium Webdriver 4 with Python - Stale Element Reference Exception (stale element reference: stale element not found)
问:
我正在为 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()
我应该尝试使用其他浏览器吗?
答:
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
浏览器快照:
评论
0赞
Aagam Shah
7/15/2023
我尝试在代码中添加等待,就像你说的那样。它比以前的尝试运行时间更长,但仍然引发了相同的异常。谢谢,但感谢您的回复!
0赞
Aagam Shah
7/15/2023
没关系,我通过忽略异常😂来强行运行它。尝试,除了是一颗宝石!
0赞
undetected Selenium
7/15/2023
很高兴能够帮助你
评论
click()