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)

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

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

相关推荐
hgdlip11 小时前
如何快速切换电脑的ip地址
网络·tcp/ip·电脑
missmisslulu14 小时前
电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!
学习·ios·电脑·平板
GEEKVIP15 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
GEEKVIP15 小时前
如何在 Windows 10 上恢复未保存/删除的 Word 文档
macos·ios·智能手机·电脑·word·笔记本电脑·iphone
奇客软件16 小时前
iPhone使用技巧:如何恢复变砖的 iPhone 或 iPad
数码相机·macos·ios·电脑·笔记本电脑·iphone·ipad
大模型八哥19 小时前
大模型扫盲系列——大模型实用技术介绍(上)
人工智能·程序人生·ai·大模型·llm·llama·ai大模型
小白电脑技术1 天前
USB 3.0?USB 3.1?USB 3.2?怎么区分?
电脑
___Dream1 天前
【黑马软件测试三】web功能测试、抓包
前端·功能测试
哲伦贼稳妥1 天前
一天认识一个硬件之电源
运维·其他·电脑·硬件工程
wdxylb2 天前
Pyhton爬虫使用Selenium实现浏览器自动化操作抓取网页
爬虫·selenium·测试工具