当前位置 : 主页 > 网络安全 > 测试自动化 >

selenium--键盘操作

来源:互联网 收集:自由互联 发布时间:2021-06-19
前戏 上篇文章说了selenium里的鼠标事件,在自动化中,键盘事件也是非常重要的,比如我们需要按回车键,ctrl+c复制等等操作,都离不开键盘事件,在selenium中,提供了Keys方法来供我们

前戏

上篇文章说了selenium里的鼠标事件,在自动化中,键盘事件也是非常重要的,比如我们需要按回车键,ctrl+c复制等等操作,都离不开键盘事件,在selenium中,提供了Keys方法来供我们操作键盘

Keys

使用键盘完成复制,剪切,粘贴的功能

# 在百度搜索框输入  python ,复制粘贴搜狗输入框进行搜索
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

driver = webdriver.Chrome()
driver.get(http://www.baidu.com)
driver.maximize_window()
driver.find_element_by_css_selector(#kw).send_keys(python)
sleep(2)
driver.find_element_by_css_selector(#kw).send_keys(Keys.CONTROL, a)  # 全选
driver.find_element_by_css_selector(#kw).send_keys(Keys.CONTROL, c)  # 复制
driver.find_element_by_css_selector(#kw).send_keys(Keys.CONTROL, x)  # 剪切
sleep(2)
driver.get(http://www.sogou.com)
driver.find_element_by_css_selector(.sec-input).send_keys(Keys.CONTROL, v)  # 粘贴
sleep(2)
driver.find_element_by_css_selector(#stb).click()
sleep(2)
driver.quit()

常用的按键

NULL = \ue000
    CANCEL = \ue001  # ^break
    HELP = \ue002
    BACKSPACE = \ue003
    BACK_SPACE = BACKSPACE   #删除键
    TAB = \ue004   #TAB键
    CLEAR = \ue005  
    RETURN = \ue006
    ENTER = \ue007   #回车键
    SHIFT = \ue008   #Shift键
    LEFT_SHIFT = SHIFT
    CONTROL = \ue009
    LEFT_CONTROL = CONTROL   #Ctrl 键
    ALT = \ue00a           #Alt 键
    LEFT_ALT = ALT
    PAUSE = \ue00b
    ESCAPE = \ue00c   #ECS键
    SPACE = \ue00d    #空格键 
    PAGE_UP = \ue00e   #PgUp 键
    PAGE_DOWN = \ue00f #PgDwon 键
    END = \ue010    #END 键
    HOME = \ue011   #HOME 键
    LEFT = \ue012  #左键
    ARROW_LEFT = LEFT  
    UP = \ue013    #上键
    ARROW_UP = UP   
    RIGHT = \ue014
    ARROW_RIGHT = RIGHT  #右键
    DOWN = \ue015      #下键
    ARROW_DOWN = DOWN  
    INSERT = \ue016    #insert键 
    DELETE = \ue017    #del键

    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
View Code

 

例子2

from selenium import webdriver
import unittest, time
from selenium.webdriver.common.keys import Keys


class Test_dragpage(unittest.TestCase):
    def test_dragpageElement(self):
        url = http://www.sogou.com
        self.driver = webdriver.Chrome()
        self.driver.get(url)
        self.driver.maximize_window()
        query = self.driver.find_element_by_id(query)
        # 通过WebDriver发送一个f12键
        query.send_keys(Keys.F12)

        time.sleep(5)
        # 在按次f12
        query.send_keys(Keys.F12)
        query.send_keys(selenium)
        # 按回车
        query.send_keys(Keys.ENTER)


time.sleep(3)

test1 = Test_dragpage()
test1.test_dragpageElement()

通过WebDriver内建的模块模拟组合键

from selenium import webdriver
import unittest, time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys


class Test_dragpage(unittest.TestCase):
    def test_dragpageElement(self):
        url = http://www.baidu.com
        self.driver = webdriver.Chrome()
        self.driver.get(url)

        input = self.driver.find_element_by_id(kw)
        input.send_keys(python)

        ActionChains(self.driver).key_down(Keys.CONTROL).send_keys(a).key_up(Keys.CONTROL).perform()
        time.sleep(2)

        ActionChains(self.driver).key_down(Keys.CONTROL).send_keys(x).key_up(Keys.CONTROL).perform()
        self.driver.get(url)
        self.driver.find_element_by_id(kw).click()

        ActionChains(self.driver).key_down(Keys.CONTROL).send_keys(v).key_up(Keys.CONTROL).perform()

        self.driver.find_element_by_id(su).click()


test1 = Test_dragpage()
test1.test_dragpageElement()

ActionChains(self.driver).key_down(Keys.CONTROL).send_keys(‘v‘).key_up(Keys.CONTROL).perform(),这行代码中,key_down(Keys.CONTROL)表示按下ctrl键,send_keys(‘v‘)类似模拟了V键,组合起来就是Ctrl+v,而key_down(Keys.CONTROL)表示释放Ctrl键

通过第三方库进行操作

需要安装pywin32

键盘映射表

VK_CODE = {backspace:0x08,
           tab:0x09,
           clear:0x0C,
           enter:0x0D,
           shift:0x10,
           ctrl:0x11,
           alt:0x12,
           pause:0x13,
           caps_lock:0x14,
           esc:0x1B,
           spacebar:0x20,
           page_up:0x21,
           page_down:0x22,
           end:0x23,
           home:0x24,
           left_arrow:0x25,
           up_arrow:0x26,
           right_arrow:0x27,
           down_arrow:0x28,
           select:0x29,
           print:0x2A,
           execute:0x2B,
           print_screen:0x2C,
           ins:0x2D,
           del:0x2E,
           help:0x2F,
           0:0x30,
           1:0x31,
           2:0x32,
           3:0x33,
           4:0x34,
           5:0x35,
           6:0x36,
           7:0x37,
           8:0x38,
           9:0x39,
           a:0x41,
           b:0x42,
           c:0x43,
           d:0x44,
           e:0x45,
           f:0x46,
           g:0x47,
           h:0x48,
           i:0x49,
           j:0x4A,
           k:0x4B,
           l:0x4C,
           m:0x4D,
           n:0x4E,
           o:0x4F,
           p:0x50,
           q:0x51,
           r:0x52,
           s:0x53,
           t:0x54,
           u:0x55,
           v:0x56,
           w:0x57,
           x:0x58,
           y:0x59,
           z:0x5A,
           numpad_0:0x60,
           numpad_1:0x61,
           numpad_2:0x62,
           numpad_3:0x63,
           numpad_4:0x64,
           numpad_5:0x65,
           numpad_6:0x66,
           numpad_7:0x67,
           numpad_8:0x68,
           numpad_9:0x69,
           multiply_key:0x6A,
           add_key:0x6B,
           separator_key:0x6C,
           subtract_key:0x6D,
           decimal_key:0x6E,
           divide_key:0x6F,
           F1:0x70,
           F2:0x71,
           F3:0x72,
           F4:0x73,
           F5:0x74,
           F6:0x75,
           F7:0x76,
           F8:0x77,
           F9:0x78,
           F10:0x79,
           F11:0x7A,
           F12:0x7B,
           F13:0x7C,
           F14:0x7D,
           F15:0x7E,
           F16:0x7F,
           F17:0x80,
           F18:0x81,
           F19:0x82,
           F20:0x83,
           F21:0x84,
           F22:0x85,
           F23:0x86,
           F24:0x87,
           num_lock:0x90,
           scroll_lock:0x91,
           left_shift:0xA0,
           right_shift :0xA1,
           left_control:0xA2,
           right_control:0xA3,
           left_menu:0xA4,
           right_menu:0xA5,
           browser_back:0xA6,
           browser_forward:0xA7,
           browser_refresh:0xA8,
           browser_stop:0xA9,
           browser_search:0xAA,
           browser_favorites:0xAB,
           browser_start_and_home:0xAC,
           volume_mute:0xAD,
           volume_Down:0xAE,
           volume_up:0xAF,
           next_track:0xB0,
           previous_track:0xB1,
           stop_media:0xB2,
           play/pause_media:0xB3,
           start_mail:0xB4,
           select_media:0xB5,
           start_application_1:0xB6,
           start_application_2:0xB7,
           attn_key:0xF6,
           crsel_key:0xF7,
           exsel_key:0xF8,
           play_key:0xFA,
           zoom_key:0xFB,
           clear_key:0xFE,
           +:0xBB,
           ,:0xBC,
           -:0xBD,
           .:0xBE,
           /:0xBF,
           `:0xC0,
           ;:0xBA,
           [:0xDB,
           \\:0xDC,
           ]:0xDD,
           "":0xDE,
           `:0xC0}
View Code

 

import win32api
import win32con

class KeyboardKeys(object):
    #模拟键盘按键类
    VK_CODE={
        enter:0x0D,
        ctrl:0x11,
        v:0x56
    }

    @staticmethod
    def keyDown(keyName):
        #按下按键
        win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,0,0)


    @staticmethod
    def keyUp(keyName):
        #释放按键
        win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,win32con.KEYEVENTF_KEYUP,0)


    @staticmethod
    def oneKey(key):
        #模拟单个按键
        KeyboardKeys.keyDown(key)
        KeyboardKeys.keyUp(key)

    @staticmethod
    def twoKeys(key1,key2):
        #模拟两个组合键
        KeyboardKeys.keyDown(key1)
        KeyboardKeys.keyDown(key2)
        KeyboardKeys.keyUp(key2)
        KeyboardKeys.keyUp(key1)


Keybd_event()共有四个参数:
第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);
第二个参数为扫描码,一般不用设置,用0代替就行;
第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";
第四个参数一般也是置0即可。

 调用
KeyboardKeys.oneKey(enter)

设置剪贴板

在进行自动化的时候,有时候要上传一个文件,这时会打开一个wins的窗口,但是selenium没有给我们提供操作wins窗口的方法,我们就要使用pywin32提供给我们的方法来操作

import win32clipboard as w
import win32con


class Clipboard(object):
    #模拟windows设置剪贴板
    #读取剪贴板
    @staticmethod
    def getText():
        #打开剪贴板
        w.OpenClipboard()

        #获取剪贴板中的数据
        d=w.GetClipboardData(win32con.CF_TEXT)

        #关闭剪贴板
        w.CloseClipboard()

        #返回剪贴板数据给调用者
        return d



    #设置剪贴板内容
    @staticmethod
    def setText(aString):
        #打开剪贴板
        w.OpenClipboard()

        #清空剪贴板
        w.EmptyClipboard()

        #将数据aString写入剪贴板
        w.SetClipboardData(win32con.CF_UNICODETEXT,aString)

        #关闭剪贴板
        w.CloseClipboard()

调用

 Clipboard.setText(filePath)
网友评论