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

页面同类型多元素定位及Satoshi Mines炸弹检测问题排查

看起来你遇到的核心问题是没有把元素查找范围限定在当前游戏的DOM容器内,导致机器人把历史游戏的炸弹也当成了当前游戏的。下面是几个针对性的解决思路,都是做网页自动化时常用的实用方案:

一、锁定当前游戏的专属DOM容器(最关键)

这是解决历史记录干扰的根本办法。你需要先打开浏览器开发者工具(F12),仔细对比当前游戏和历史游戏的DOM结构:

  • 找当前游戏容器的唯一标识:比如是否有active、current这类专属类名?或者带有data-game-id属性且值为最新游戏ID?比如可能是<div class="game-box current" data-game-id="12345">。
  • 一旦找到这个容器,所有后续的炸弹查找都只在这个容器内部进行,而不是遍历整个页面。比如用Selenium的话,先定位这个容器元素,再调用它的find_elements方法,而非直接用全局的driver.find_elements。

举个Python Selenium的代码示例:

# 定位当前游戏的容器(根据实际DOM调整选择器)
current_game = driver.find_element(By.CSS_SELECTOR, 'div.game-container.current')
# 只在当前游戏容器内查找炸弹元素
current_bombs = current_game.find_elements(By.CSS_SELECTOR, '.cell.bomb')

这样就能完全隔离历史游戏的元素,不会再出现误判。

二、处理WebElement缓存问题

你提到的清除缓存思路是对的,但更准确的做法是不要复用旧的元素引用:

  • 每次新游戏开始时(比如你触发了"New Game"按钮后),重新定位当前游戏的容器,不要用之前保存的WebElement对象。旧的引用可能指向历史游戏的DOM节点,即使页面更新了,旧对象也会失效。
  • 避免全局存储元素变量,比如不要在脚本开头就把所有游戏容器存在一个列表里,而是每次需要操作当前游戏时,实时去获取最新的容器。
三、精准区分当前/历史游戏的元素

如果容器标识不够明显,还可以通过元素的状态属性来过滤:

  • 历史游戏的炸弹可能带有game-ended、inactive这类类名,而当前游戏的炸弹(未触发时)可能只有bomb类,触发后才会添加revealed类。用更精确的选择器,比如.current-game .cell.bomb.revealed,只找当前游戏中已触发的炸弹。
  • 结合游戏状态判断:当前游戏的状态(比如"In Progress"、"Lost")会显示在容器内的某个节点,只有当状态是"In Progress"且存在已触发的炸弹时,才判定当前游戏失败。
四、多同类型元素的定位技巧

针对页面有多个同类型元素的问题,除了基于容器的查找,还有这些方法:

  • 层级选择器:用CSS选择器的层级关系,比如div.current-game > .cell-grid > .cell,直接定位当前游戏下的单元格,避免选中其他游戏的元素。
  • 属性过滤:如果元素有唯一属性(比如data-cell-index、data-game-id),可以用属性选择器精准定位,比如[data-game-id="current-game-id"] .cell.bomb。
  • 动态索引:如果当前游戏总是页面中最后一个游戏容器,可以用:last-child伪类,比如div.game-container:last-child,但这个不如专属标识可靠,因为页面结构可能变化。

最后建议你先花时间摸清楚页面的DOM结构,找到当前游戏的唯一特征——这是所有解决方案的基础。只要把查找范围限定在当前游戏容器内,历史记录的干扰就彻底解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:11