Python + Selenium —— ActionChains动作链!

当你需要执行复杂的操作时,比如将一个元素按住拖动到另一个元素上去,需要移动鼠标然后点击并按下键盘某个按键等等。

当然,在 Web 页面上,这种操作好像比较少。

但是,如果遇到了怎么办呢?这就需要用到 ActionChains 这个类啦。

ActionChains 提供了对动作的链式操作,也就是可以生成一个操作的队列,将复杂的操作过程分解成单个操作,然后组合起来一次性执行。

这里面主要是鼠标操作,加上一些键盘操作。

以简单的鼠标移动为例,京东首页上的商品二级分类默认处于隐藏状态,需要将鼠标移动到一级分类上才会显示。
 

图片


我们可以模拟鼠标移动,到元素上然后再点击二级菜单,比如我们先点击家用电器,再点击超薄电视。

# 两种写法,一种是直接链式调用,另一种分别调用
# 直接链式调用
from selenium.webdriver import ActionChains
# ... 省略打开过程
e = driver.find_element_by_link_text("家用电器")
# 将鼠标悬停在家用电器上,暂停0.1s
ActionChains(driver).move_to_element(e).pause(0.1).perform()

# 第二种
action = ActionChains(driver)
action.move_to_element(e)
action.pause(0.1)
action.perform()

无论哪种方式,动作都是按照它们被调用的顺序执行。

通过 ActionChains 的对象生成操作队列,在没有执行提交 perform() 之前,所有操作只是暂存于队列中,不会实际在页面上操作,需要执行 perform() 时才会实际执行操作。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

除了上面的鼠标悬停 move_to_element 操作外,还有其他的一些操作:

鼠标悬停

1. move_by_offset(xoffset, yoffset) 鼠标移动偏移量

ActionChains(driver).move_by_offset(100, 100).perform()

偏移量: 从当前位置增加和减少的坐标值, 正数为增加,负数为减少。

从当前鼠标位置向右下移动,假设当前位置为(300,500),则移动到(400, 600)。

2. move_to_element(to_element)鼠标移动到指定元素

e = driver.find_element_by_id('su')
ActionChains(driver).move_to_element(e).perform()

3. move_to_element_with_offset(to_element, xoffset, yoffset) 将鼠标移动到基于元素的偏移量,偏移量基于鼠标左上角的坐标点

e = driver.find_element_by_id('su')
ActionChains(driver).move_to_element_with_offset(e, 100, 100).perform()

移动到 id 为 su 的元素右下方。

鼠标点击

1. click(on_element=None) 点击指定元素,如果没有指定元素,则点击当前鼠标所在位置

e = driver.find_element_by_id('su')
ActionChains(driver).click(e).perform()

2. double_click(on_element=None) 双击元素,如果没有指定元素则在当前鼠标位置双击

e = driver.find_element_by_id('su')
ActionChains(driver).double_click(e).perform()

3. context_click(on_element=None) 在元素上点击鼠标右键,如果没有指定则在当前鼠标位置单击右键

e = driver.find_element_by_id('su')
ActionChains(driver).context_click(e).perform()

4. click_and_hold(on_element=None) 鼠标按下不松

e = driver.find_element_by_id('su')
ActionChains(driver).click_and_hold(e).perform()

注意,此时鼠标一直处于按下状态,直到执行 release() 释放鼠标的操作。

拖动元素

这类操作相当于是鼠标按住某个元素,然后移动鼠标,实现对元素的拖动操作。当然前提是你操作的元素要能够支持拖动。

1. drag_and_drop(source, target) 在 source 元素上按下鼠标左键,并拖动到 target 元素并松开鼠标

e1 = driver.find_element_by_id('source')
e2 = driver.find_element_by_id('target')
ActionChains(driver).drag_and_drop(e1, e2).perform()

按住 e1 元素,拖动到 e2 元素。

2. drag_and_drop_by_offset(source, xoffset, yoffset) 在source元素上按下鼠标左键,并按偏移量拖动

e = driver.find_element_by_id('source')
ActionChains(driver).drag_and_drop_by_offset(e, -100, -100).perform()

从 e 元素的位置向左上角移动。

键盘操作

1. send_keys(*keys_to_send)在当前焦点元素发送按键

ActionChains(driver).send_keys('手机').perform()

2. send_keys_to_element(self, element, *keys_to_send)向指定元素发送按键

e = driver.find_element_by_id('kw')
ActionChains(driver).send_keys_to_element(e, '测试').perform()

3. key_down(value, element=None) 按下一个特殊按键
只能用于 Ctrl, Alt,Shift 键,注意此时按键只是按下并没有松开,用于进行按键组合操作,如 Ctrl+A。

4. key_up( value, element=None) 释放一个按下的键
与 key_down() 配套使用,用于释放一个已按下的按键,只能用于 Ctrl, Alt,Shift 键
如果要发送组合键,要这么写:

ActionChains(driver).key_down(Keys.CONTROL) \
	.send_keys('c').key_up(Keys.CONTROL).perform()

队列操作

1. perform() 提交队列中的所有操作
所有操作都需要通过 perform() 才会实际提交到浏览器。

2. rest_actions() 清空队列中的操作
将队列中已存储的操作清空。

3. pause(seconds) 暂停所有动作
相当于等待,用于链式操作过程中的等待。

4. release(on_element=None) 松开按下的鼠标
如果有鼠标按下的操作,那么需要通过 release() 释放鼠标。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/342352.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】字节三面:请举例阐释访问者模式

今天我们要一起探讨的主题是一种设计模式——访问者模式(Visitor Pattern)。我将从最基础的概念、应用场景,再到实例代码的展示,全方位的为大家剖析访问者模式。而且,我保证,你即使是编程新手,也能理解并开始应用这个设…

二、类加载、连接和初始化

1. 类从加载、连接、初始化,到卸载的生命周期及概述 加载:查找并加载 class 文件中的二进制数据 连接:将已读入内存的 class 文件的二进制数据合并到 JVM 运行时环境中去,包含如下几个步骤: 验证:确保被加…

自学网安-DNS

01DNS Domain Name Service域名服务 作用:为客户机提供域名解析服务器 02域名组成 2.1域名组成概述 如"www.sina.com.cn"是一个域名,从严格意义上讲,"sina.com.cn"才被称为域名(全球唯一),而"www"…

finalshell连接linux的kali系统

kali的ssh服务似乎是默认关闭的,笔者在玩CentOS系统时可以直接用finalshell完成连接,但kali不行,需要先手动开启ssh服务。 开启kali的ssh服务 输入【ssh start】命令开启ssh服务,可以用【ssh status】命令查看ssh状态&#xff0c…

BL0942 内置时钟免校准计量芯片 用于智能家居领域 上海贝岭 低成本 使用指南

BL0939是上海贝岭股份有限公司开发的一款用于智能家居领域进行电能测量的专用芯片,支持两路测量,可同时进行计量和漏电故障检测,漏电检测电流可设,响应时间快,具有体积小,外围电路简单,成本低廉…

风丘车辆热管理测试方案

车辆热管理是在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生的。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统;控制和优化车辆的热量传递过程,保证各关键部件和系统安全高效运行&…

uniapp小程序实现自定义返回按钮和胶囊对齐 做到兼容各手机型号

效果&#xff1a; 用到的API&#xff1a; uni.getMenuButtonBoundingClientRect();官网地址&#xff1a; https://uniapp.dcloud.net.cn/api/ui/menuButton.html#getmenubuttonboundingclientrect 控制台打印&#xff1a; 代码示例&#xff1a; <template><view cl…

MNIST 数据集详析:使用残差网络RESNET识别手写数字(文末送书)

MNIST 数据集已经是一个几乎每个初学者都会接触的数据集, 很多实验、很多模型都会以MNIST 数据集作为训练对象, 不过有些人可能对它还不是很了解, 那么今天我们一起来学习一下MNIST 数据集&#xff0c;同时构建残差网络来识别手写数字。 1.MNIST 介绍 MNIST手写数字数据库具有…

Java 数据结构篇-实现红黑树的核心方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 红黑树的说明 2.0 红黑树的特性 3.0 红黑树的成员变量及其构造方法 4.0 实现红黑树的核心方法 4.1 红黑树内部类的核心方法 &#xff08;1&#xff09;判断当前…

微信小程序之WXSS模板样式、页面配置(.json)和网络数据请求

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

机器学习整理

绪论 什么是机器学习&#xff1f; 机器学习研究能够从经验中自动提升自身性能的计算机算法。 机器学习经历了哪几个阶段&#xff1f; 推理期&#xff1a;赋予机器逻辑推理能力 知识期&#xff1a;使机器拥有知识 学习期&#xff1a;让机器自己学习 什么是有监督学习和无监…

Go使用记忆化搜索的套路【以20240121力扣每日一题为例】

题目 分析 这道题很明显记忆化搜索&#xff0c;用py很容易写出来 Python class Solution:def splitArray(self, nums: List[int], k: int) -> int:n len(nums)# 寻找分割子数组中和的最小的最大值s [0]for num in nums:s.append(s[-1] num)#print(s)cachedef dfs(cur,…

WampServer

开发笔记 推荐链接php无法保存SESSION问题部署SSL时候产生的问题 推荐链接 链接目录 php无法保存SESSION问题 php.ini文件和phpForApache.ini 文件 里面都有 对路径的控制&#xff0c;相关路径问题可能也需要进行修改&#xff0c;打开文件搜索wamp64或wamp 就可以看到了&…

火山引擎ByteHouse:“专用向量数据库”与“数据库+向量扩展”,怎么选?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 背景 随着LLM&#xff08;Large Language Model&#xff09;的不断发展&#xff0c;向量检索也逐渐成为关注的焦点。LLM通过处理大量的文本数据&#xff0c;获取丰…

第9章-网络设备基本调试

1. 网络连通性测试 ping命令 定义&#xff1a;基于ICMP协议开发的应用程序&#xff0c;检测网络连通性&#xff1b; 功能&#xff1a; ① 检测网络连接的状态&#xff1b; ② 检测目标计算机是否在线&#xff1b; ③ 定位故障排除&#xff1b; ④ 检测网络延迟和丢包情况&#…

c++QT文件IO

1、QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗。弹出的结果&#xff08;选择文件的路径&#xff09;通过返回值获取。 1&#xff09;获取一个打开或保存的文件路径 // 获取一个打开或保存的文件路…

Linux:动静态库的概念制作和底层工作原理

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容&#xff1f;小结 动态库加载库和程序都要加载可执行程序的地址问题地址问题逻辑地址和平坦模式绝对编址和相对编址与位置无关码…

esxi配置NTP自动对时与手动对时

目录 背景解法配置NTP服务器立即与NTP服务器同步时间 附&#xff1a;几个常用的NTP服务器列表 背景 VMware ESXi 6.7运行了一段时间后偶然发现系统时间与标准时间有5分钟左右的差异&#xff0c;于是研究了下如何自动对时以及用命令行立即对时。 解法 配置NTP服务器 首先在管…

啥,ui叫我做一个移动端好看的轮播--异形的Slide

先看效果,得实现两边的缩放和无线滚动 实现方法 我的基础架构是 next.jsswiper 下载swiper包 yarn add swiper下载后在页面中引用 import { useEffect, useState } from "react"; import styles from "./index.module.css"; import Image from "n…

DataStream API(源算子)

目录 源算子 1&#xff0c;从集合中读取数据 2&#xff0c;从文件读取数据 3&#xff0c;从 Socket 读取数据 4&#xff0c;从 Kafka 读取数据 5&#xff0c;自定义源算子 6&#xff0c;Flink 支持的数据类型 6.1 Flink 支持多种数据类型&#xff0c;包括但不限于&…