Selenium WebDriver 4 Python:Cookie Clicker Bot遇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()
关键修改说明
- 每次循环重新定位元素:不再提前缓存元素引用,确保每次操作的都是当前DOM中有效的元素
- 显式等待元素加载:用
WebDriverWait确保元素存在后再操作,避免因页面加载延迟导致的找不到元素问题 - 处理数值中的逗号:当金钱或价格超过1000时,文本会包含逗号,必须先移除才能转换为整数
内容的提问来源于stack exchange,提问作者Aagam Shah
相关产品推荐
相关产品推荐

