您的位置:首页 > 其它

1121Selenium web自动化测试经验分享-模拟键盘操作的三种类;推荐使用pykeyboard包

2018-11-21 13:11 405 查看

在Web自动化测试中,有时候会用键盘来输入内容,没那么常用,但分享下我爬的坑。

第一个:keys模块
WebDriver中对键盘的操作都封装在Keys类中;

一直到20号前 我还没接触过下面讲的pykeyboard模块,所以一直有几个问题没能搞定:

1.CTRL + 数字键 切换标签页;2. F11全屏和F5刷新;

第二个:PyKeyboard类 推荐掌握
https://github.com/SavinaRoja/PyUserInput 项目地址

早上接触个把小时,尝试、实践之后,就决定尽快分享出来。目前我所想到的所有键盘操作,都能做到,真的好强大!

第三个:action_chains模块

22号晚上坐公交回家,看到有人问到ActionChains类下key_down()、key_up()方法没能实现键盘操作,我才留意到这个类下面也有类似的方法,23号早上来实践、分享下。

一)Keys类(keys模块)

selenium 本身提供了一整套的模拟键盘操作事件,
需要先导入键盘模块:from selenium.webdriver.common.keys import Keys

一)单个键盘按键

输入TAB、ENTER、PageDown、PageUp、BACKSPACE、 SPACE、HOME、END、DELETE、ARROW_DOWN、ARROW_UP、ARROW_LEFT、ARROW_RIGHT

键盘 F1 到 F12:send_keys(Keys.F1) 把 F1 改成对应的快捷键

a)BACKSPACE

def test_36b1(self):
"""BACK_SPACE、BACKSPACE 删除键"""
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://github.com/login')
driver.find_element_by_id('login_field').send_keys('zyoooo12')
time.sleep(1)

# BACKSPACE = '\ue003'
# BACK_SPACE = BACKSPACE
driver.find_element_by_id('login_field').send_keys(Keys.BACK_SPACE)
time.sleep(1)
driver.find_element_by_id('login_field').send_keys(Keys.BACKSPACE)
time.sleep(2)
driver.quit()

b)ENTER、PageDown、PageUp

def test_36d(self):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')

self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ENTER)
time.sleep(2)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.PAGE_DOWN)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.PAGE_UP)
time.sleep(1)
driver.quit()

c) SPACE、HOME、END、DELETE

def test_36b2(self):
"""SPACE HOME END DELETE"""
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get('https://github.com/login')

driver.find_element_by_id('login_field').send_keys('zy123')
time.sleep(1)
driver.find_element_by_id('login_field').send_keys(Keys.SPACE)
time.sleep(1)
driver.find_element_by_id('login_field').send_keys('aaa')
time.sleep(1)
driver.find_element_by_id('login_field').send_keys(Keys.SPACE)
time.sleep(1)
driver.find_element_by_id('login_field').send_keys('987')
time.sleep(1)

driver.find_element_by_id('login_field').send_keys(Keys.HOME)
time.sleep(1)
driver.find_element_by_id("login_field").send_keys(Keys.DELETE)
time.sleep(1)
driver.find_element_by_id('login_field').send_keys('一下')
driver.find_element_by_id('login_field').send_keys(Keys.SPACE)
time.sleep(1)

driver.find_element_by_id("login_field").send_keys(Keys.END)
driver.find_element_by_id('login_field').send_keys(Keys.SPACE)
driver.find_element_by_id("login_field").send_keys('再试试')
time.sleep(1)

driver.find_element_by_id('login_field').send_keys(Keys.HOME)
time.sleep(1)
driver.find_element_by_id("login_field").send_keys(Keys.DELETE)
time.sleep(1)
driver.quit()

e)F1到F12

下图是失败的

def test_37(self):
"""键盘F1到F12:send_keys(Keys.F1) 把F1改成对应的快捷键"""
driver = webdriver.Chrome()
# driver.maximize_window()
driver.get("https://www.baidu.com")
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(driver, By.ID, 'su').click()
time.sleep(2)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.F11)      # 谷歌浏览器的F11是全屏
time.sleep(3)
driver.quit()

f)方向键 ARROW_DOWN、ARROW_UP、ARROW_LEFT、ARROW_RIGHT

def test_fangxiang1(self):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
time.sleep(1)

self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_DOWN)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_DOWN)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_DOWN)

time.sleep(1)

self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_UP)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_UP)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_UP)

time.sleep(1)

self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_LEFT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_LEFT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_LEFT)

time.sleep(1)

self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_RIGHT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_RIGHT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.ARROW_RIGHT)

time.sleep(1)
driver.quit()
def test_fangxiang2(self):
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.set_window_size(900, 700)
driver.get("https://www.baidu.com")
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(driver, By.ID, 'su').click()
time.sleep(2)

self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_DOWN)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_DOWN)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_DOWN)

time.sleep(1)

self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_UP)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_UP)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_UP)

time.sleep(1)

self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_RIGHT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_RIGHT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_RIGHT)

time.sleep(1)

self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_LEFT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_LEFT)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ARROW_LEFT)
time.sleep(1)

driver.quit()

d)Tab

模拟tab按键的操作,需要对前面输入框send_keys(Keys.TAB,‘XXXX’) 'XXXX’是后面输入框要输入的内容

def test_36tab(self):
"""tab"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://mail.qq.com/")
self.driver.switch_to.frame('login_frame')
self.xin_find_element(self.driver, By.ID, 'switcher_plogin').click()
self.xin_find_element(self.driver, By.ID, 'u').send_keys('6666')

self.xin_find_element(self.driver, By.ID, 'u').send_keys(Keys.TAB, 'abcd')
time.sleep(2)
self.driver.quit()

下图是失败的

def test_36tab1(self):
"""tab 失败 没能实现预期结果"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://mail.qq.com/")
self.driver.switch_to.frame('login_frame')
self.xin_find_element(self.driver, By.ID, 'switcher_plogin').click()
self.xin_find_element(self.driver, By.ID, 'u').send_keys('6666')

self.xin_find_element(self.driver, By.ID, 'u').send_keys(Keys.TAB)
self.xin_find_element(self.driver, By.ID, 'u').send_keys('cuowu')

time.sleep(2)
self.driver.quit()

不建议掌握,容易混淆:

def test_36b3(self):
"""一次发送多个按键命令"""
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get('https://github.com/login')
driver.find_element_by_id('login_field').send_keys('zy123')
time.sleep(1)

driver.find_element_by_id('login_field').send_keys(Keys.HOME, Keys.DELETE, Keys.NUMPAD0, Keys.SPACE, '你')
time.sleep(1)
driver.find_element_by_id('login_field').send_keys(Keys.BACKSPACE, Keys.NUMPAD8)
time.sleep(1)
driver.find_element_by_id("login_field").send_keys(Keys.END, Keys.SPACE, '再试试', Keys.NUMPAD5)
time.sleep(1)
driver.quit()

二)组合按键

复制 Ctrl+C:send_keys(Keys.CONTROL,‘c’)
粘贴 Ctrl+V:send_keys(Keys.CONTROL,‘v’)
全选 Ctrl+A:send_keys(Keys.CONTROL,‘a’)
剪切 Ctrl+X:send_keys(Keys.CONTROL,‘x’)

def test_38(self):
"""复制粘贴全选剪切"""
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.CONTROL, 'a')
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.CONTROL, 'c')
time.sleep(1)

self.xin_find_element(driver, By.ID, 'kw').clear()
time.sleep(1)

self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.CONTROL, 'v')
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.CONTROL, 'a')
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys(Keys.CONTROL, 'x')
time.sleep(1)
driver.quit()

三)其他思路

不导入keys模块,使用特定字符串来实现操作

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'
def test_te(self):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(driver, By.ID, 'su').send_keys('\ue007')  # enter
time.sleep(2)
self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00f')  # PageDown
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00e')  # PageUp
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue011')  # Home
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue017')  # Delete
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue010')  # End
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00d')  # Space
time.sleep(1)
self.xin_find_element(driver, By.ID, 'kw').send_keys('123')
time.sleep(2)
driver.quit()

二)PyKeyboard类 (pykeyboard包、PyUserInput项目)

这个模块很好使,很推荐,但是有几个坑:

1.这个Python库是跨平台支持的,但是对应不同平台,需要先安装依赖库。
其中 Windows - pywin32, pyHook


2.pyHook安装
直接pip install pyHook是找不到相关包的。
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook 可以下载适合你电脑Python版本的.whl文件,再进行安装

3.安装PyUserInput

4.语法

键盘操作:tap_key() 单个输入 和 press_keys() 组合输入
输入内容 type_string() 中文输入感觉有问题

[下方源码]

def tap_key(self, character='', n=1, interval=0):
"""Press and release a given character key n times."""
for i in range(n):
self.press_key(character)
self.release_key(character)
time.sleep(interval)
def press_keys(self,characters=[]):
"""Press a given character key."""
for character in characters:
self.press_key(character)
for character in characters:
self.release_key(character)
def type_string(self, char_string, interval=0):
"""
A convenience method for typing longer strings of characters. Generates
as few Shift events as possible."""
shift = False
for char in char_string:
if self.is_char_shifted(char):
if not shift:  # Only press Shift as needed
time.sleep(interval)
self.press_key(self.shift_key)
shift = True
#In order to avoid tap_key pressing Shift, we need to pass the
#unshifted form of the character
if char in '<>?:"{}|~!@#$%^&*()_+':
ch_index = '<>?:"{}|~!@#$%^&*()_+'.index(char)
unshifted_char = ",./;'[]\\`1234567890-="[ch_index]
else:
unshifted_char = char.lower()
time.sleep(interval)
self.tap_key(unshifted_char)
else:  # Unshifted already
if shift and char != ' ':  # Only release Shift as needed
self.release_key(self.shift_key)
shift = False
time.sleep(interval)
self.tap_key(char)

[下方实例,没有写setUp和tearDown,直接写的用例]

  1. BACKSPACE
def test_1(self):
"""BACK_SPACE、BACKSPACE 删除键"""
self.driver.get('https://github.com/login')
self.driver.find_element_by_id('login_field').send_keys('zyoooo12')
time.sleep(1)

k11 = PyKeyboard()
k11.tap_key(k11.backspace_key)
time.sleep(1)
k11.tap_key(k11.backspace_key)
time.sleep(1)
def test_1b(self):
"""BACK_SPACE、BACKSPACE 删除键"""
self.driver.get('https://github.com/login')
self.driver.find_element_by_id('login_field').send_keys('zyoooo12')
time.sleep(1)

k11 = PyKeyboard()
k11.tap_key(k11.backspace_key, n=2, interval=2)
time.sleep(1)
  1. ENTER、PageDown、PageUp
def test_2(self):
"""ENTER、PageDown、PageUp"""
self.driver.get("https://www.baidu.com")
self.driver.find_element(By.ID, 'kw').send_keys('Python')

k12 = PyKeyboard()
k12.tap_key(k12.enter_key)
time.sleep(2)
k12.tap_key(k12.page_down_key)
time.sleep(1)
k12.tap_key(k12.page_up_key)
time.sleep(1)
  1. SPACE、HOME、END、DELETE
def test_3(self):
"""SPACE、HOME、END、DELETE"""
self.driver.get('https://github.com/login')
self.driver.find_element_by_id('login_field').send_keys('zy123zy')
time.sleep(1)

k13 = PyKeyboard()
k13.tap_key(k13.space_key)
time.sleep(1)

k13.type_string('987WO')      # 中文输入有问题
time.sleep(1)

k13.tap_key(k13.home_key)
time.sleep(1)

self.driver.find_element_by_id('login_field').send_keys('我')
time.sleep(1)

k13.tap_key(k13.delete_key)
time.sleep(1)

k13.tap_key(k13.end_key)
time.sleep(1)

k13.type_string('nnn难难难')   # 中文输入有问题
time.sleep(1)
  1. Chrome F5刷新 F11全屏 F1技术支持 F12开发者工具
def test_4(self):
"""Chrome F5刷新 F11全屏 F1技术支持 F12开发者工具"""
self.driver.get("https://www.baidu.com/")

k14 = PyKeyboard()
k14.tap_key(k14.function_keys[11])
time.sleep(1)
k14.tap_key(k14.function_keys[11])
time.sleep(1)

PyKeyboard().tap_key(k14.function_keys[5])
time.sleep(1)

k14.tap_key(k14.function_keys[12])
time.sleep(1)
k14.tap_key(k14.function_keys[12])
time.sleep(1)

k14.tap_key(k14.function_keys[1])
time.sleep(1)
def test_4b(self):
"""Chrome F5刷新 F11全屏 F1技术支持 F12开发者工具"""
self.driver.get("https://www.baidu.com/")

k14 = PyKeyboard()
k14.tap_key(k14.function_keys[11], n=2, interval=2)
time.sleep(1)

PyKeyboard().tap_key(k14.function_keys[5])
time.sleep(1)

k14.tap_key(k14.function_keys[12], 2, 2)
time.sleep(1)

k14.tap_key(k14.function_keys[1])
time.sleep(1)
  1. 方向键
def test_5(self):
"""方向键"""
self.driver.get("https://www.baidu.com/")
self.driver.set_window_size(900, 700)
self.driver.find_element(By.ID, 'kw').send_keys('Python')
self.driver.find_element(By.ID, 'su').click()
time.sleep(2)

k15 = PyKeyboard()
k15.tap_key(k15.down_key)
time.sleep(1)
k15.tap_key(k15.down_key)
time.sleep(1)
k15.tap_key(k15.down_key)
time.sleep(1)

k15.tap_key(k15.up_key)
time.sleep(1)
k15.tap_key(k15.up_key)
time.sleep(1)
k15.tap_key(k15.up_key)
time.sleep(1)

k15.tap_key(k15.right_key)
time.sleep(1)
k15.tap_key(k15.right_key)
time.sleep(1)
k15.tap_key(k15.right_key)
time.sleep(1)

k15.tap_key(k15.left_key)
time.sleep(1)
k15.tap_key(k15.left_key)
time.sleep(1)
k15.tap_key(k15.left_key)
time.sleep(1)
def test_5b(self):
"""方向键"""
self.driver.get("https://www.baidu.com/")
self.driver.set_window_size(900, 700)
self.driver.find_element(By.ID, 'kw').send_keys('Python')
self.driver.find_element(By.ID, 'su').click()
time.sleep(2)

k15 = PyKeyboard()
k15.tap_key(k15.down_key, n=3, interval=1)
time.sleep(1)

k15.tap_key(k15.up_key, n=3, interval=1)
time.sleep(1)

k15.tap_key(k15.right_key, 3, 1)
time.sleep(1)

k15.tap_key(k15.left_key, 3, 1)
time.sleep(1)
  1. tab
def test_6(self):
"""tab"""
self.driver.get("https://mail.qq.com/")
self.driver.switch_to.frame("login_frame")
self.driver.find_element_by_id("switcher_plogin").click()
self.driver.find_element_by_id("u").send_keys('987')

k16 = PyKeyboard()
k16.type_string('123@#$wwwWWW')

k16.tap_key(k16.tab_key)
time.sleep(1)

k16.type_string('abcdef')
time.sleep(1)
  1. 组合 复制粘贴全选剪切
def test_7(self):
"""复制粘贴全选剪切"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')

k17 = PyKeyboard()
k17.press_keys([k17.control_key, 'a'])
time.sleep(1)

k17.press_keys([k17.control_key, 'c'])
time.sleep(1)

self.driver.find_element_by_id('kw').clear()
time.sleep(1)

k17.press_keys([k17.control_key, 'v'])
time.sleep(1)

k17.press_keys([k17.control_key, 'a'])
k17.press_keys([k17.control_key, 'x'])
time.sleep(1)
  1. 谷歌浏览器 其他快捷操作
def test_8(self):
"""谷歌浏览器 其他快捷操作"""
self.driver.get("https://mail.qq.com/")
time.sleep(1)

js6 = 'window.open("https://www.baidu.com/")'
self.driver.execute_script(js6)
time.sleep(1)

js8 = 'window.open("https://blog.csdn.net/zyooooxie")'
self.driver.execute_script(js8)
time.sleep(1.5)

k1 = PyKeyboard()
k1.press_keys([k1.control_key, '1'])    # 切换标签页
time.sleep(1)

k1.press_keys([k1.control_key, k1.shift_key, 'o'])  # 书签
time.sleep(1)

k1.press_keys([k1.control_key, k1.function_keys[4]])    # 关闭当前窗口
time.sleep(1)

k1.press_keys([k1.control_key, k1.shift_key, 't'])  # 恢复刚才网页
time.sleep(1)

三)ActionChains类(action_chains模块)

知道这个类,还是因为WebDriver操作鼠标方法学习到的。没想到这个类下面的某些方法,也能够模拟键盘操作。
“经验主义”害死人啊。

1.key_down() (和Keys类结合)

源码:

def key_down(self, value, element=None):
"""
Sends a key press only, without releasing it.
Should only be used with modifier keys (Control, Alt and Shift).

:Args:
- value: The modifier key to send. Values are defined in `Keys` class.
- element: The element to send keys.
If None, sends a key to current focused element.

Example, pressing ctrl+c::

ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

"""
if element:
self.click(element)
if self._driver.w3c:
self.w3c_actions.key_action.key_down(value)
self.w3c_actions.pointer_action.pause()
else:
self._actions.append(lambda: self._driver.execute(
Command.SEND_KEYS_TO_ACTIVE_ELEMENT,
{"value": keys_to_typing(value)}))
return self

通过注释可以了解到:key_down()这个方法 1. 只可以用到 keys (Control, Alt and Shift) ; 2.key_down()只是按下去;想恢复release,要结合key_up();3.可以发送 值 到 current focused element,或者某个WebElement;

2.key_up()(和Keys类结合)

源码:

def key_up(self, value, element=None):
"""
Releases a modifier key.

:Args:
- value: The modifier key to send. Values are defined in Keys class.
- element: The element to send keys.
If None, sends a key to current focused element.

Example, pressing ctrl+c::

ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

"""
if element:
self.click(element)
if self._driver.w3c:
self.w3c_actions.key_action.key_up(value)
self.w3c_actions.pointer_action.pause()
else:
self._actions.append(lambda: self._driver.execute(
Command.SEND_KEYS_TO_ACTIVE_ELEMENT,
{"value": keys_to_typing(value)}))
return self

A.组合按键
结合这两个方法的举例,实践如下:

def test10b(self):
"""ActionChains类 组合按键"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)

action1 = ActionChains(self.driver)
action1.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()
time.sleep(1)

action1.key_down(Keys.CONTROL).send_keys('x').key_up(Keys.CONTROL).perform()
time.sleep(1)

action1.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
time.sleep(1)

3.send_keys()(和Keys类结合)

源码:

def send_keys(self, *keys_to_send):
"""
Sends keys to current focused element.

:Args:
- keys_to_send: The keys to send.  Modifier keys constants can be found in the
'Keys' class.
"""
if self._driver.w3c:
self.w3c_actions.key_action.send_keys(keys_to_send)
else:
self._actions.append(lambda: self._driver.execute(
Command.SEND_KEYS_TO_ACTIVE_ELEMENT, {'value': keys_to_typing(keys_to_send)}))
return self

通过注释可以了解到:send_keys()这个方法:发送 值 到 current focused element

在我理解中,current focused element 就是 当前聚焦元素

那么问题来了,打开浏览器,访问某网站后,current focused element 有吗?我感觉没有;查找定位某元素后呢,我感觉就有了。所以,send_keys() 发送的值 是可以给 浏览器吗?就是说send_keys() 是否可以实现对浏览器的操作呢?我的实践是 不能。没能实现F5 F11 快捷操作。

B.单个按键
运用send_keys() 实践如下

  1. Tab
def test10a7(self):
"""ActionChains类 send_keys(Keys.TAB,‘XXXX’)"""
self.driver.get("https://mail.qq.com/")
self.driver.switch_to.frame('login_frame')
self.driver.find_element_by_id('switcher_plogin').click()
self.driver.find_element_by_id('u').send_keys('6666')

action1 = ActionChains(self.driver)
action1.send_keys(Keys.TAB, 'abcdef').perform()
time.sleep(1)
  1. 方向键
def test10a62(self):
"""ActionChains类 方向键 上下左右 单步执行可以,结合一起容易出错"""
self.driver.get('https://github.com/login')
self.driver.find_element_by_id('login_field').send_keys('zy123zy')
time.sleep(1)

action1 = ActionChains(self.driver)

action1.send_keys(Keys.HOME).perform()
time.sleep(1)

action1.send_keys(Keys.ARROW_RIGHT).perform()
time.sleep(1)
action1.send_keys(Keys.ARROW_RIGHT).perform()
time.sleep(1)
def test10a61(self):
"""ActionChains类 方向键 上下左右 单步执行可以,结合一起容易出错"""
self.driver.get('https://github.com/login')
self.driver.find_element_by_id('login_field').send_keys('zy123zy')
time.sleep(1)

action1 = ActionChains(self.driver)
action1.send_keys(Keys.ARROW_LEFT).perform()
time.sleep(1)
action1.send_keys(Keys.ARROW_LEFT).perform()
time.sleep(1)
def test10a52(self):
"""ActionChains类 方向键 上下左右 单步执行可以,结合一起容易出错"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')
self.driver.find_element_by_id('su').click()
time.sleep(2)
self.driver.find_element_by_id('su').send_keys(Keys.PAGE_DOWN)
time.sleep(1)

action1 = ActionChains(self.driver)
action1.send_keys(Keys.ARROW_UP).perform()
time.sleep(1)
action1.send_keys(Keys.ARROW_UP).perform()
time.sleep(1)
def test10a51(self):
"""ActionChains类 方向键 上下左右 单步执行可以,结合一起容易出错"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')
self.driver.find_element_by_id('su').click()
time.sleep(2)

action1 = ActionChains(self.driver)
action1.send_keys(Keys.ARROW_DOWN).perform()
time.sleep(1)
action1.send_keys(Keys.ARROW_DOWN).perform()
time.sleep(1)
  1. PAGE_DOWN、PAGE_UP、ENTER
def test10a3(self):
"""ActionChains类 PAGE_DOWN PAGE_UP ENTER"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')

action1 = ActionChains(self.driver)
action1.send_keys(Keys.ENTER).perform()
time.sleep(2)

action1.send_keys(Keys.PAGE_DOWN).perform()
time.sleep(1)

action1.send_keys(Keys.PAGE_UP).perform()
time.sleep(1)
  1. BACKSPACE
def test10a2(self):
"""ActionChains类 BACKSPACE"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)

action1 = ActionChains(self.driver)
action1.send_keys(Keys.BACKSPACE).perform()
time.sleep(1)
action1.send_keys(Keys.BACKSPACE).perform()
time.sleep(1)
  1. HOME、DELETE、END、SPACE
def test10a11(self):
"""ActionChains类 使用send_keys()发送 HOME END正常,但和send_keys()、Delete、Space结合就容易出问题"""
self.driver.get('https://github.com/login')
self.driver.find_element_by_id('login_field').send_keys('zy123zy')
time.sleep(1)

action1 = ActionChains(self.driver)
action1.send_keys(Keys.HOME).perform()
time.sleep(1)
action1.send_keys(Keys.DELETE).perform()
time.sleep(1)

action1.send_keys('987654').perform()
time.sleep(2)
def test10a1(self):
"""ActionChains类 使用send_keys()发送 HOME END正常,但和send_keys()、Delete、Space结合就容易出问题"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)

action1 = ActionChains(self.driver)
action1.send_keys(Keys.HOME).perform()
time.sleep(1)

action1.send_keys(Keys.END).perform()
time.sleep(1)

action1.send_keys(Keys.SPACE).perform()
time.sleep(1)
action1.send_keys('987654').perform()

time.sleep(2)
  1. send_keys()简单运用
def test10(self):
"""ActionChains类 使用send_keys()发送"""
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)

action1 = ActionChains(self.driver)
action1.send_keys('567').perform()
time.sleep(1)
action1.send_keys('abc').perform()

time.sleep(3)

ActionChains类没能成功模拟浏览器的快捷操作,就不做分享。

总结

ActionChains类的用例虽执行成功,但结果坑太多太多,不推荐使用。Keys类本该最简单,但是我始终找不准可以send_keys值的元素,所以也不推荐使用。

目前我只使用PyKeyboard类实现了我的所有键盘操作,就多推荐下。

交流技术 欢迎+QQ 153132336 zy
欢迎关注 微信公众号:紫云小站

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐