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:鼠标左键点击
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:鼠标右击
action=ActionChains(driver)
action.context_click().perform() # 在鼠标当前位置右击# 鼠标在 '新闻' 元素位置右击
action.context_click(driver.find_element_by_link_text('新闻')).perform()
示例3:鼠标双击操作
action=ActionChains(driver)
action.double_click().perform() # 在鼠标当前位置双击# 鼠标在 '新闻' 元素位置双击击
action.double_click(driver.find_element_by_link_text('新闻')).perform()
示例4:鼠标移动
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 却不出来。所以在实际应用中,还需要对具体的产品页面做相应的处理。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036怕【暗号:csdn999】
示例5:鼠标悬停
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:鼠标拖拽
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:鼠标释放操
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)方法。具体使用如下示例:
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)组合实现。
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也支持组合键盘操作。
代码示例如下:
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)
END今天的分享就到此结束了,点赞关注不迷路~
相关文章:

selenium自动化测试入门 —— 键盘鼠标事件ActionChains
在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中,有一个专门的类来负责实现这些测试场…...

高级运维学习(十四)Zabbix监控(一)
一 监控概述 1 监控的目的 (1)报告系统运行状况 每一部分必须同时监控内容包括吞吐量、反应时间、使用率等 (2)提前发现问题 进行服务器性能调整前,知道调整什么找出系统的瓶颈在什么地方 2 监控的资源类别 …...

vite + electron引入itk报错
代码 import { readImageArrayBuffer } from itk-wasm console.log(readImageArrayBuffer)通过itk-wasm官网,创建新的项目vitevue(vue2或者vue3),都没问题。加入electeon后包此错。通过排查,意外找到原因,…...

大厂面试题-MySQL为什么使用B+Tree作为索引结构
从几个方面来回答: 首先,常规的数据库存储引擎,一般都是采用B树或者B树来实现索引的存储。 (如图)因为B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。 而对…...
Tomcat的Engine容器
https://tomcat.apache.org/tomcat-10.1-doc/config/engine.html Engine元素代表与一个特定的Catalina Service关联的、整体的请求处理系统。它从一个或多个Connector接收并处理请求、返回完整的响应给Connector,以便最终传输给客户端。 在Service元素内部…...
vscode绿色行数设置
"workbench.colorCustomizations": {"editorLineNumber.foreground": "#00ff00"},...

闪站侠洗衣洗鞋管理系统app小程序开发;
闪站侠洗护软件系统为您提供全面的洗衣洗鞋解决方案,系统多门店,多网点。为您开通公中号小程序,并与顺丰、天猫、抖音、美团点评等第三方平台紧密连接。 我们解决洗衣工厂/门店的五大问题: 一、效率 从门店收衣到工厂出库…...
【操作系统】测试一
文章目录 单选题判断题简答题 单选题 ( )不是基本的操作系统。 A. 批处理操作系统 B. 分时操作系统 C. 实时操作系统 D. 网络操作系统 【 正确答案: D】 操作系统提供给程序员的接口是( )。 A. 进程 B. 系统调用 C. 库函数 D. B和…...

如何用sklearn对随机森林调参
文章目录 一、概述二、实操1、导入相关包2、导入乳腺癌数据集,建立模型3、调参 三、总结 Link:https://zhuanlan.zhihu.com/p/126288078 Author:陈罐头 一、概述 sklearn是目前python中十分流行的用来实现机器学习的第三方包,其中…...
Java中单例模式
什么是单例模式? 1. 构造方法私有化 2. 静态属性指向实例 3. public static的 getInstance方法,返回第二步的静态属性 饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。 package charactor;public class GiantDragon…...

第1章 现代通信网概述
文章目录 1.1 通信网的定义1.2 通信网的分类1.3 通信网的结构1.4 通信网的质量要求 1.1 通信网的定义 1.1.1 通信系统 1.1.2 通信网的定义 通信网是由一定数量的节点 (包括终端节点、交换节点) 和连接这些节点的传输链路有机地组织在一起,以实现两个或多个规…...

99%的时间里使用的14个git命令
学习14个Git命令,因为你将会在99%的时间里使用它们 【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等 https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502 必须了解的命令整理 1&…...

适用于 iOS 的 10 个最佳数据恢复工具分享
在当今的数字时代,我们的移动设备占据了我们生活的很大一部分。从令人难忘的照片和视频到重要的文档和消息,我们的 iOS 设备存储了大量我们无法承受丢失的数据。然而,事故时有发生,无论是由于软件故障、无意删除,甚至是…...

泛微E-Mobile 6.0命令执行漏洞
声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、漏洞原理 泛微E-Mobile 6.0存在命令执行漏洞的问题,在…...
React 共享组件状态及其实践
React 是一个强大的JavaScript库,它提供了一种简单的方式来构建用户界面。然而,随着应用规模的增长,状态管理成为一个复杂的问题。本篇文章将深入探讨如何在React组件之间共享状态。 状态提升 首先,我们来谈谈"状态提升&qu…...
linux目录说明
我一般会在/opt目录下创建 一个software目录,用来存放我们从官网下载的软件格式是.tar.gz文件,或者通过 wget地址下载的.tar.gz文件 执行解压缩命令,这里以nginx举例 tar -zxvf nginx-1.16.0.tar.gz -C /usr/local/src/ 把源码解压到/usr/loc…...

成集云 | 英克对接零售O2O+线上商城 | 解决方案
方案介绍 零售O2O线上商城是一种新型的商业模式,它通过线上和线下的融合,提供更加便捷的购物体验。其中,O2O指的是线上与线下的结合,通过互联网平台与实体店面的结合,实现线上线下的互动和协同。线上商城则是指通过互…...

java传base64返回给数据报404踩坑
一、问题复现 1.可能因为base64字符太长,导致后端处理时出错,表现为前端请求报400错误; 这一步debug进去发现base64数据是正常传值的 所以排除掉不是后端问题,但是看了下前端请求,猜测可能是转换base64时间太长数据过大导致的404 2.前端传…...

【Delphi】Android 开发HTTP请求出错解决方案
目录 一、故障现象 二、原因及解决方案 一、故障现象 在android内建的WebBrowser浏览器中通过http访问一个网站(注意不是https),出现如下错误提示: 在使用ntfy的时候,访问http定义的服务器地址(注意不是…...

Kafka中遇到的错误:
1、原因:kafka是一个去中心化结果的,所以在启动Kafka的时候,每一个节点上都需要启动。 启动的命令:kafka-server-start.sh -daemon /usr/local/soft/kafka_2.11-1.0.0/config/server.properties...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...