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自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Obsidian】【Git】使用gitee同步/保存obsidian笔记

Obisidian是一款markdown软件,使用它可以方便地记笔记、记录科研日常。然而如果在多个设备上使用obsidian,会牵扯到笔记/vault/仓库同步问题。下面来介绍如何用git管理obsidian。 1.创建gitee账号 略 2.下载Obsidian 略 3.新建git仓库 3.1在gitee上…

保姆版Vps安装灯塔(ARL)

因为灯塔的默认端口为5003,所以我们在安装之前就在防火墙里把我们的5003端口打开 打开端口步骤如下: 1.我们打开控制面板,在控制面板里点击 系统和安全 。如下图: 2.接着点击 Windows Defender防火墙,如下图: 3.再…

Vue 3 + Ts 钩子函数(hooks)的用法,以<script setup lang=“ts“/>语法糖形式 #reactive #ref

reactive <template><div><h2 click"increment">{{ count }}</h2></div> </template><script setup lang"ts"> import { ref, onMounted } from vue// 使用reactive创建响应式数据 const state reactive({cou…

架构篇14:高性能数据库集群-读写分离

文章目录 读写分离原理复制延迟分配机制小结 高性能数据库集群的第一种方式是“读写分离”&#xff0c;其本质是将访问压力分散到集群中的多个节点&#xff0c;但是没有分散存储压力&#xff1b;第二种方式是“分库分表”&#xff0c;既可以分散访问压力&#xff0c;又可以分散…

docker容器快速安装启动ES

1、安装 docker a、使用 Homebrew 安装 brew install --cask --appdir/Applications docker b、手动下载安装 1、安装包下载地址&#xff1a;Install Docker Desktop on Mac | Docker Docs 根据自己的笔记本型号选择&#xff0c;我这边选择的是 intel chip 2、下载安装即可&a…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

在本教程的前两部分&#xff0c;我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件&#xff0c;以及使用 Helm 在 Kubernetes 上安装 Prometheus。 在今天的教程中&#xff0c;我们将为你介绍以下内容&#xff1a; 安装 Grafana&#xff1b;集成 Promethe…

服务器数据恢复—EVA存储raid5硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EVA某型号存储&#xff0c;底层是RAID5阵列&#xff0c;划分了若干lun。 服务器故障&分析&#xff1a; 该存储设备中raid5阵列有两块硬盘掉线&#xff0c;存储中的lun丢失。 将故障服务器存储中的所有磁盘编号后取出&#xff0c;硬件…

linux C函数之strdup函数分析和getopt_long()的使用

函数原型&#xff1a; #include <string.h> char *strdup(const char *s); 函数介绍&#xff1a; strdup()函数主要是拷贝字符串s的一个副本&#xff0c;有函数返回值返回&#xff0c;这个副本有自己的内存空间&#xff0c;和s没有关联。strdup函数复制一个字符串&…

三字棋游戏的实现

头文件&#xff1a; #define row 5 #define line 5 #include <stdio.h> #include <stdlib.h> #include <time.h> void initial(char board[row][line]); void print_board(char board[row][line]); void player_move(char board[row][line]); char is_win(c…

如何正确利用点对点传输工具来传输文件

P2P技术作为一种创新的数据交换机制&#xff0c;近年来已经获得了广泛的关注和应用。这种技术通过直接在用户之间建立连接&#xff0c;绕过了传统的中心服务器架构&#xff0c;从而在数据传输效率和速度上实现了显著提升。然而&#xff0c;正如硬币有两面&#xff0c;P2P技术同…

爬虫正则+bs4+xpath+综合实战详解

Day3 - 1.数据解析概述_哔哩哔哩_bilibili 聚焦爬虫&#xff1a;爬取页面中指定的页面内容 编码流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 数据解析 -> 持久化存储 数据解析分类&#xff1a;正则、bs4、xpath(本教程的重点) 数据解析原理概述&am…

OpenCV——Scharr边缘检测

目录 一、Scharr算法1、算法概述2、主要函数 二、C代码三、python代码四、结果展示1、灰度图2、X方向一阶边缘2、Y方向一阶边缘3、整幅图像的一阶边缘 五、相关链接 OpenCV——Scharr边缘检测由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&…

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 此自动化脚本将帮助你使用 Python 中的 Android 调试桥 (ADB) 自动化你的智能手机。下面我将展示如何自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 您可以了解有关 ADB 的更多信息,…

2695. 包装数组

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 创建一个名为 ArrayWrapper 的类&#xff0c;它在其构造函数中接受一个整数数组作为参数。该…

什么是网络安全,如何防范?

网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全涵盖了网络设备安全、网络信息安全…

json数据转换为file文件格式

const jsonData {name:小明,age:18}; //转成字符串 const jsonStrings JSON.stringify(jsonData); // 创建Blob对象 const blob new Blob([jsonStrings],{type:application/json}); //转成文件 const file new File([blob],fileName.json,{type:application/json});

kaafka的rebalance机制

Kafka的Rebalance机制是为了实现高可用和负载均衡而设计的。当Kafka集群中的消费者组发生变化时&#xff08;例如有新的消费者加入或有消费者离开&#xff09;&#xff0c;Rebalance机制会自动重新分配分区给消费者&#xff0c;以确保每个消费者分配到大致相等的负载。 下面是…

优化管理流程 夯实管理基石

问团队就人才中心管理流程的梳理及优化设计、工作规范与管理制度梳理、跨部门与部门内部协作配合有效性等方面提出了诸多管理思路与方法工具&#xff0c;中心干部员工通过3个月的学习与参与项目&#xff0c;展现了更加积极的工作状态&#xff0c;并学习到了更为先进并科学的工作…

如何用AirServer进行手机投屏?,Airserver 永久激活注册码

AirServer一款投屏神器&#xff0c;可以帮你轻松地将iPhone、iPad投屏到Mac。是不是经常看到游戏主播用AirServer投屏&#xff1f;此外&#xff0c;AirServer也是视频Up主必备工具之一&#xff01;用来录制演示教程不错。除了实现单个手机投屏到电脑或荧幕。如果你有多画面投屏…

原神启动(递推,矩阵)

Part 1. 引子 求有多少 1 ∼ n 1\sim n 1∼n的排列&#xff0c;满足&#xff1a; 进行 k k k轮原神排序后变为升序 具体的&#xff0c;一轮原神排序的定义为&#xff1a; 指针 i i i按 [ 1 , n ) [1,n) [1,n)的顺序正序遍历&#xff0c;如果 a i > a i 1 a_i>a_{i1}…