admin管理员组文章数量:1026989
1121Selenium web自动化测试经验分享
在Web自动化测试中,有时候会用键盘来输入内容,没那么常用,但分享下我爬的坑。
个人博客:
第一个:keys模块
WebDriver中对键盘的操作都封装在Keys类中;
一直到20号前 我还没接触过下面讲的pykeyboard模块,所以一直有几个问题没能搞定:
1.CTRL + 数字键 切换标签页;2. F11全屏和F5刷新;
第二个:PyKeyboard类 推荐掌握
项目地址
早上接触个把小时,尝试、实践之后,就决定尽快分享出来。目前我所想到的所有键盘操作,都能做到,真的好强大!
第三个:action_chains模块
22号晚上坐公交回家,看到有人问到ActionChains类下key_down()、key_up()方法没能实现键盘操作,我才留意到这个类下面也有类似的方法,23号早上来实践、分享下。
一)Keys类(keys模块)
selenium 本身提供了一整套的模拟键盘操作事件,
需要先导入键盘模块:from selenium.webdrivermon.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('')driver.find_element_by_id('login_field').send_keys('zyoooo12')time.sleep(1)# BACKSPACE = '\ue003'# BACK_SPACE = BACKSPACEdriver.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("")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('')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("")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("")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("")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("/")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("/")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('')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("")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' # ^breakHELP = '\ue002'BACKSPACE = '\ue003'BACK_SPACE = BACKSPACETAB = '\ue004'CLEAR = '\ue005'RETURN = '\ue006'ENTER = '\ue007'SHIFT = '\ue008'LEFT_SHIFT = SHIFTCONTROL = '\ue009'LEFT_CONTROL = CONTROLALT = '\ue00a'LEFT_ALT = ALTPAUSE = '\ue00b'ESCAPE = '\ue00c'SPACE = '\ue00d'PAGE_UP = '\ue00e'PAGE_DOWN = '\ue00f'END = '\ue010'HOME = '\ue011'LEFT = '\ue012'ARROW_LEFT = LEFTUP = '\ue013'ARROW_UP = UPRIGHT = '\ue014'ARROW_RIGHT = RIGHTDOWN = '\ue015'ARROW_DOWN = DOWNINSERT = '\ue016'DELETE = '\ue017'SEMICOLON = '\ue018'EQUALS = '\ue019'NUMPAD0 = '\ue01a' # number pad keysNUMPAD1 = '\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 keysF2 = '\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("")self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')self.xin_find_element(driver, By.ID, 'su').send_keys('\ue007') # entertime.sleep(2)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00f') # PageDowntime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00e') # PageUptime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue011') # Hometime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue017') # Deletetime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue010') # Endtime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00d') # Spacetime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('123')time.sleep(2)driver.quit()
二)PyKeyboard类 (pykeyboard包、PyUserInput模块)
这个模块很好使,很推荐,但是有几个坑(我的电脑是64位的,装python3.6 64位版本):
1.这个Python库是跨平台支持的,但是对应不同平台,需要先安装依赖库。
其中 Windows - pywin32, pyHook
2.pyHook安装
直接pip install 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. Generatesas few Shift events as possible."""shift = Falsefor char in char_string:if self.is_char_shifted(char):if not shift: # Only press Shift as neededtime.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 characterif 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 alreadyif shift and char != ' ': # Only release Shift as neededself.release_key(self.shift_key)shift = Falsetime.sleep(interval)self.tap_key(char)
[下方实例,没有写setUp和tearDown,直接写的用例]
- BACKSPACE
def test_1(self):"""BACK_SPACE、BACKSPACE 删除键"""self.driver.get('')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('')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("")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('')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("/")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("/")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("/")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("/")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("/")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("/")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("/")time.sleep(1)js6 = 'window.open("/")'self.driver.execute_script(js6)time.sleep(1)js8 = 'window.open("")'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("/")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("/")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('')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('')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("/")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("/")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("/")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("/")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('')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("/")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("/")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
个人博客
1121Selenium web自动化测试经验分享
在Web自动化测试中,有时候会用键盘来输入内容,没那么常用,但分享下我爬的坑。
个人博客:
第一个:keys模块
WebDriver中对键盘的操作都封装在Keys类中;
一直到20号前 我还没接触过下面讲的pykeyboard模块,所以一直有几个问题没能搞定:
1.CTRL + 数字键 切换标签页;2. F11全屏和F5刷新;
第二个:PyKeyboard类 推荐掌握
项目地址
早上接触个把小时,尝试、实践之后,就决定尽快分享出来。目前我所想到的所有键盘操作,都能做到,真的好强大!
第三个:action_chains模块
22号晚上坐公交回家,看到有人问到ActionChains类下key_down()、key_up()方法没能实现键盘操作,我才留意到这个类下面也有类似的方法,23号早上来实践、分享下。
一)Keys类(keys模块)
selenium 本身提供了一整套的模拟键盘操作事件,
需要先导入键盘模块:from selenium.webdrivermon.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('')driver.find_element_by_id('login_field').send_keys('zyoooo12')time.sleep(1)# BACKSPACE = '\ue003'# BACK_SPACE = BACKSPACEdriver.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("")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('')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("")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("")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("")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("/")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("/")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('')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("")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' # ^breakHELP = '\ue002'BACKSPACE = '\ue003'BACK_SPACE = BACKSPACETAB = '\ue004'CLEAR = '\ue005'RETURN = '\ue006'ENTER = '\ue007'SHIFT = '\ue008'LEFT_SHIFT = SHIFTCONTROL = '\ue009'LEFT_CONTROL = CONTROLALT = '\ue00a'LEFT_ALT = ALTPAUSE = '\ue00b'ESCAPE = '\ue00c'SPACE = '\ue00d'PAGE_UP = '\ue00e'PAGE_DOWN = '\ue00f'END = '\ue010'HOME = '\ue011'LEFT = '\ue012'ARROW_LEFT = LEFTUP = '\ue013'ARROW_UP = UPRIGHT = '\ue014'ARROW_RIGHT = RIGHTDOWN = '\ue015'ARROW_DOWN = DOWNINSERT = '\ue016'DELETE = '\ue017'SEMICOLON = '\ue018'EQUALS = '\ue019'NUMPAD0 = '\ue01a' # number pad keysNUMPAD1 = '\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 keysF2 = '\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("")self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')self.xin_find_element(driver, By.ID, 'su').send_keys('\ue007') # entertime.sleep(2)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00f') # PageDowntime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00e') # PageUptime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue011') # Hometime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue017') # Deletetime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue010') # Endtime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('\ue00d') # Spacetime.sleep(1)self.xin_find_element(driver, By.ID, 'kw').send_keys('123')time.sleep(2)driver.quit()
二)PyKeyboard类 (pykeyboard包、PyUserInput模块)
这个模块很好使,很推荐,但是有几个坑(我的电脑是64位的,装python3.6 64位版本):
1.这个Python库是跨平台支持的,但是对应不同平台,需要先安装依赖库。
其中 Windows - pywin32, pyHook
2.pyHook安装
直接pip install 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. Generatesas few Shift events as possible."""shift = Falsefor char in char_string:if self.is_char_shifted(char):if not shift: # Only press Shift as neededtime.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 characterif 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 alreadyif shift and char != ' ': # Only release Shift as neededself.release_key(self.shift_key)shift = Falsetime.sleep(interval)self.tap_key(char)
[下方实例,没有写setUp和tearDown,直接写的用例]
- BACKSPACE
def test_1(self):"""BACK_SPACE、BACKSPACE 删除键"""self.driver.get('')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('')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("")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('')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("/")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("/")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("/")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("/")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("/")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("/")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("/")time.sleep(1)js6 = 'window.open("/")'self.driver.execute_script(js6)time.sleep(1)js8 = 'window.open("")'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("/")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("/")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('')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('')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("/")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("/")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("/")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("/")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('')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("/")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("/")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
个人博客
本文标签: 1121Selenium web自动化测试经验分享
版权声明:本文标题:1121Selenium web自动化测试经验分享 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/IT/1694660382a254661.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论