前戏
上篇文章说了selenium里的鼠标事件,在自动化中,键盘事件也是非常重要的,比如我们需要按回车键,ctrl+c复制等等操作,都离不开键盘事件,在selenium中,提供了Keys方法来供我们操作键盘
Keys
使用键盘完成复制,剪切,粘贴的功能
# 在百度搜索框输入 python ,复制粘贴搜狗输入框进行搜索 from selenium import webdriver from selenium.webdriver.common.keys import Keys from time import sleep driver = webdriver.Chrome() driver.get('http://www.baidu.com') driver.maximize_window() driver.find_element_by_css_selector('#kw').send_keys('python') sleep(2) driver.find_element_by_css_selector('#kw').send_keys(Keys.CONTROL, 'a') # 全选 driver.find_element_by_css_selector('#kw').send_keys(Keys.CONTROL, 'c') # 复制 driver.find_element_by_css_selector('#kw').send_keys(Keys.CONTROL, 'x') # 剪切 sleep(2) driver.get('http://www.sogou.com') driver.find_element_by_css_selector('.sec-input').send_keys(Keys.CONTROL, 'v') # 粘贴 sleep(2) driver.find_element_by_css_selector('#stb').click() sleep(2) driver.quit()
常用的按键
View Code
例子2
from selenium import webdriver import unittest, time from selenium.webdriver.common.keys import Keys class Test_dragpage(unittest.TestCase): def test_dragpageElement(self): url = 'http://www.sogou.com' self.driver = webdriver.Chrome() self.driver.get(url) self.driver.maximize_window() query = self.driver.find_element_by_id('query') # 通过WebDriver发送一个f12键 query.send_keys(Keys.F12) time.sleep(5) # 在按次f12 query.send_keys(Keys.F12) query.send_keys('selenium') # 按回车 query.send_keys(Keys.ENTER) time.sleep(3) test1 = Test_dragpage() test1.test_dragpageElement()
通过WebDriver内建的模块模拟组合键
from selenium import webdriver import unittest, time from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys class Test_dragpage(unittest.TestCase): def test_dragpageElement(self): url = 'http://www.baidu.com' self.driver = webdriver.Chrome() self.driver.get(url) input = self.driver.find_element_by_id('kw') input.send_keys('python') ActionChains(self.driver).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() time.sleep(2) ActionChains(self.driver).key_down(Keys.CONTROL).send_keys('x').key_up(Keys.CONTROL).perform() self.driver.get(url) self.driver.find_element_by_id('kw').click() ActionChains(self.driver).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform() self.driver.find_element_by_id('su').click() test1 = Test_dragpage() test1.test_dragpageElement()
ActionChains(self.driver).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform(),这行代码中,key_down(Keys.CONTROL)表示按下ctrl键,send_keys('v')类似模拟了V键,组合起来就是Ctrl+v,而key_down(Keys.CONTROL)表示释放Ctrl键
通过第三方库进行操作
需要安装pywin32
键盘映射表
View Code
import win32api import win32con class KeyboardKeys(object): #模拟键盘按键类 VK_CODE={ 'enter':0x0D, 'ctrl':0x11, 'v':0x56 } @staticmethod def keyDown(keyName): #按下按键 win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,0,0) @staticmethod def keyUp(keyName): #释放按键 win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,win32con.KEYEVENTF_KEYUP,0) @staticmethod def oneKey(key): #模拟单个按键 KeyboardKeys.keyDown(key) KeyboardKeys.keyUp(key) @staticmethod def twoKeys(key1,key2): #模拟两个组合键 KeyboardKeys.keyDown(key1) KeyboardKeys.keyDown(key2) KeyboardKeys.keyUp(key2) KeyboardKeys.keyUp(key1)
Keybd_event()共有四个参数:
第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);
第二个参数为扫描码,一般不用设置,用0代替就行;
第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";
第四个参数一般也是置0即可。
调用
KeyboardKeys.oneKey('enter')
设置剪贴板
在进行自动化的时候,有时候要上传一个文件,这时会打开一个wins的窗口,但是selenium没有给我们提供操作wins窗口的方法,我们就要使用pywin32提供给我们的方法来操作
import win32clipboard as w import win32con class Clipboard(object): #模拟windows设置剪贴板 #读取剪贴板 @staticmethod def getText(): #打开剪贴板 w.OpenClipboard() #获取剪贴板中的数据 d=w.GetClipboardData(win32con.CF_TEXT) #关闭剪贴板 w.CloseClipboard() #返回剪贴板数据给调用者 return d #设置剪贴板内容 @staticmethod def setText(aString): #打开剪贴板 w.OpenClipboard() #清空剪贴板 w.EmptyClipboard() #将数据aString写入剪贴板 w.SetClipboardData(win32con.CF_UNICODETEXT,aString) #关闭剪贴板 w.CloseClipboard()
调用
Clipboard.setText(filePath)