模拟键盘键盘和鼠标操作主要使用到selenium的keys包,源码如下
class Keys(object): """ Set of special keys codes. """ NULL = 'ue000' CANCEL = 'ue001' # ^break HELP = 'ue002' BACKSPACE = 'ue003' BACK_SPACE = BACKSPACE TAB = 'ue004' CLEAR = 'ue005' RETURN = 'ue006' ENTER = 'ue007' SHIFT = 'ue008' LEFT_SHIFT = SHIFT CONTROL = 'ue009' LEFT_CONTROL = CONTROL ALT = 'ue00a' LEFT_ALT = ALT PAUSE = 'ue00b' ESCAPE = 'ue00c' SPACE = 'ue00d' PAGE_UP = 'ue00e' PAGE_DOWN = 'ue00f' END = 'ue010' HOME = 'ue011' LEFT = 'ue012' ARROW_LEFT = LEFT UP = 'ue013' ARROW_UP = UP RIGHT = 'ue014' ARROW_RIGHT = RIGHT DOWN = 'ue015' ARROW_DOWN = DOWN INSERT = 'ue016' DELETE = 'ue017' SEMICOLON = 'ue018' EQUALS = 'ue019' NUMPAD0 = 'ue01a' # number pad keys NUMPAD1 = 'ue01b' NUMPAD2 = 'ue01c' NUMPAD3 = 'ue01d' NUMPAD4 = 'ue01e' NUMPAD5 = 'ue01f' NUMPAD6 = 'ue020' NUMPAD7 = 'ue021' NUMPAD8 = 'ue022' NUMPAD9 = 'ue023' MULTIPLY = 'ue024' ADD = 'ue025' SEPARATOR = 'ue026' SUBTRACT = 'ue027' DECIMAL = 'ue028' DIVIDE = 'ue029' F1 = 'ue031' # function keys F2 = 'ue032' F3 = 'ue033' F4 = 'ue034' F5 = 'ue035' F6 = 'ue036' F7 = 'ue037' F8 = 'ue038' F9 = 'ue039' F10 = 'ue03a' F11 = 'ue03b' F12 = 'ue03c' META = 'ue03d' COMMAND = 'ue03d'
模拟键盘操作
对元素定位后使用send_keys就可以模拟键盘输入了
from time import sleep from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com") el = driver.find_element_by_id("kw") el.send_keys("selenium") el.send_keys(Keys.CONTROL + 'a') # ctrl+a,全选 sleep(1) el.send_keys(Keys.CONTROL + 'c') # ctrl+c,复制 sleep(1) el.send_keys(Keys.CONTROL + 'v') # ctrl+v,粘贴 el.send_keys(Keys.CONTROL, 'v') # + 和 , 同样效果 sleep(1) el.send_keys(Keys.BACKSPACE) # 退格健,删除文字
键盘不止上面的操作,Keys中均能组合使用。
模拟鼠标操作
1、行为控制
- perform --- 执行所有准备好的Action
- reset_actions --- 清空所有准备好的Action # 该方法在 selenium 3.141.0版本不生效
- pause --- 设置Action之间的动作时间间隔
2、鼠标操作
- click --- 鼠标左键点击(可以指定或不指定元素对象)
- click_and_hold --- 鼠标左键点击但不释放(可以指定或不指定元素对象)
- release --- 释放鼠标点击动作(可以指定或不指定在目标元素对象上释放)
- context_click --- 鼠标右键点击(可以指定或不指定元素对象)
- double_click --- 鼠标左键双击(可以指定或不指定元素对象)
- drag_and_drop --- 鼠标左键在两个元素之间拖拽
- drag_and_drop_by_offset --- 鼠标左键拖拽元素到目标偏移位置
- move_by_offset --- 鼠标移动指定偏移
- move_to_element --- 鼠标移动到指定元素
- move_to_element_with_offset --- 鼠标移动到指定元素的指定偏移位置
在使用ActionChains类下面的方法之前,需要先引入ActionChains类
from selenium.webdriver import ActionChains
需要注意的是在实例化ActionChains类对象时需要把webdriver的实例对象当参数传入。
ActionChains用于模拟用户的行为,所有的行为都存储在actionchains对象上,再通过perform()执行所有ActionChains中存储的行为。
perform()同样也是ActionChains类提供的方法,通常与ActionChains()配合使用。
3、键盘操作
key_down --- 键盘按下
key_up --- 键盘释放
send_keys --- 向当前元素发送模拟按键
send_keys_to_element --- 向指定元素发送模拟按键
鼠标操作综合练习
import time from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com") actionChains = ActionChains(driver) time.sleep(2) # 单击鼠标左键, el = driver.find_element_by_xpath('//*[@id="u1"]/a') actionChains.click(el).perform() actionChains.reset_actions() # reset_actions在selenium 3.141.0 版本不生效。预期清空保存在actionChains中的行为,但是实际没有清空。后面的操作都会重复执行前面加入的操作 time.sleep(2) el = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_4__closeBtn"]') actionChains.click(el).perform() time.sleep(5) # 双击鼠标左键 el = driver.find_element_by_xpath('//*[@id="hotsearch-refresh-btn"]') actionChains.double_click(el).perform() time.sleep(2) # 鼠标悬浮 el = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]') actionChains.move_to_element(el).perform() time.sleep(2) # 单击鼠标右键 el = driver.find_element_by_id("kw") actionChains.context_click(el).perform() actionChains.release().perform() time.sleep(2)
实际使用过程中,发现很多健模拟不了,比如F5,F12。