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

如何使用Selenium与里约热内卢COVID-19数据看板的页面元素交互

问题原因

你遇到的StaleElementReferenceException报错核心原因有三个:

  1. 你使用了超长的绝对路径XPath定位元素,只要页面动态渲染时DOM结构发生微小调整,定位逻辑就会失效
  2. 地图属于异步加载的嵌入式组件,你切换iframe后没有等待组件完全渲染完成就直接定位元素,拿到的元素引用已经被后续的DOM刷新覆盖了
  3. 你复用了之前初始化的ActionChains实例,切换iframe后上下文变更,之前的实例会出现状态异常

解决方法

1. 基础逻辑优化

首先替换硬等待time.sleep()为显式等待,定位元素优先使用属性匹配替代绝对XPath,切换iframe后重新初始化ActionChains:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 切换iframe前先等iframe加载完成
wait = WebDriverWait(driver, 15)
iframe = wait.until(EC.presence_of_element_located((By.XPATH, "//section[@class='mainSection']//div[@id='dossierContainer1']/iframe")))
driver.switch_to.frame(iframe)
# 切换后重新初始化ActionChains,避免上下文异常
action = ActionChains(driver)

2. 地图放大操作(两种稳定方案)

该页面用的是SAS Visual Analytics组件,以下方案均适配该组件特性:

方案一:点击放大按钮

放大按钮的aria-label属性固定为Ampliar(葡萄牙语“放大”),用属性匹配定位稳定度远高于绝对路径XPath:

# 等待放大按钮可点击
zoom_in_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@aria-label='Ampliar']")))
# 多次点击可以持续放大,次数按需调整
for _ in range(3):
    zoom_in_btn.click()
    time.sleep(0.5)

如果需要拖拽地图,直接定位地图容器后用ActionChains拖拽即可:

map_container = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'va-map')]")))
# 拖拽示例:按住从坐标(100,100)拖到(300,300),偏移量按需调整
action.click_and_hold(map_container).move_by_offset(200, 200).release().perform()

方案二:模拟滚轮放大(兼容性更强,不需要找放大按钮)

直接把鼠标移到地图上模拟滚轮滚动,不需要依赖按钮元素的定位:

map_container = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'va-map')]")))
action.move_to_element(map_container).perform()
# 向上滚3次放大,向下滚就是缩小,次数按需调整
for _ in range(3):
    action.scroll_by_amount(0, 100).perform()
    time.sleep(0.5)

3. 下载数据操作

红色圈注的下载按钮aria-label为Exportar(葡萄牙语“导出”),同样用属性匹配定位即可:

export_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@aria-label='Exportar']")))
# 常规点击无响应可以用JS强制触发点击
driver.execute_script("arguments[0].click();", export_btn)
# 如果有后续弹窗选择下载格式,继续加显式等待逻辑处理即可

补充说明

所有iframe内的操作完成后如果需要操作主页面元素,记得调用driver.switch_to.default_content()切回主DOM上下文,该需求完全可以通过现有方案实现,不需要额外依赖其他工具。

内容的提问来源于stack exchange,提问作者Marcos Verissimo Alves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:15:03