Backgroud:
用selenium做自动化,有时候会遇到需要模拟鼠标键盘操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽、复制、粘贴、删除等等。
一、鼠标事件
Selenium提供了一个类来处理鼠标事件——ActionChains
from selenium.webdriver import ActionChains
# selenium.webdriver.common.action_chains.ActionChains(driver)
这个类基本能够满足所有对鼠标操作的需求。
1. ActionChains基本用法
当调用ActionChains
的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当调用perform()
方法时,队列中的时间才会依次执行。
这种情况下可以有两种调用方法:
- 链式写法:
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
link_text = self.driver.find_element_by_link_text('新闻')
ActionChains(driver).move_to_element(link_text).click(hidden_submenu).perform()
- 分步写法:
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
link_text = self.driver.find_element_by_link_text('新闻')
actions = ActionChains(self.driver)
actions.move_to_element(link_text)
actions.click(link_text)
actions.perform()
2. ActionChains方法列表
# | 方法 | 方法描述 |
---|---|---|
1 | click(on_element=None) | 单击鼠标左键 |
2 | click_and_hold(on_element=None) | 点击鼠标左键,不松开 |
3 | context_click(on_element=None) | 点击鼠标右键 |
4 | double_click(on_element=None) | 双击鼠标左键 |
5 | drag_and_drop(source, target) | 拖拽到某个元素然后松开 |
6 | drag_and_drop_by_offset(source, xoffset, yoffset) | 拖拽到某个坐标然后松开 |
7 | key_down(value, element=None) | 按下某个键盘上的键 |
8 | key_up(value, element=None) | 松开某个键 |
9 | move_by_offset(xoffset, yoffset) | 鼠标从当前位置移动到某个坐标 |
10 | move_to_element(to_element) | 鼠标移动到某个元素 |
11 | move_to_element_with_offset(to_element, xoffset, yoffset) | 移动到距某个元素(左上角坐标)多少距离的位置 |
12 | perform() | 执行链中的所有动作 |
13 | release(on_element=None) | 在某个元素位置松开鼠标左键 |
14 | send_keys(*keys_to_send) | 发送某个键到当前焦点的元素 |
15 | send_keys_to_element(element, *keys_to_send) | 发送某个键到指定元素 |
二、键盘事件
模拟键盘的操作需要先导入键盘模块:
from selenium.webdriver.common.keys import Keys
# selenium.webdriver.common.keys.Keys
Keys()
类提供了键盘上几乎所有按键的方法。send_keys()
方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键, 如 Ctrl+A、 Ctrl+C 等。
1. 普通键
对于普通键盘,使用sendKeys(keysToSend)就可以实现,比如按键TAB、Backspace等。
send_keys(Keys.BACK_SPACE) #删除键(BackSpace)
send_keys(Keys.SPACE) #空格键(Space)
send_keys(Keys.TAB) #制表键(Tab)
send_keys(Keys.ESCAPE) #回退键(Esc)
send_keys(Keys.ENTER) #回车键(Enter)
send_keys(Keys.F1) #键盘 F1
2. 修饰键(Modifier keys)
修饰键是键盘上的一个或者一组特别的键,当它与一般按键同时使用的时候,用来临时改变一般键盘的普通行为。对于单独按下修饰键本身一般不会触发任何键盘事件。正常有以下几个修饰键:Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)。
ActionChains(self.driver).keyDown(Keys.CONTROL);// 按下 Ctrl 键
ActionChains(self.driver).keyDown(Keys.SHIFT);// 按下 Shift 键
ActionChains(self.driver).keyDown(Key.ALT);// 按下 Alt 键
ActionChains(self.driver).keyUp(Keys.CONTROL);// 释放 Ctrl 键
ActionChains(self.driver).keyUp(Keys.SHIFT);// 释放 Shift 键
ActionChains(self.driver).keyUp(Keys.ALT);// 释放 Alt 键
3. 常见组合键操作:
send_keys(Keys.COMMAND,‘a’) #全选(COMMAND+A)
send_keys(Keys.COMMAND,‘c’) #复制(COMMAND+C)
send_keys(Keys.COMMAND,‘x’) #剪切(COMMAND+X)
send_keys(Keys.COMMAND,‘v’) #粘贴(COMMAND+V)
# key_down(Keys.COMMAND)表示按下Command键,send_keys('v')类似模拟了V键,组合起来就是Command+v,而key_down(Keys.COMMAND)表示释放Command键
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('a').key_up(Keys.COMMAND).perform()
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('x').key_up(Keys.COMMAND).perform()
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('v').key_up(Keys.COMMAND).perform()
# Alt+F4 来关闭当前的活动窗口
ActionChains(self.driver).keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform()
Note: ActionChains(self.driver).keyDown(theKey)
方法的调用,如果没有显示的调用 keyUp(theKey)
或者 sendKeys(Keys.NULL)
来释放的话,这个按键将一直保持按住状态
实例Code:
from selenium import webdriver
from time import sleep
# http://sahitest.com/demo/
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.remote.webelement import WebElement
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
# 鼠标操作
def test_mouse(self):
self.driver.get('http://sahitest.com/demo/clicks.htm')
# 鼠标双击
double_click_btn = self.driver.find_element_by_xpath('/html/body/form/input[2]')
ActionChains(self.driver).double_click(double_click_btn).perform()
sleep(2)
# 鼠标单击
single_click_btn = self.driver.find_element_by_xpath('/html/body/form/input[3]')
ActionChains(self.driver).click(single_click_btn).perform()
## self.driver.find_element_by_xpath('/html/body/form/input[3]').click()
sleep(2)
# 鼠标右击
right_click_btn = self.driver.find_element_by_xpath('/html/body/form/input[4]')
ActionChains(self.driver).context_click(right_click_btn).perform()
sleep(2)
# 键盘操作
def test_keyboard(self):
self.driver.get('http://www.baidu.com')
kw = self.driver.find_element_by_id('kw')
kw.send_keys("selenium")
# 使用键盘全选 command+A
kw.send_keys(Keys.COMMAND, 'a')
sleep(2)
# 使用键盘剪贴 command+X
kw.send_keys(Keys.COMMAND, 'x')
sleep(2)
# 使用键盘粘贴 command+V
kw.send_keys(Keys.COMMAND, 'v')
sleep(2)
# 鼠标移动到某个元素
ActionChains(self.driver).move_to_element(self.driver.find_element_by_link_text('百度首页')).perform()
sleep(2)
self.driver.quit()
# 模拟键盘组合键
def test_keyboard2(self):
self.driver.get('http://www.baidu.com')
input = self.driver.find_element_by_id('kw')
input.send_keys('python')
# 表示按下command键,send_keys('a')类似模拟了A键,组合起来就是Command+A,而key_down(Keys.COMMAND)表示释放Command键
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('a').key_up(Keys.COMMAND).perform()
sleep(2)
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('x').key_up(Keys.COMMAND).perform()
sleep(2)
self.driver.find_element_by_id('kw').click()
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('v').key_up(Keys.COMMAND).perform()
self.driver.find_element_by_id('su').click()
sleep(2)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
# case.test_mouse()
case.test_keyboard()
case.test_keyboard2()