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,直接写的用例]

  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
欢迎关注 微信公众号:紫云小站

猜你喜欢

转载自blog.csdn.net/zyooooxie/article/details/84131658
今日推荐