selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是 ActionChains类,在使用该类做键盘操作的过程中会配合使用到 Keys 数据存储类,Keys包含键盘上所有特殊按键。

一、鼠标点击操作

click(element=None) 左击
context_click(element=None) 右击
double_click(element=None) 双击
move_to_element(element) 移动鼠标到元素中间(悬停)
drag_and_drop(source,target) source上按下左键拖动到target元素上
click_and_hold(element=None) 在元素上按下鼠标左键
release() 释放鼠标
**perform()**执行ActionChains中存储的动作

element有None默认值的表示不传入参数该动作在原地执行。

鼠标事件具体使用示例如下:

示例1:鼠标左键点击

python 复制代码
action=ActionChains(driver)

action.click() # 在鼠标当前位置单击

action.perform() # 执行action存储的动作


# 鼠标在 '新闻' 元素位置单击

action.click(driver.find_element_by_link_text('新闻')).perform()

注意:action.click() 动作并未执行,它只是存储在action实例中,需要通过action.perform()方法执行存储动作;鼠标键盘事件动作动作可以存储多个,然后一次性执行。如下执行Cytl+C:

复制代码
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

示例2:鼠标右击

python 复制代码
action=ActionChains(driver)

action.context_click().perform() # 在鼠标当前位置右击


# 鼠标在 '新闻' 元素位置右击

action.context_click(driver.find_element_by_link_text('新闻')).perform()

示例3:鼠标双击操作

python 复制代码
action=ActionChains(driver)

action.double_click().perform() # 在鼠标当前位置双击


# 鼠标在 '新闻' 元素位置双击击

action.double_click(driver.find_element_by_link_text('新闻')).perform()

示例4:鼠标移动

python 复制代码
action = ActionChains(driver)

element=driver.find_element_by_link_text('设置')

# 鼠标移动到 '新闻' 元素上的中心点

action.move_to_element(element).perform()


# 鼠标在原位置向x轴移动xoffset、y轴移动yoffset;xoffset、yoffset可为正负数

action.move_by_offset(-200,100).perform()


# 鼠标移动到element元素中心点偏移xoffset、yoffset

action.move_to_element_with_offset(element,-500,600).perform()

action.move_by_offset(xoffset,yoffset) 这里需要注意,如果 xoffset 为负数,表示横坐标向左移动,yoffset 为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,鼠标只能移到屏幕最边界的位置。

鼠标移动操作在测试环境中比较常用到的场景是需要获取某元素的 flyover/tips,实际应用中很多 flyover 只有当鼠标移动到这个元素之后才出现,所以这个时候通过执行 move_to_element(to_element) 操作,就能达到预期的效果。

根据我个人的经验,这个方法对于某些特定产品的图标的 flyover/tips 也不起作用,虽然在手动操作的时移动鼠标到这些图标上面可出现 flyover,但当使用 WebDriver 来模拟这一操作时,虽然方法成功执行,但 flyover 却不出来。所以在实际应用中,还需要对具体的产品页面做相应的处理。

示例5:鼠标悬停

python 复制代码
action.click_and_hold().perform() # 鼠标在当前位置按下并不释放

# 鼠标 在'设置' 上悬停

action.click_and_hold(driver.find_element_by_link_text('设置')).perform()

action.click_and_hold(element) 这个方法实际上是执行了两个动作,首先是鼠标移动到元素 element,然后再 click_and_hold, 所以这个方法也可以写成 action.move_to_element(element).click_and_hold()。

示例6:鼠标拖拽

python 复制代码
source = driver.find_element_by_id("kw") # 获取起始位置元素

target = driver.find_element_by_id("sk") # 获取目标元素

# 将元素source拖动到target的位置

ActionChains(driver).drag_and_drop(source, target).perform()


# 鼠标拖拽动作,将 source 元素向x、y轴方向移动 (xoffset, yoffset) ,其中 xoffset 为横坐标,yoffset 为纵坐标。

ActionChains(driver).drag_and_drop_by_offset(source, -100, 100).perform()

在这个拖拽的过程中,已经使用到了鼠标的组合动作,首先是鼠标点击并按住 click_and_hold( source) 元素,然后执行鼠标移动动作 (move_to),移动到 target 元素位置或者是 (xoffset, yoffset) 位置,再执行鼠标的释放动作 (release)。所以上面的方法也可以拆分成以下的几个执行动作来完成:

复制代码
ActionChains(driver).click_and_hold(source).move_to_element(target).release().perform()

示例7:鼠标释放操

python 复制代码
action = ActionChains(driver)

action.release().perform() # 释放按下的鼠标

二、键盘操作

对于键盘的模拟操作,ActionChains类中有提供了按下key_down(keys)、释放key_up(keys)、按下并释放send_keys(keys_to_send) 等方法。

键盘的操作有普通键盘和修饰键盘两种 。

普通键盘为常用字母数字等;修饰键盘为Ctrl、Shift、Alt等,修饰键盘一般和其他键组合使用的键。

使用键盘操作时需要引入from selenium.webdriver.common.keys import Keys包,Keys 包中含所有特殊用键。

1、普通键盘操作

键盘操作使用send_keys(*keys_to_send)方法,该方法支持多个按键连续操作,如果需要对某个元素执行按键操作使用send_keys_to_element( element, *keys_to_send)方法。具体使用如下示例:

python 复制代码
from selenium.webdriver.common.keys import Keys

action = ActionChains(driver)

action.send_keys(Keys.SPACE).perform() # 按下并释放空格键

action.send_keys(Keys.TAB).perform() # 按下并释放Tab键

action.send_keys(Keys.BACKSPACE).perform() # 按下并释放Backspace键

action.send_keys(Keys.BACKSPACE,Keys.SPACE).perform() # 连续执行按键动作

action.send_keys(Keys.TAB).send_keys(Keys.TAB).perform() # 也可以这样组合


'''

针对某个元素发出某个键盘的按键操作,或者是输入操作

'''

element = driver.find_element_by_id('query')

# 对一元素使用键盘操作

action.send_keys_to_element(element, 'selenium').perform()

# 上面动作拆解为下面动作

action.click(element).send_keys('selenium').perform()

注意除了 ActionChains类有 send_keys(*keys_to_send)方法外,WebElement 类也有一个 send_keys_to_element(*keys_to_send)方法,这两个方法对于一般的输入操作基本上相同,不同点在于以下几点:

第一:Actions 中的 send_keys(*keys_to_send)对修饰键操作后并不会释放,也就是说当调用 actions.send_keys(Keys.ALT)、 actions.send_keys(Keys.CONTROL)、 action.send_keys(Keys.SHIFT) 的时候,相当于调用 actions.key_down(keys_to_send),而如果在现实的应用中想要模拟按下并且释放这些修饰键,应该先action.reset_actions()重设action,然后再调用 action.send_keys(keys.NULL).perform()取消按下的修饰键。

第三点,在 WebDriver 中,我们可以使用 WebElement 类的 send_keys() 来上传附件,比如 element.send_keys("D:\\test\\uploadfile\\test.jpg")上文件,但不能使用ActionChains来上传附件,因为type='file'的输入框并不支持键盘输入

2、修饰键的使用

修饰键是键盘上的一个或者一组特别的键,当它与一般按键同时使用时,用来临时改变一般键盘的普通行为。

修饰键一般跟普通键组合使用,比如 Ctrl+A、Alt+F4等。

我们电脑中的修饰键一般有以下几种修:Ctrl、Alt(Option)、Shift、AltGr、Windows logo、Command、FN(Function)。一般使用的都是前三种。

对于修饰键的使用在Python selenium中一般使用按下key_down(keys)、释放key_up(keys)、按下并释放send_keys(keys_to_send)组合实现。

python 复制代码
action = ActionChains(driver)

action.key_down(Keys.CONTROL).perform() # 按下ctrl键

action.key_up(Keys.CONTROL).perform() # 释放ctrl键


action.key_down(Keys.SHIFT).perform() # 按下shift键

action.key_up(Keys.SHIFT).perform() # 释放shift键


action.key_down(Keys.ALT).perform() # 按下alt键

action.key_up(Keys.ALT).perform() # 释放alt键

示例:通过ctrl+c 来复制文本

复制代码
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

三、WebElement.send_keys()键盘操作

WebElement元素对象下的send_keys也支持组合键盘操作。

代码示例如下:

python 复制代码
element = driver.find_element_by_id('query')

element.send_keys('selenium')

element.send_keys(Keys.BACK_SPACE) # 按BACKSPACE删除一个字符

element.send_keys(Keys.SPACE) # 空格键(Space)

element.send_keys(Keys.CONTROL, 'a') # 全选(Ctrl+A)

element.send_keys(Keys.CONTROL, 'c') # 复制(Ctrl+C)

element.send_keys(Keys.CONTROL, 'v') # 粘贴(Ctrl+v)

element.send_keys(Keys.TAB) # 制表键(Tab)

element.send_keys(Keys.ESCAPE) # 回退键(Esc)

element.send_keys(Keys.ENTER) # 回车键(Enter)

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
阿巴~阿巴~3 小时前
测试用例设计万能公式:功能到安全
软件测试·测试
wan5555cn8 小时前
Windows 11系统鼠标键盘被禁用问题的全面解决方案
windows·笔记·深度学习·计算机外设
mtouch3338 小时前
GIS PAD平板手机移动端地理信息系统
智能手机·电脑·电子沙盘·数字沙盘·平板·军事公安三维数字沙盘系统·态势标绘推演模拟仿真
驱动开发0071 天前
虚拟摄像头VirtualUSB UVC CAMERA下载 支持将手机摄像头映射成PC端摄像头
驱动开发·安全·电脑
依旧很淡定1 天前
Selenium(Python)创建Chrome浏览器实例
chrome·python·selenium
不方便,你要方便吗?1 天前
非小米电脑安装电脑管家实现互联互通
电脑
梁萌1 天前
自动化测试框架playwright使用
自动化测试·python·ui自动化·playwright
可可南木2 天前
ICT 数字测试原理 8 - -VCL 的测试参数
开发语言·功能测试·测试工具·pcb工艺
加油20192 天前
爬虫框架: selenium API使用介绍
爬虫·selenium·测试工具