前言
在UI自动化测试的时候,可能会遇到键盘按键的组合操作,比如ctrl+c,ctrl+v等,类似于我们手动操作的快捷键。可以有两种方式实现:一种是selenium中自带的ActionChains结合Keys;另外一种是使用系统的win32api。
代码示例
方法一:ActionChains+Keys
#encoding=utf-8
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time
#启动chrome浏览器
driver = webdriver.Chrome(executable_path="f:\\chromedriver")
#访问百度首页
driver.get("http://www.baidu.com")
#定位到搜索输入框,并输入"陈伟霆"
driver.find_element_by_id("kw").send_keys("陈伟霆")
time.sleep(1)
#模拟ctrl+a,全选
ActionChains(driver).key_down(Keys.CONTROL).send_keys('a').\
key_up(Keys.CONTROL).perform()
#模拟ctrl+x,剪切
ActionChains(driver).key_down(Keys.CONTROL).send_keys('x').\
key_up(Keys.CONTROL).perform()
time.sleep(1)
#重新访问百度首页
driver.get("http://www.baidu.com")
#将焦点切换到搜索框中
driver.find_element_by_id("kw").click()
#模拟ctrl+v,粘贴
ActionChains(driver).key_down(Keys.CONTROL).send_keys('v').\
key_up(Keys.CONTROL).perform()
# 点击“百度一下”搜索按钮
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(3)
#断言
assert "陈伟霆" in driver.page_source
#退出浏览器
driver.quit()
方法二:win32api(推荐)
需要安装win32clipboad:py -3 -m pip install pywin32
#encoding=utf-8
from selenium import webdriver
# 导入模拟组合按键需要的包
import win32clipboard as w
import win32api
import win32con
import time
#定义一个字典,存储常用按键对应的值
VK_CODE ={
'enter':0x0D,
'ctrl':0x11,
'a':0x41,
'v':0x56,
'x':0x58
}
def getText():
'''读取剪切板'''
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
def setText(aString):
'''设置剪切板内容'''
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
w.CloseClipboard()
def keyDown(keyName):
'''键盘键按下(固定用法)'''
win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)
def keyUp(keyName):
'''键盘键抬起(固定用法)'''
win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)
#设置剪贴板内容为"陈伟霆"
setText("陈伟霆")
#从剪贴板读取内容
content = getText()
#启动chrome浏览器
driver = webdriver.Chrome(executable_path="f:\\chromedriver")
#访问百度首页
driver.get("http://www.baidu.com")
#将焦点切换到搜索输入框中
driver.find_element_by_id("kw").click()
time.sleep(1)
#模拟ctrl+v操作
keyDown('ctrl')
keyDown('v')
keyUp('v')
keyUp('ctrl')
# 点击“百度一下”搜索按钮
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(3)
#断言
assert content in driver.page_source
#退出浏览器
driver.quit()
比较
1.第一种方法在多线程时启动多个浏览器,使用Keys这种方法测试很可能会失败,因为焦点不一定在自己想要的地方;而且一定要执行perform(),否则没有效果;
2.第二种方法时系统提供的api,支持的键也很多,即使有多个浏览器也不会有问题(推荐使用)