selenium使用ActionChains模拟鼠标键盘操作
ActionChains介绍
ActionChains是一种自动化低级交互的方法,如鼠标移动、鼠标按钮操作、键盘按键和上下文菜单交互等。这对于执行更复杂的操作(如悬停和拖放)非常有用。
生成用户动作的过程:
-
创建ActionChains对象
actions = webdriver.ActionChains(driver),初始化会创建一个动作列表 -
调用ActionChains对象的动作方法
这些动作actions会存储在ActionChains的队列中
-
调用perform执行动作
调用perform依次执行存放在队列中的动作
ActionChains 可以用于链模式:
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
也可以将动作一个个排列再执行:
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()
ActionChains方法列表
| 动作 | 功能 |
|---|---|
| perform() | 执行所有已保存的动作 |
| reset_actions() | 清空所有已保存的动作 |
| click(on_element=None) | 点击某个元素,默认在鼠标当前位置点击 |
| click_and_hold(on_element=None) | 点击鼠标左键,不释放 |
| context_click(element) | 点击鼠标右键 |
| double_click(element) | 双击鼠标左键 |
| drag_and_drop(source, target) | 将source元素拖拽至target元素 |
| drag_and_drop_by_offset(source, xoffset, yoffset) | 将source元素拖拽至指定偏移量的位置 |
| key_down(value, element=None) | 按下按键(Control, Alt 或 Shift),不释放 |
| key_up(value, element=None) | 松开按键(Control, Alt 或 Shift) |
| move_by_offset(xoffset, yoffset) | 将鼠标移动给定的偏移量 |
| move_to_element(to_element) | 将鼠标移到元素的中间 |
| move_to_element_with_offset(to_element, xoffset, yoffset) | 将鼠标移动到距元素左上角给定偏移量的位置 |
| pause(seconds) | 在指定时间内暂停输入 |
| release(on_element=None) | 释放按下的鼠标 |
| send_keys(*keys_to_send) | 发送某些键到当前焦点的元素 |
| send_keys_to_element(element, *keys_to_send) | 发送某些键到指定元素 |
键盘操作
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
search = driver.find_element(By.NAME, "wd")
search.send_keys("webdriver", Keys.ENTER)
按下按键 keyDown
keyDown用于模拟按下辅助按键(CONTROL, SHIFT, ALT)的动作
"""key_down 按下按键"""
action = webdriver.ActionChains(driver)
# 按下 'Control + A' 选中页面
action.key_down(Keys.CONTROL).send_keys("a").perform()
松开按键 KeyUp
keyUp用于模拟辅助按键(CONTROL, SHIFT, ALT)弹起或释放的操作
"""key_up 松开按键"""
action = webdriver.ActionChains(driver)
# 输入 QWERTYqwerty
action.key_down(Keys.SHIFT).send_keys_to_element(search, "qwerty").key_up(Keys.SHIFT).send_keys("qwerty").perform()
清空 Clear
clear清除可编辑元素的内容
search.send_keys("selenium")
time.sleep(3)
search.clear()
鼠标操作
移动鼠标 moveToElement
将鼠标移到元素的中间
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 找到 "更多" 元素
moreLink = driver.find_element_by_link_text("更多")
# 移动鼠标至 "更多"
action = webdriver.ActionChains(driver)
action.move_to_element(moreLink).perform()
冻结页面(动态显示)
百度默认页面:

鼠标悬浮在“更多”上时,才会显示更多选项:

在浏览器console对话框中输入js代码,表示在5000ms后,执行debugger命令:
setTimeout(function(){debugger}, 5000)
进入debug状态,在5000ms内将鼠标移动至“更多”,即可冻结页面,再进行HTML操作。

浙公网安备 33010602011771号