You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium WebDriver 4 Python:Cookie Clicker Bot遇StaleElementReferenceException

解决Cookie Clicker自动脚本的StaleElementReferenceException异常

不用更换浏览器,这个问题和浏览器无关,根源是页面DOM动态更新导致缓存的元素引用失效:你提前获取的clicker元素,在购买物品后页面会重新渲染部分DOM,旧的元素引用就变成了“过期状态”,后续调用点击就会抛出异常。

问题代码的核心问题

  • 提前缓存了clicker元素,没有考虑页面DOM更新的情况
  • 未处理金钱/价格文本中的逗号(当数值变大后会出现,直接转int会报错)
  • 没有等待元素加载的逻辑,极端情况下可能出现元素未就绪就操作的情况

修改后的代码

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

driver = webdriver.Chrome()
driver.get("https://orteil.dashnet.org/experiments/cookie/")

wait = WebDriverWait(driver, 10)

while True:
    # 每次循环重新定位饼干元素,避免过期引用
    cookie = wait.until(EC.presence_of_element_located((By.ID, "cookie")))
    cookie.click()
    
    # 获取当前金钱,处理带逗号的数值格式
    money_text = wait.until(EC.presence_of_element_located((By.ID, "money"))).text
    money = int(money_text.replace(",", ""))
    
    # 获取Cursor的价格,同样处理逗号
    cursor_btn = wait.until(EC.presence_of_element_located((By.ID, "buyCursor")))
    cursor_price_text = cursor_btn.find_element(By.TAG_NAME, "b").text.split()[-1]
    cursor_price = int(cursor_price_text.replace(",", ""))
    
    if money >= cursor_price:
        cursor_btn.click()

关键修改说明

  1. 每次循环重新定位元素:不再提前缓存元素引用,确保每次操作的都是当前DOM中有效的元素
  2. 显式等待元素加载:用WebDriverWait确保元素存在后再操作,避免因页面加载延迟导致的找不到元素问题
  3. 处理数值中的逗号:当金钱或价格超过1000时,文本会包含逗号,必须先移除才能转换为整数

内容的提问来源于stack exchange,提问作者Aagam Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:23:17