Selenium3.x Python实现鼠标悬停的几种方法

本文介绍了使用Selenium库在Python中实现网页元素鼠标悬停效果的多种方法,包括使用move_to_element、调用JS方法、move_by_offset及move_to_element_with_offset等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博文章节


本机环境介绍

编码语言(Python3.6.2)

(py3env) C:\Users\XXX\iCloudDrive\PycharmProjects\SAT>python -V
Python 3.6.2

Selenium版本(3.7.0)

(py3env) C:\Users\XXX\iCloudDrive\PycharmProjects\SAT>pip show selenium
Name: selenium
Version: 3.7.0
Summary: Python bindings for Selenium

什么是“鼠标悬停”

当鼠标光标移到页面某元素上并停留,页面以文字、图片等形式弹出内容,当鼠标移开时,弹出内容消失。如百度首页以下样式:

鼠标悬停效果


通过”move_to_element”方法实现

# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

if __name__ == '__main__':
    chrome_driver_path = "C:\\Users/XXX\\iCloudDrive\\PycharmProjects\\SAT\\sat\\resource\\chromedriver.exe"
    driver = webdriver.Chrome(chrome_driver_path)
    driver.get('https://www.baidu.com/')
    driver.maximize_window()
    menu_xpath = "//a[text()='更多产品']"  # 更多产品XPATH
    more_menu = WebDriverWait(driver=driver, timeout=15).until(EC.visibility_of_element_located((By.XPATH, menu_xpath)))
    ActionChains(driver=driver).move_to_element(more_menu).perform()
    time.sleep(3)  # 仅为能达到悬停效果睡眠,可删除
    driver.quit()

通过调用JS方法实现

# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

if __name__ == '__main__':
    chrome_driver_path = "C:\\Users/zhenfeng.liu\\iCloudDrive\\PycharmProjects\\SAT\\sat\\resource\\chromedriver.exe"
    driver = webdriver.Chrome(chrome_driver_path)
    driver.get('https://www.baidu.com/')
    driver.maximize_window()
    js = """
        var evObj = document.createEvent('MouseEvents'); 
        evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        arguments[0].dispatchEvent(evObj);
    """
    menu_xpath = "//a[text()='更多产品']"
    more_menu = WebDriverWait(driver=driver, timeout=15).until(EC.visibility_of_element_located((By.XPATH, menu_xpath)))
    driver.execute_script(js, more_menu)
    time.sleep(3)
    driver.quit()

通过调用”move_by_offset”方法实现

此方法不常用,因为获取偏移量较为困难.

# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

if __name__ == '__main__':
    chrome_driver_path = "C:\\Users/XXX\\iCloudDrive\\PycharmProjects\\SAT\\sat\\resource\\chromedriver.exe"
    driver = webdriver.Chrome(chrome_driver_path)
    driver.get('https://www.baidu.com/')
    driver.maximize_window()
    ActionChains(driver=driver).move_by_offset(xoffset=1, yoffset=1).perform() # 相对当前位置的X/Y偏移量
    time.sleep(3)
    driver.quit()

通过调用”move_to_element_with_offset”方法实现

此方法不常用,因为获取偏移量较为困难.

# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

if __name__ == '__main__':
    chrome_driver_path = "C:\\Users/zhenfeng.liu\\iCloudDrive\\PycharmProjects\\SAT\\sat\\resource\\chromedriver.exe"
    driver = webdriver.Chrome(chrome_driver_path)
    driver.get('https://www.baidu.com/')
    driver.maximize_window()
    element = driver.find_element_by_name('tj_trnews')
    # 相比参照元素element的X/Y偏移量
    ActionChains(driver=driver).move_to_element_with_offset(to_element=element, xoffset=1, yoffset=1).perform()
    time.sleep(3)
    driver.quit()

拓展延伸

引用:JavaScript获取DOM元素位置和尺寸大小

<think>我们讨论的是如何用Python自动选择菜单选项。菜单选项通常出现在命令行界面(CLI)或图形用户界面(GUI)中。这里我将分别讨论两种情况: ### 1. 命令行菜单(文本界面) 在命令行中,菜单通常通过打印文本选项,然后等待用户输入选项编号或字母来选择。我们可以使用`input`函数获取用户输入,然后根据输入执行相应操作。 **示例:命令行菜单选择** ```python def menu(): print("1. 选项一") print("2. 选项二") print("3. 退出") choice = input("请选择: ") return choice # 自动选择选项2 # 由于input需要用户交互,我们可以通过重定向标准输入或使用模拟输入的方式来自动化 # 但在自动化测试或脚本中,我们可能希望直接调用相应的功能函数,而不是通过输入。 # 替代方案:设计可调用的函数字典 def option1(): print("执行选项一") def option2(): print("执行选项二") def exit_program(): print("退出程序") exit() menu_options = { &#39;1&#39;: option1, &#39;2&#39;: option2, &#39;3&#39;: exit_program } # 自动选择选项2 menu_options[&#39;2&#39;]() ``` 但是,如果菜单是第三方程序,我们无法修改其代码,则需要模拟输入。此时可以使用`subprocess`模块和管道。 ```python import subprocess # 假设有一个名为menu_app的程序,它显示菜单并等待输入 # 我们可以用以下方式自动选择选项2 p = subprocess.Popen([&#39;python&#39;, &#39;menu_app.py&#39;], stdin=subprocess.PIPE) p.communicate(input=b&#39;2\n&#39;) # 输入2然后回车 ``` ### 2. 图形界面(GUI)菜单 在图形界面中,菜单可能是窗口应用程序的一部分(如使用Tkinter, PyQt, 或Windows原生应用)。我们可以使用自动化工具来模拟键盘和鼠标操作。 #### 使用`pyautogui`模拟键盘选择菜单 例如,在菜单栏中,通常可以用Alt键激活菜单,然后通过方向键和回车选择。 ```python import pyautogui import time # 等待程序激活 time.sleep(2) # 模拟按下Alt键(有些菜单需要Alt激活,有些则不需要) pyautogui.press(&#39;alt&#39;) # 可能不需要,取决于具体应用 # 假设菜单项在第一个,按向下键选择第一个菜单项,然后按回车 pyautogui.press(&#39;down&#39;) # 按向下键(如果菜单是横向的,可能需要按右方向键展开子菜单) pyautogui.press(&#39;enter&#39;) # 回车选择 ``` #### 使用`pywinauto`(Windows GUI应用) 对于Windows应用程序,`pywinauto`库更强大,可以直接获取窗口控件并操作。 ```python from pywinauto import Application # 启动应用程序或连接到已有进程 app = Application(backend="uia").start("notepad.exe") # 以记事本为例 # 选择菜单项:文件->保存 app.Notepad.menu_select("文件->保存") # 或者通过键盘操作 app.Notepad.type_keys(&#39;%FS&#39;) # Alt+F打开文件菜单,然后S选择保存 ``` #### 使用`Selenium`(Web应用) 如果是Web应用中的菜单,可以使用Selenium。 ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("http://example.com") # 找到菜单元素并点击 menu = driver.find_element_by_id("menu") menu.click() # 或者通过键盘操作 actions = ActionChains(driver) actions.send_keys(Keys.ARROW_DOWN) # 向下键 actions.send_keys(Keys.ENTER) # 回车 actions.perform() ``` ### 总结 根据菜单所在的界面类型,选择不同的方法: - **命令行菜单**:修改程序内部调用或使用`subprocess`模拟输入。 - **图形界面菜单**:使用`pyautogui`模拟键盘,或使用`pywinauto`(Windows)或`Selenium`(Web)控制控件。 ### 注意事项 - 自动化操作时要注意目标窗口的激活状态。 - 图形界面的自动化可能因界面变化而失效,需考虑稳定性。 §§相关问题§§ 1. 如何在命令行界面中模拟用户输入选择菜单? 2. 如何自动化图形界面(GUI)应用程序的菜单选择? 3. 在Web应用中如何通过Python自动选择下拉菜单? 4. 如何确保自动化操作在目标窗口激活时执行?</think># Python实现自动选择菜单选项的方法Python实现自动选择菜单选项的功能,主要取决于菜单的类型(命令行菜单、图形界面菜单或系统级菜单)。以下是几种常见场景的实现方法: ## 1. 命令行菜单选择 对于文本界面的命令行菜单,可以使用`subprocess`模块模拟用户输入: ```python import subprocess # 启动目标程序 process = subprocess.Popen( [&#39;python&#39;, &#39;menu_program.py&#39;], # 替换为你的程序路径 stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True ) # 自动选择菜单选项 selections = [ &#39;2\n&#39;, # 选择第二个选项 &#39;1\n&#39;, # 在子菜单中选择第一个选项 &#39;q\n&#39; # 退出程序 ] for selection in selections: process.stdin.write(selection) process.stdin.flush() # 获取输出结果 output, _ = process.communicate() print("程序输出:\n", output) ``` ## 2. 图形界面菜单选择 对于GUI应用程序,可以使用`pyautogui`库模拟键盘操作: ```python import pyautogui import time # 等待目标窗口激活 time.sleep(2) # 模拟键盘操作选择菜单 pyautogui.press(&#39;down&#39;) # 向下选择菜单项 pyautogui.press(&#39;down&#39;) pyautogui.press(&#39;enter&#39;) # 确认选择 # 在子菜单中进行选择 pyautogui.press(&#39;right&#39;) # 打开子菜单 pyautogui.press(&#39;down&#39;) pyautogui.press(&#39;enter&#39;) ``` ## 3. 使用键盘库直接控制 对于需要精确控制的场景,可以使用`keyboard`库: ```python import keyboard import time def select_menu_item(selections): """自动选择菜单项 Args: selections (list): 选择序列,如[&#39;down&#39;, &#39;down&#39;, &#39;enter&#39;] """ for key in selections: keyboard.press_and_release(key) time.sleep(0.1) # 短暂延迟确保菜单响应 # 示例:选择第三个选项然后确认 select_menu_item([&#39;down&#39;, &#39;down&#39;, &#39;enter&#39;]) # 示例:使用快捷键 Alt+F 打开文件菜单 select_menu_item([&#39;alt+f&#39;, &#39;down&#39;, &#39;enter&#39;]) ``` ## 4. 基于界面元素的精确控制(Windows) 对于Windows应用程序,可以使用`pywinauto`库进行精确控制: ```python from pywinauto import Application import time # 启动应用程序 app = Application().start("notepad.exe") # 连接到应用程序窗口 main_window = app.window(title="无标题 - 记事本") # 打开菜单 main_window.menu_select("文件->打开") # 等待对话框出现 time.sleep(1) # 在打开对话框中选择文件类型 file_dialog = app.window(title="打开") file_dialog.ComboBox1.select("所有文件 (*.*)") # 输入文件名并打开 file_dialog.Edit1.set_text("example.txt") file_dialog["打开(&O)"].click() ``` ## 5. 网页菜单选择(使用Selenium) 对于网页中的菜单,可以使用Selenium自动化浏览器: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") # 定位菜单元素 menu = driver.find_element_by_id("main-menu") # 悬停打开菜单 ActionChains(driver).move_to_element(menu).perform() # 选择子菜单项 submenu = driver.find_element_by_link_text("选项1") submenu.click() # 或者使用键盘导航 driver.find_element_by_tag_name(&#39;body&#39;).send_keys(Keys.TAB * 3) # 切换到第三个菜单项 driver.find_element_by_tag_name(&#39;body&#39;).send_keys(Keys.ENTER) # 确认选择 ``` ## 注意事项 1. **窗口焦点**:确保目标窗口处于激活状态 2. **延迟处理**:在操作之间添加适当延迟(`time.sleep()`) 3. **跨平台兼容**: - Windows推荐使用`pywinauto` - macOS推荐使用`pyobjc`或`Applescript` - Linux推荐使用`xdotool`(通过`subprocess`调用) 4. **错误处理**:添加异常处理应对菜单变化或响应延迟 ```python import time from selenium.common.exceptions import NoSuchElementException def safe_menu_select(selector, max_retries=3): for _ in range(max_retries): try: element = driver.find_element_by_css_selector(selector) element.click() return True except NoSuchElementException: time.sleep(1) return False ``` ## 完整示例:自动选择系统菜单 ```python import pyautogui import time import subprocess def automate_system_menu(): # 打开开始菜单 pyautogui.press(&#39;win&#39;) time.sleep(0.5) # 输入程序名称 pyautogui.write(&#39;cmd&#39;) time.sleep(1) # 打开命令提示符 pyautogui.press(&#39;enter&#39;) time.sleep(2) # 在命令提示符中输入命令 pyautogui.write(&#39;dir /w&#39;) pyautogui.press(&#39;enter&#39;) time.sleep(1) # 关闭命令提示符 pyautogui.write(&#39;exit&#39;) pyautogui.press(&#39;enter&#39;) if __name__ == "__main__": automate_system_menu() ``` 根据你的具体需求选择合适的方案,命令行界面推荐使用`subprocess`,图形界面推荐使用`pyautogui`或`pywinauto`,网页界面推荐使用Selenium[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值