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.hqwc.cn/news/120435.html

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

相关文章

SpringMVC 学习(二)Hello SpringMVC

3. Hello SpringMVC (1) 新建 maven 模块 springmvc-02-hellomvc (2) 确认依赖的导入 (3) 配置 web.xml <!--web/WEB-INF/web.xml--> <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee…

Android Logcat 命令行工具

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、日常用法3.1 面板介绍3.2 日志过滤…

Docker 容器技术 (上) 环境安装和部署、容器镜像、使用IDEA构建Springboot程序镜像、远程仓库、容器网络管理

Docker容器技术 文章目录 Docker容器技术容器技术入门环境安装和部署从虚拟机到容器容器工作机制简述 容器与镜像初识容器镜像镜像结构介绍构建镜像发布镜像到远程仓库实战&#xff1a;使用IDEA构建SpringBoot程序镜像 容器网络管理容器网络类型用户自定义网络容器间网络容器外…

Cocos Creator3.8 实战问题(一)cocos creator prefab 无法显示内容

问题描述&#xff1a; cocos creator prefab 无法显示内容&#xff0c; 或者只显示一部分内容。 creator编辑器中能看见&#xff1a; 预览时&#xff0c;看不见内容&#xff1a; **问题原因&#xff1a;** prefab node 所在的layer&#xff0c;默认是default。 解决方法&…

HALCON支持GPU加速的算子有哪些?

参考例程get_operator_info。 get_opencl_operators这里可以查看到所有支持gpu加速的算子。 支持的算子列表&#xff1a; crop_rectangle1&#xff0c;deviation_image&#xff0c;mean_image&#xff0c;points_harris&#xff0c;gray_opening_shape&#xff0c; gray_dilat…

防火墙开启状态下,启动docker/容器 报错

1 问题描述&#xff1a; 防火墙开启状态下&#xff0c;启动docker/容器 报错:Failed to start Docker Application Container Engine. 2 解决方案&#xff1a; step1 先检查firewall-cmd中是否有区域占用了 docker0 firewall-cmd --get-active-zonesstep2 查看firewall-cm…

1、Kafka 安装与简单使用

第 1 章 Kafka 概述 1.1 定义 Kafka传统定义&#xff1a; Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 Kafka最新定义 &#xff1a; Kafka是 一个开源的 分 布式事件流平台 &#xff08…

编译原理简介

编译原理简介 编译原理的研究对于理解和设计编程语言、编译器和解释器都非常重要。它不仅可以提高程序的执行效率&#xff0c;还可以帮助开发人员更好地理解程序的运行机制。编译原理是计算机科学中的一个重要分支&#xff0c;研究的是编译器的设计和实现。对于从事编译器开发…

远程访问:让您随时与电脑保持连接

远程访问可以带来什么&#xff1f; ​如今&#xff0c;我们的大部分工作都是在电脑的帮助下完成的。但是&#xff0c;我们并不总是坐在工作电脑前&#xff0c;随身携带电脑也很不方便&#xff0c;尤其是当工作设备是台式电脑而不是笔记本电脑时。那么&#xff0c;当我们不在…

在nodejs中如何防止ssrf攻击

在nodejs中如何防止ssrf攻击 什么是ssrf攻击 ssrf&#xff08;server-side request forgery&#xff09;是服务器端请求伪造&#xff0c;指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)…

Java实现word excel ppt模板渲染与导出及预览 LibreOffice jodconverter

Java Office 一、文档格式转换 文档格式转换是office操作中经常需要进行一个操作&#xff0c;例如将docx文档转换成pdf格式。 java在这方面有许多的操作方式&#xff0c;大致可以分为内部调用&#xff08;无需要安装额外软件&#xff09;&#xff0c;外部调用&#xff08;需…

BiMPM实战文本匹配【上】

引言 今天来实现BiMPM模型进行文本匹配&#xff0c;数据集采用的是中文文本匹配数据集。内容较长&#xff0c;分为上下两部分。 数据准备 数据准备这里和之前的模型有些区别&#xff0c;主要是因为它同时有字符词表和单词词表。 from collections import defaultdict from …