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

Selenium无法获取JavaScript网页游戏数据,求技术解决方案

解决Selenium定位Math Playground游戏元素失败的问题

问题根源

这款乘法拔河游戏的题目、选项都是SVG格式的图形元素,Selenium默认的定位逻辑没法直接识别SVG内的标签——你复制的XPath是针对HTML元素写的,但SVG属于独立的命名空间,直接用text、g这些标签名定位,Selenium会当成HTML元素查找,自然找不到匹配项。

解决办法

1. 适配SVG元素的XPath写法

定位SVG内的元素时,需要用local-name()指定标签名,避开命名空间问题。把你原来的XPath改成这种格式:

//*[@id="main"]//*[local-name()='g'][9]//*[local-name()='g'][1]//*[local-name()='g'][1]//*[local-name()='text'][3]

核心就是把每个SVG标签(比如g、text)替换成*[local-name()='标签名']的形式。

2. 修正后的代码示例

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

opt = Options()
opt.add_experimental_option("debuggerAddress", "127.0.0.1:8989")

# 路径前加r避免转义字符问题,chrome_options已废弃改用options参数
driver = webdriver.Chrome(executable_path=r"C:\Users\Owner\Desktop\Coding\chrome\chromedriver.exe", options=opt)

# 用等待确保元素加载完成,避免动态加载导致定位失败
wait = WebDriverWait(driver, 10)
question_element = wait.until(
    EC.visibility_of_element_located(
        (By.XPATH, '//*[@id="main"]//*[local-name()="g"][9]//*[local-name()="g"][1]//*[local-name()="g"][1]//*[local-name()="text"][3]')
    )
)
print(question_element.text)

# 定位四个选项的通用写法
options = driver.find_elements(By.XPATH, '//*[@id="main"]//*[local-name()="g"][contains(@transform, "translate")]//*[local-name()="text"]')
for option in options:
    print(option.text)

3. 额外提醒

  • 游戏元素是动态生成的,必须加WebDriverWait等待元素可见,否则容易出现定位失败;
  • 可以在浏览器开发者工具里,对着SVG元素右键复制「完整XPath」,再手动把SVG标签替换成*[local-name()='标签名']的形式,定位会更精准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:05:23