selenium中ActionChains方法详细讲解

前言

   本文将介绍Selenium中的ActionChains类及其使用方法,帮助您模拟用户在网页上的鼠标和键盘操作。了解ActionChains的常用方法和示例代码,可轻松实现移动鼠标、点击元素、拖拽元素等操作。通过本文的学习,您能更好地应用ActionChains解决自动化测试或网页爬取中的问题。

演示html文件

<!DOCTYPE html>
<html><head><title>操作HTML示例</title><script>function clickButton() {var button = document.getElementById("clickButton");button.click();}function doubleClickButton() {var button = document.getElementById("doubleClickButton");var event = new MouseEvent('dblclick', { bubbles: true, cancelable: true });button.dispatchEvent(event);}function initSlider() {var slider_1 = document.getElementById("slider_1");var isDragging = false;var offset = { x: 0, y: 0 };slider_1.addEventListener("mousedown", startDrag);slider_1.addEventListener("mouseup", stopDrag);slider_1.addEventListener("mousemove", drag);slider_1.addEventListener("mouseleave", stopDrag);function startDrag(e) {isDragging = true;offset.x = e.clientX - slider_1.offsetLeft;offset.y = e.clientY - slider_1.offsetTop;}function stopDrag() {isDragging = false;}function drag(e) {if (isDragging) {var newX = e.clientX - offset.x;var newY = e.clientY - offset.y;slider_1.style.left = newX + "px";slider_1.style.top = newY + "px";}}}function handleKeyUp(event) {if (event.keyCode === 119) {// F8键的keycode为119alert("释放了F8键");}}</script>
</head><body><h1>操作HTML示例</h1><button id="clickButton" onclick="alert('单击按钮')">单击按钮</button><button id="doubleClickButton" ondblclick="alert('双击按钮')">双击按钮</button><div><input id="slider" type="range" min="0" max="100" step="1" value="50" style="width: 200px;"><input id="slider_2" type="range" min="0" max="100" step="1" value="50"style="height: 200px; transform: rotate(270deg);"></div><div id="box" style="width: 230px; height: 200px; background-color: lightblue; position: relative;"><div id="slider_1"style="width: 30px; height: 30px; background-color: red; position: absolute; top: 80px; left: 100px; cursor: move;"></div></div><script>window.addEventListener("load", initSlider);window.addEventListener("keyup", handleKeyUp);</script>
</body></html>

一、使用方法

1、方法说明

方法说明参数
move_to_element(element)将鼠标移动到指定元素上方element: 要移动到的目标元素
click()左键单击当前鼠标位置
click_and_hold()按住并且不释放鼠标左键
release()释放鼠标左键
context_click()右键单击当前鼠标位置
double_click()双击当前鼠标位置
drag_and_drop(source, target)将一个元素从源位置拖拽到目标位置source: 要拖动的源元素
target: 要拖动到的目标元素
drag_and_drop_by_offset(source, xoffset, yoffset)将一个元素从源位置按指定偏移量拖拽到目标位置source: 要拖动的源元素
xoffset: 横向偏移量
yoffset: 纵向偏移量
move_by_offset(xoffset, yoffset)将鼠标相对于当前位置按指定偏移量移动xoffset: 横向偏移量
yoffset: 纵向偏移量
key_down(value, element=None)模拟按下某个键盘按键,可选择指定元素value: 要按下的键盘按键值
element(可选): 要操作的元素
key_up(value, element=None)模拟释放某个键盘按键,可选择指定元素value: 要释放的键盘按键值
element(可选): 要操作的元素
pause(seconds)暂停执行一段时间seconds: 暂停的时间,单位为秒
perform()执行已定义的操作序列

2、左键单击当前鼠标位置

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains# 创建Chrome浏览器的WebDriver实例
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 打开网页
driver.get("file:///C:/Users/admin/Desktop/Demo.html")# 创建 actions 的 ActionChains 对象
actions = ActionChains(driver)# 定位到需要点击的按钮
click = driver.find_element_by_css_selector('[id="clickButton"]')
# 将鼠标移动到按钮上
actions.move_to_element(click)
# 鼠标左键
actions.click()
# 执行操作(必须要有该方法,否则操作不会执行)
actions.perform()# 简化代码
click = driver.find_element_by_css_selector('[id="clickButton"]')
ActionChains(driver).move_to_element(click).click().perform()

3、双击当前鼠标位置

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains# 创建Chrome浏览器的WebDriver实例
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 打开网页
driver.get("file:///C:/Users/admin/Desktop/Demo.html")# 创建 actions 的 ActionChains 对象
actions = ActionChains(driver)# 定位到需要点击的按钮
click = driver.find_element_by_css_selector('[id="doubleClickButton"]')
# 将鼠标移动到按钮上
actions.move_to_element(click)
# 鼠标双击
actions.double_click()
# 执行操作(必须要有该方法,否则操作不会执行)
actions.perform()

4、鼠标拖拽元素移动

  • 场景一
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains# 创建Chrome浏览器的WebDriver实例
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 打开网页
driver.get("file:///C:/Users/admin/Desktop/Demo.html")# 创建 actions 的 ActionChains 对象
actions = ActionChains(driver)# 定位到需要拖拽的滑块元素
slider = driver.find_element_by_css_selector('[id="slider_1"]')# 将鼠标移动到滑块上
actions.move_to_element(slider)# 执行鼠标左键点击并按住不放
actions.click_and_hold()# 设置每次移动的偏移量
offset = 7# 模拟滑块的连续移动
for i in range(10):# 向右移动 offset 像素actions.move_by_offset(offset, 0)actions.pause(0.1)  # 添加暂停时间以控制移动速度# 向左移动 offset 像素
for i in range(10):actions.move_by_offset(-offset, 0)actions.pause(0.1)# 向下移动 offset 像素
for i in range(10):actions.move_by_offset(0, offset)actions.pause(0.1)# 向上移动 offset 像素
for i in range(10):actions.move_by_offset(0, -offset)actions.pause(0.1)# 释放鼠标左键
actions.release()# 执行操作
actions.perform()
  • 场景二
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains# 创建Chrome浏览器的WebDriver实例
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 打开网页
driver.get("file:///C:/Users/admin/Desktop/Demo.html")# 创建 actions 的 ActionChains 对象
actions = ActionChains(driver)# 定位到需要拖拽的滑块元素
slider = driver.find_element_by_css_selector('[id="slider"]')
# 滑动到指定位置
actions.drag_and_drop_by_offset(slider, 80, 0)# 定位到需要拖拽的滑块元素
slider_2 = driver.find_element_by_css_selector('[id="slider_2"]')
# 将鼠标移动到滑块上
actions.move_to_element(slider_2)
# 执行鼠标左键点击并按住不放
actions.click_and_hold()
# 滑动到指定位置
actions.move_by_offset(0, 50)
# 释放鼠标左键
actions.release()# 执行操作
actions.perform()

在这里插入图片描述

5、模拟键盘按键

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys# 创建Chrome浏览器的WebDriver实例
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 打开网页
driver.get("file:///C:/Users/admin/Desktop/Demo.html")# 创建 actions 的 ActionChains 对象
actions = ActionChains(driver)# 定位到需要拖拽的滑块元素
slider = driver.find_element_by_css_selector('[id="slider"]')# 模拟按下右键,滑块移动. 键盘键码自行百度
actions.key_down(Keys.ARROW_RIGHT, slider)# 模拟按下F8键
actions.key_down(Keys.F8)
# 模拟释放F8键
actions.key_up(Keys.F8)# 执行操作
actions.perform()

6、下拉列表滚动

  • 示例HTML文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>选择框</title><style>/* 样式可根据需要自行修改 */.select-box {position: relative;display: inline-block;width: 150px;height: 30px;border: 1px solid #aaa;}.select-box:hover {cursor: pointer;}.select-box > .selected-item {display: block;width: 100%;height: 100%;line-height: 30px;padding: 0 10px;}.select-box > .options {position: absolute;top: 100%;left: 0;z-index: 99;display: none;width: 100%;max-height: 200px;overflow-y: auto;border: 1px solid #aaa;background-color: #fff;}.select-box > .options > div {width: 100%;height: 30px;line-height: 30px;padding: 0 10px;}.select-box > .options > div:hover {background-color: #ccc;cursor: pointer;}</style>
</head>
<body><div class="select-box"><div class="selected-item">请选择</div><div class="options"><div>选项1</div><div>选项2</div><div>选项3</div><div>选项4</div><div>选项5</div><div>选项6</div><div>选项7</div><div>选项8</div><div>选项9</div><div>选项10</div><div>选项11</div><div>选项12</div><div>选项13</div><div>选项14</div><div>选项15</div><div>选项16</div><div>选项17</div><div id="test">选项18</div><!-- 这里添加更多的选项 --></div></div><script>var selectBox = document.querySelector('.select-box');var selectedItem = selectBox.querySelector('.selected-item');var options = selectBox.querySelector('.options');// 点击选择框时,切换选项列表的显示/隐藏状态selectBox.addEventListener('click', function() {if (options.style.display === 'none' || options.style.display === '') {options.style.display = 'block';} else {options.style.display = 'none';}});// 点击选项时,将选项值赋值到选择框上方的文本框中,并隐藏选项列表options.addEventListener('click', function(e) {if (e.target.tagName.toLowerCase() === 'div') {selectedItem.innerHTML = e.target.innerHTML;// options.style.display = 'none';}});</script>
</body>
</html>
  • 滚动方法
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep# 创建Chrome浏览器的WebDriver实例
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 打开网页
driver.get("file:///C:/Users/admin/Desktop/Demo.html")# 点击展开下拉列表
driver.find_element(By.CSS_SELECTOR, '.selected-item').click()# 定位到需要进行滚动的元素
element = driver.find_element(By.CSS_SELECTOR, '.options')# 使用鼠标拖拽方式向下滚动10个像素,执行下面的滚动方式时,必须包含这个。
ActionChains(driver).move_to_element(element).click_and_hold().move_by_offset(0, 10).perform()
# 如以上方法使用有问题,就使用该方法
# ActionChains(driver).move_to_element(element).click_and_hold().move_by_offset(0, 10).release().perform()
sleep(3)# 使用键盘按键方式滚动到页面底部
ActionChains(driver).move_to_element(element).send_keys(Keys.END).perform()
sleep(3)# 使用键盘按键方式滚动到页面顶部
ActionChains(driver).move_to_element(element).send_keys(Keys.HOME).perform()
sleep(3)# 使用键盘按键方式向下翻一页
ActionChains(driver).move_to_element(element).send_keys(Keys.PAGE_DOWN).perform()
sleep(3)# 使用键盘按键方式向上翻一页
ActionChains(driver).move_to_element(element).send_keys(Keys.PAGE_UP).perform()
sleep(3)# 关闭浏览器
driver.quit()

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

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

相关文章

Vue中开发中Mock和总线了解以及应用

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

内存对齐--面试常问问题和笔试常考问题

1.内存对齐的意义 C 内存对齐的主要意义可以简练概括为以下几点&#xff1a; 提高访问效率&#xff1a;内存对齐可以使数据在内存中以更加紧凑的方式存储&#xff0c;从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据&#xff0c;而不需要额外的字节偏移计…

jar包在linux服务器已经运行好,但是访问不到地址

jar包在linux服务器已经运行好&#xff0c;但是访问不到地址 1.将jar包已经上传到linux服务器&#xff0c;并且已经启动 2.但是在本地访问的时候&#xff0c;访问不到,云服务的的安全组策略也开放了相对应的端口。 3.解决方案 修改防火墙开放的接口 iptables -I INPUT -p t…

区块链实验室(26) - 区块链期刊Blockchain: Research and Applications

Elsevier出版物“Blockchain: Research and Applications”是浙江大学编审的期刊。该期刊自2020年创刊&#xff0c;并出版第1卷。每年出版4期&#xff0c;最新期是第4卷第3期(2023年9月)。 目前没有官方的IF&#xff0c;Elsevier的引用因子Citescore是6.4。 虽然是新刊&#xf…

不甘于被强势厂商捆绑,中国移动未来或自研5G基站

一直以来运营商被认为只是做服务&#xff0c;而设备等都是由设备商提供的&#xff0c;甚至由于如今的设备高度复杂&#xff0c;设备商已承包越来越多的基站运维工作&#xff0c;运营商的技术水平越来越低&#xff0c;不过随着中国移动发布5G射频芯片8676&#xff0c;似乎显示出…

CocosCreator3.8研究笔记(二十)CocosCreator UI组件(四)

RichText 组件 RichText 组件是富文本控件&#xff0c;实际是由多个 Label 节点拼装而成&#xff0c;用来显示一段带有不同样式效果的文字&#xff0c;通过BBCode 标签来设置文字的样式。 目前支持的样式有&#xff1a;颜色&#xff08;color&#xff09;、字体大小&#xff08…

介绍 Docker 的基本概念和优势V2.0

介绍 Docker 的基本概念和优势V2.0 一、Docker 的基本概念1.1 Docker 是什么&#xff1f;1.2 Docker 的组成部分1.3 Docker 的基本概念 二、Docker 的优势1. 轻量级&#xff1a;2. 可移植性&#xff1a;3. 自包含&#xff1a;4. 隔离性&#xff1a;5. 可扩展性&#xff1a;6. 易…

Vue中前端导出word文件

很多时候在工作中会碰到完全由前端导出word文件的需求&#xff0c;因此特地记录一下比较常用的几种方式。 一、提供一个word模板 该方法提供一个word模板文件&#xff0c;数据通过参数替换的方式传入word文件中&#xff0c;灵活性较差&#xff0c;适用于简单的文件导出。需要…

28 WEB漏洞-XSS跨站之WAF绕过及安全修复

目录 常规WAF绕过思路标签语法替换特殊符号干扰提交方式更改垃圾数据溢出加密解密算法结合其他漏洞绕过 自动化工具说明强大的fuzzing引擎安全修复方案演示案例&#xff1a; 常规WAF绕过思路 标签语法替换 xss的效果可以由多个代码来实现&#xff0c;就类似于我们使用到的其它…

2023-9-25 排队打水

题目链接&#xff1a;排队打水 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int N 100010;int n; int t[N];int main() {scanf("%d", &n);for(int i 0; i < n; i ) scanf("%d", &t…

【Java 基础篇】Executors工厂类详解

在多线程编程中&#xff0c;线程池是一项重要的工具&#xff0c;它可以有效地管理和控制线程的生命周期&#xff0c;提高程序的性能和可维护性。Java提供了java.util.concurrent包来支持线程池的创建和管理&#xff0c;而Executors工厂类是其中的一部分&#xff0c;它提供了一些…

基于UDP协议的网络服务器的模拟实现

目录 服务端类UdpServer的模拟实现 服务端类UdpServer的成员变量 服务端类UdpServer的构造函数、初始化函数initServer、析构函数 服务端类UdpServer的start函数 服务端类UdpServer的整体代码&#xff08;即udp_server.h文件的整体代码&#xff09; 基于服务端类UdpServe…

Tomcat中文路径目录

一、问题描述 linux环境下tomcat发布了包含中文名字的页面和文件&#xff0c;浏览器访问报404&#xff0c;非中文页面没有问题&#xff1b;本人为RP设计的原型图发布&#xff0c;其中包含了大量的中文文件和路径 二、解决步骤 第一步&#xff0c;设置tomcat&#xff0c;配置…

vue里使用elementui的级联选择器el-cascader进行懒加载的怎么实现数据回显?

需要实现的懒加载回显效果 比如&#xff1a;后端返回数据 广东省/广州市/天河区 &#xff1a;440000000000/440100000000/440106000000&#xff0c;需要我们自动展开到天河区的下一级&#xff0c;效果如下 代码实现 我的实现思路就是拿到 440000000000/440100000000/44010600…

Java版本企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

JavaScript 基础第三天笔记

JavaScript 基础第三天笔记 if 多分支语句和 switch的区别&#xff1a; 共同点 都能实现多分支选择&#xff0c; 多选1大部分情况下可以互换 区别&#xff1a; switch…case语句通常处理case为比较确定值的情况&#xff0c;而if…else…语句更加灵活&#xff0c;通常用于范围…

[每周一更]-(第64期):Dockerfile构造php定制化镜像

利用php官网镜像php:7.3-fpm&#xff0c;会存在部分插件缺失的情况&#xff0c;自行搭建可适用业务的镜像&#xff0c;才是真理 Dockerhub 上 PHP 官方基础镜像主要分为三个分支&#xff1a; cli: 没有开启 CGI 也就是说不能运行fpm。只可以运行命令行。fpm: 开启了CGI&#x…

PHP后台实现微信小程序登录

微信小程序官方给了十分详细的登陆时序图&#xff0c;当然为了安全着想&#xff0c;应该加上签名加密。 微信小程序端 1).调用wx.login获取 code 。 2).调用wx.getUserInfo获取签名所需的 rawData , signatrue , encryptData 。 3).发起请求将获取的数据发送的后台。 login: …

Spring学习笔记5 GoF之工厂模式

Spring学习笔记4 Bean的作用域_biubiubiu0706的博客-CSDN博客 出了GoF23种设计模式.还有javaee的设计模式(DAO模式,MVC模式) 设计模式:是一种可以被重复利用的解决方案 GoF23种设计模式可分为三大类: 创建型(5个):解决对象创建问题. 单例模式&#xff0c;工厂方法模式&#x…