[Selenium][Notes]Day5:7️⃣鼠标&键盘事件

703 阅读3分钟

Backgroud:

用selenium做自动化,有时候会遇到需要模拟鼠标键盘操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽、复制、粘贴、删除等等。

一、鼠标事件

Selenium提供了一个类来处理鼠标事件——ActionChains

from selenium.webdriver import ActionChains
# selenium.webdriver.common.action_chains.ActionChains(driver)

这个类基本能够满足所有对鼠标操作的需求。

1. ActionChains基本用法

当调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当调用perform()方法时,队列中的时间才会依次执行。

这种情况下可以有两种调用方法:

  • 链式写法:
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')

link_text = self.driver.find_element_by_link_text('新闻')
ActionChains(driver).move_to_element(link_text).click(hidden_submenu).perform()
  • 分步写法:
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')

link_text = self.driver.find_element_by_link_text('新闻')
actions = ActionChains(self.driver)
actions.move_to_element(link_text)
actions.click(link_text)
actions.perform()
2. ActionChains方法列表
#方法方法描述
1click(on_element=None)单击鼠标左键
2click_and_hold(on_element=None)点击鼠标左键,不松开
3context_click(on_element=None)点击鼠标右键
4double_click(on_element=None)双击鼠标左键
5drag_and_drop(source, target)拖拽到某个元素然后松开
6drag_and_drop_by_offset(source, xoffset, yoffset)拖拽到某个坐标然后松开
7key_down(value, element=None)按下某个键盘上的键
8key_up(value, element=None)松开某个键
9move_by_offset(xoffset, yoffset)鼠标从当前位置移动到某个坐标
10move_to_element(to_element)鼠标移动到某个元素
11move_to_element_with_offset(to_element, xoffset, yoffset)移动到距某个元素(左上角坐标)多少距离的位置
12perform()执行链中的所有动作
13release(on_element=None)在某个元素位置松开鼠标左键
14send_keys(*keys_to_send)发送某个键到当前焦点的元素
15send_keys_to_element(element, *keys_to_send)发送某个键到指定元素

二、键盘事件

模拟键盘的操作需要先导入键盘模块:

from selenium.webdriver.common.keys import Keys
# selenium.webdriver.common.keys.Keys

Keys() 类提供了键盘上几乎所有按键的方法。send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键, 如 Ctrl+A、 Ctrl+C 等。

1. 普通键

对于普通键盘,使用sendKeys(keysToSend)就可以实现,比如按键TAB、Backspace等。

send_keys(Keys.BACK_SPACE) #删除键(BackSpace)
send_keys(Keys.SPACE) #空格键(Space)
send_keys(Keys.TAB) #制表键(Tab)
send_keys(Keys.ESCAPE) #回退键(Esc)
send_keys(Keys.ENTER) #回车键(Enter)
send_keys(Keys.F1) #键盘 F1
2. 修饰键(Modifier keys)

修饰键是键盘上的一个或者一组特别的键,当它与一般按键同时使用的时候,用来临时改变一般键盘的普通行为。对于单独按下修饰键本身一般不会触发任何键盘事件。正常有以下几个修饰键:Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)。

ActionChains(self.driver).keyDown(Keys.CONTROL);// 按下 Ctrl 键
ActionChains(self.driver).keyDown(Keys.SHIFT);// 按下 Shift 键
ActionChains(self.driver).keyDown(Key.ALT);// 按下 Alt 键
ActionChains(self.driver).keyUp(Keys.CONTROL);// 释放 Ctrl 键
ActionChains(self.driver).keyUp(Keys.SHIFT);// 释放 Shift 键
ActionChains(self.driver).keyUp(Keys.ALT);// 释放 Alt 键
3. 常见组合键操作:
send_keys(Keys.COMMAND,‘a’) #全选(COMMAND+Asend_keys(Keys.COMMAND,‘c’) #复制(COMMAND+C)
send_keys(Keys.COMMAND,‘x’) #剪切(COMMAND+X)
send_keys(Keys.COMMAND,‘v’) #粘贴(COMMAND+V)

# key_down(Keys.COMMAND)表示按下Command键,send_keys('v')类似模拟了V键,组合起来就是Command+v,而key_down(Keys.COMMAND)表示释放Command键
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('a').key_up(Keys.COMMAND).perform()
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('x').key_up(Keys.COMMAND).perform()
ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('v').key_up(Keys.COMMAND).perform()

# Alt+F4 来关闭当前的活动窗口
ActionChains(self.driver).keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform()

Note: ActionChains(self.driver).keyDown(theKey) 方法的调用,如果没有显示的调用 keyUp(theKey) 或者 sendKeys(Keys.NULL) 来释放的话,这个按键将一直保持按住状态

实例Code:

from selenium import webdriver
from time import sleep

# http://sahitest.com/demo/
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.remote.webelement import WebElement


class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
    # 鼠标操作
    def test_mouse(self):
        self.driver.get('http://sahitest.com/demo/clicks.htm')
        # 鼠标双击
        double_click_btn = self.driver.find_element_by_xpath('/html/body/form/input[2]')
        ActionChains(self.driver).double_click(double_click_btn).perform()
        sleep(2)
        # 鼠标单击
        single_click_btn = self.driver.find_element_by_xpath('/html/body/form/input[3]')
        ActionChains(self.driver).click(single_click_btn).perform()
        ## self.driver.find_element_by_xpath('/html/body/form/input[3]').click()
        sleep(2)
        # 鼠标右击
        right_click_btn = self.driver.find_element_by_xpath('/html/body/form/input[4]')
        ActionChains(self.driver).context_click(right_click_btn).perform()
        sleep(2)

    # 键盘操作
    def test_keyboard(self):
        self.driver.get('http://www.baidu.com')
        kw = self.driver.find_element_by_id('kw')
        kw.send_keys("selenium")
        # 使用键盘全选 command+A
        kw.send_keys(Keys.COMMAND, 'a')
        sleep(2)
        # 使用键盘剪贴 command+X
        kw.send_keys(Keys.COMMAND, 'x')
        sleep(2)
        # 使用键盘粘贴 command+V
        kw.send_keys(Keys.COMMAND, 'v')
        sleep(2)
        # 鼠标移动到某个元素
        ActionChains(self.driver).move_to_element(self.driver.find_element_by_link_text('百度首页')).perform()
        sleep(2)
        self.driver.quit()
    # 模拟键盘组合键
    def test_keyboard2(self):
        self.driver.get('http://www.baidu.com')
        input = self.driver.find_element_by_id('kw')
        input.send_keys('python')
        # 表示按下command键,send_keys('a')类似模拟了A键,组合起来就是Command+A,而key_down(Keys.COMMAND)表示释放Command键
        ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('a').key_up(Keys.COMMAND).perform()
        sleep(2)
        ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('x').key_up(Keys.COMMAND).perform()
        sleep(2)
        self.driver.find_element_by_id('kw').click()
        ActionChains(self.driver).key_down(Keys.COMMAND).send_keys('v').key_up(Keys.COMMAND).perform()
        self.driver.find_element_by_id('su').click()
        sleep(2)
        self.driver.quit()

if __name__ == '__main__':
    case = TestCase()
    # case.test_mouse()
    case.test_keyboard()
    case.test_keyboard2()