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

如何用Selenium从标签提取余额值?元素定位失败求助

如何用Selenium提取Stake页面的余额值?

我尝试从Stake日本站的速百家乐页面(https://stake.jp/casino/games/evolution-stake-exclusive-speed-baccarat-1)提取余额值,先后用了CLASS_NAME、XPATH、CSS_SELECTORS等多种元素定位方式,但都失败了,怀疑是定位路径错误。结合页面的HTML结构截图,希望能得到正确的余额获取方法。

我的函数代码:

def bet():
    driver.get(url="https://stake.jp/casino/games/evolution-stake-exclusive-speed-baccarat-1")
    time.sleep(2)
    driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[2]/div[4]/div/div/div/div[1]/div/div/div[2]/div/div/div[1]/div/div/div/div/div/div[1]/div/div[2]/button").click()
    time.sleep(2)
    # 以下是尝试过的定位方式(注释状态)
    # driver.find_element(By.CLASS_NAME/XPATH/CSS_SELECTOR, "定位值") # 三种方式选其一
    # 或者
    # WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CLASS_NAME, "class名称")))

使用driver.find_element()时的错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".balance"}

使用EC.presence_of_element_located()时的错误:

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, 
"/html/body/div[4]/div/div[2]/div/div/div[7]/div[3]/div/div/div[1]")))

  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\support\wait.py", line 90, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

问题排查与解决方法

1. 抛弃绝对XPATH,改用相对定位

你使用的绝对XPATH(如/html/body/div[1]/...)完全依赖页面DOM结构的层级,只要页面布局微调就会失效。从HTML截图来看,余额元素大概率带有balance相关类名,建议用以下更稳定的定位方式:

  • CSS选择器(优先推荐):
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 等待元素可见后获取
    balance_element = WebDriverWait(driver, 15).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, "div.balance"))
    )
    balance_value = balance_element.text
    
  • 相对XPATH:
    balance_element = WebDriverWait(driver, 15).until(
        EC.visibility_of_element_located((By.XPATH, "//*[contains(@class, 'balance') and not(contains(@class, 'hidden'))]"))
    )
    balance_value = balance_element.text
    

2. 检查是否存在iframe嵌套

Stake的游戏页面通常会将游戏内容嵌入iframe中,若余额元素在主页面而非游戏iframe内,需确保未误切换到iframe;若余额在iframe里,则必须先切换到对应iframe再定位:

# 切换到游戏iframe(需替换为实际iframe的id/name/定位器)
iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "game-frame"))
)
driver.switch_to.frame(iframe)

# 定位余额元素
balance_element = WebDriverWait(driver, 15).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, ".balance"))
)

# 操作完成后切回主页面
driver.switch_to.default_content()

3. 优化等待逻辑

不要用time.sleep()这种固定时长等待,它无法适配页面加载速度的波动。改用WebDriverWait结合visibility_of_element_located(确保元素可见,而非仅存在于DOM中),比presence_of_element_located更可靠。

4. 验证定位表达式正确性

用浏览器开发者工具(F12)快速验证你的定位是否有效:

  • 打开Console标签
  • 输入document.querySelector(".balance")(验证CSS选择器),或document.evaluate("你的XPATH", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue(验证XPATH)
  • 如果返回null,说明定位表达式错误,需要重新根据HTML结构调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:35:32