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
相关产品推荐
相关产品推荐

