1121Selenium web自动化测试经验分享-模拟键盘操作的三种类;推荐使用pykeyboard包
在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,直接写的用例]
- 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)
- 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)
- 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)
- 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)
- 方向键
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)
- 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)
- 组合 复制粘贴全选剪切
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)
- 谷歌浏览器 其他快捷操作
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() 实践如下
- 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)
- 方向键
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)
- 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)
- 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)
- 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)
- 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
欢迎关注 微信公众号:紫云小站
- 使用UI Automation实现自动化测试--7.2 (模拟键盘复杂操作在自动化测试中的应用)
- 使用UI Automation实现自动化测试--7.2 (模拟键盘复杂操作在自动化测试中的应用)
- web的自动化测试插件Selenium-IDE插件的安装使用
- 使用 Selenium 实现基于 Web 的自动化测试
- 使用Selenium/Ant做Web应用远程自动化测试
- selenium webdriver学习(十三)------------如何利用Actions类模拟鼠标和键盘的操作
- Android 自动化测试经验分享 UiObejct.getFromParent()的使用方法
- 使用 Selenium 实现基于 Web 的自动化测试
- 调试实战:判断Liferay中编辑WebContent 时使用何种富文本编辑器分析 ,顺便分享下页面调试经验 推荐
- [置顶] 使用Selenium实现基于Web的自动化测试
- python + selenium webdriver 通过python来模拟鼠标、键盘操作,来解决SWFFileUpload调用系统底层弹出框无法定位问题
- selenium webdriver(4)---模拟鼠标键盘操作
- 使用docker selenium 构建web自动化分布式测试环境时,遇到的一些问题
- selenium webdriver 模拟键盘操作
- selenium webdriver模拟鼠标键盘操作
- 使用UI Automation实现自动化测试--7.1 (模拟键盘输入数据在自动化测试中的应用)
- 使用selenium和webdriver进行自动化测试
- 使用JAVA Robot 扩展Webdriver 模拟键盘鼠标操作
- 使用 Selenium 实现基于 Web 的自动化测试
- selenium webdriver学习(十三)------------如何利用Actions类模拟鼠标和键盘的操作