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

Selenium中move_to_element失效,如何点击悬停显示的链接?

解决鼠标悬停才显示的链接点击问题

针对你遇到的move_to_element方法无效、必须手动移动鼠标才能点击目标链接的情况,以下是几种可行的替代方案:

1. 用JavaScript直接触发点击

很多hover显示的元素本质是CSS控制显示状态,直接通过JS执行点击可以绕过hover的前置要求,不需要模拟鼠标移动:

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

driver = webdriver.Chrome()
driver.get('https://datahub.ren.pt/en/electricity/monthly-balance/')
driver.maximize_window()

# 等待目标链接加载完成(用presence_of_element_located比clickable更稳妥,因为元素一开始是隐藏的)
target_link = WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((By.XPATH, '/html/body/main/section[3]/div/div/div[1]/div/div[2]/div/div[1]/a[1]'))
)
# 调用JavaScript执行点击
driver.execute_script("arguments[0].click();", target_link)

driver.close()

2. 强制修改CSS让元素显示

如果目标链接是因为display: none或visibility: hidden被隐藏,先通过JS修改它的样式强制显示,再进行点击:

# 接上面的代码,找到target_link后
driver.execute_script("arguments[0].style.display = 'block'; arguments[0].style.visibility = 'visible';", target_link)
target_link.click()

3. 分步模拟完整的hover流程

有时候move_to_element失效是因为没有完整模拟鼠标悬停的全部动作,可以尝试先定位到触发hover的父按钮,分步模拟移动、停留、再点击:

from selenium.webdriver.common.action_chains import ActionChains

# 先找到需要悬停的父按钮(替换成实际的按钮定位器,比如By.CLASS_NAME或相对XPATH)
hover_trigger = WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((By.XPATH, '替换为触发hover的按钮XPATH'))
)

# 模拟鼠标移动到按钮→短暂停留→移动到链接→点击
action = ActionChains(driver)
action.move_to_element(hover_trigger).pause(0.5).move_to_element(target_link).click().perform()

额外提示

  • 尽量不要用绝对XPATH(比如/html/body/...),这种定位方式极易受页面结构变化影响,建议改用相对定位,比如通过元素的class属性、data属性或者文本内容来定位。
  • 如果页面包含iframe,需要先切换到对应iframe再操作元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:10:11