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

Selenium提取Garmin Connect元素值异常:HTML与输出不符排查

问题排查:Selenium提取Garmin活动日期异常

代码片段

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import login as login
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import datetime

x = datetime.datetime.now()
x = x.strftime("%b %d")

driver = browser = webdriver.Firefox()
driver.get("https://connect.garmin.com/modern/activities")

driver.implicitly_wait(2)

iframe = driver.find_element(By.ID, "gauth-widget-frame-gauth-widget")
driver.switch_to.frame(iframe)

driver.find_element("name", "username").send_keys(login.username)

driver.find_element("name", "password").send_keys(login.password)
driver.find_element("name", "password").send_keys(Keys.RETURN)

driver.switch_to.default_content()

driver.implicitly_wait(10)

driver.find_element("name", "search").send_keys("Reading")
driver.find_element("name", "search").send_keys(Keys.RETURN)

#element = driver.find_element(By.CLASS_NAME, "unit")
element = driver.find_element(By.XPATH, "//html/body/div[1]/div[3]/div[2]/div[3]/div/div/div[2]/ul/li/div/div[2]/span[1]")
print(element.text)

问题描述

我用这段代码从Garmin Connect活动页面提取日期数据,目标元素的HTML文本是Aug 25,但运行代码后打印输出的却是Sep 10,且手动检查页面HTML时找不到任何文本为Sep 10的元素,需要排查问题以提取正确数据。

排查步骤

  • 替换隐式等待为显式等待:代码同时混用了隐式等待和显式等待库,但未正确使用显式等待。页面加载、搜索结果渲染需要稳定的等待逻辑,建议全部替换为显式等待,确保目标元素完全加载后再提取:

    # 替换原有的driver.implicitly_wait(10)及后续元素查找代码
    WebDriverWait(driver, 15).until(
        EC.visibility_of_element_located((By.XPATH, "//html/body/div[1]/div[3]/div[2]/div[3]/div/div/div[2]/ul/li/div/div[2]/span[1]"))
    )
    element = driver.find_element(By.XPATH, "//html/body/div[1]/div[3]/div[2]/div[3]/div/div/div[2]/ul/li/div/div[2]/span[1]")
    
  • 优化XPATH定位逻辑:当前使用的绝对XPATH极易受页面结构变化影响,建议改用相对路径,结合活动名称与日期元素的关联关系定位,比如:

    # 定位标题包含"Reading"的活动对应的日期元素
    element = driver.find_element(By.XPATH, "//li[contains(.//div[@class='activity-name'], 'Reading')]//span[contains(@class, 'unit')]")
    
  • 验证代码获取的页面内容:在提取元素前,将当前页面源码保存为本地文件,对比手动查看的页面与代码实际获取的页面是否一致:

    with open("garmin_page.html", "w", encoding="utf-8") as f:
        f.write(driver.page_source)
    

    打开生成的HTML文件,搜索Sep 10和Aug 25,确认代码视角下的页面内容。

  • 检查元素定位的唯一性:改用find_elements获取所有匹配的元素,逐个打印文本,确认是否定位到了隐藏或视野外的元素:

    elements = driver.find_elements(By.XPATH, "//html/body/div[1]/div[3]/div[2]/div[3]/div/div/div[2]/ul/li/div/div[2]/span[1]")
    print(f"共找到{len(elements)}个匹配元素")
    for idx, el in enumerate(elements):
        print(f"元素{idx}文本:{el.text}")
    
  • 确认iframe切换状态:登录后页面可能存在其他嵌套iframe,切换回默认内容后,检查当前上下文是否为活动列表所在的页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:10:25