python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
目录
鼠标事件
悬停
移动
按键
点击
滚轮操作
拖拽
键盘事件
输入文本内容
type输入内容
fill输入内容
按键操作press
文件上传
下拉选/单选框/复选框
滚动条操作
鼠标事件
悬停
page.get_by_text('设置',exact=True).nth(1).hover()
移动
page.mouse.move(x=33, y=50)
按键
# 点击操作可设置button参数,选择点击键["left", "middle", "right"]
page.mouse.click(x=100, y=200)
page.mouse.dblclick(x=100, y=200)
page.mouse.up()
page.mouse.down()
点击
点击支持选择不同点击键["left", "middle", "right"]
page.click('#su') # 单击,默认点击左键page.locator('xpath=//a[text()="百度首页"]').dispatch_event('click') # 此方法支持键盘等事件,参数为click时同click()page.locator('xpath=//a[text()="设置"]').click(button='right') # 右击page.locator('xpath=//a[text()="百度首页"]').click(position={'x': 10, 'y': 20}) # 点击元素的某个点# 键盘+鼠标点击,键盘键支持的类型(Alt|Control|ControlOrMeta|Meta|Shift)page.locator('xpath=//a[text()="百度首页"]').click(modifiers=["Shift"]) # 模拟按下Shift同时点击元素page.locator('#su').dblclick() # 双击
滚轮操作
page.mouse.wheel(delta_x=100, delta_y=0) # 水平向右page.mouse.wheel(delta_x=-100, delta_y=0) # 水平向左page.mouse.wheel(delta_x=0, delta_y=500) # 垂直向下page.mouse.wheel(delta_x=0, delta_y=-500) # 垂直向上for _ in range(100):page.mouse.wheel(delta_x=0, delta_y=10)sleep(.1)
拖拽
拖拽的分步式为先鼠标悬停到要拖拽的元素上,然后按下鼠标不放,再将鼠标移动到目标为止松开鼠标。
page.locator('xpath=//a[text()="百度首页"]').hover()page.mouse.down()page.locator('#kw').hover()page.mouse.up()
合并写法
page.locator('xpath=//a[text()="百度首页"]').drag_to(page.locator('#kw'))
键盘事件
page.keyboard.insert_text('测试一下') # 键盘输入内容,这个操作只触发‘input’事件,不发出‘keydown’, ‘keyup’或‘keypress’事件。for _ in range(5):page.keyboard.press('Control+A')page.keyboard.press('Control+C')page.keyboard.press('Control+V')page.keyboard.down('Control') # 按下page.keyboard.up('Control') # 抬起
输入文本内容
type和fill支持input、textarea、contenteditable标签元素的内容输入。但输入结果有所不同,type()输入内容不会清除后输入,会在原来内容的基础上追加。fill()会先清空内容后再输入,可以看成clean和type的组合。通过循环输入可看出差异
type输入内容
# 清空内容page.locator('#kw').clear() for _ in range(5):page.locator('#kw').type(text='测试')sleep(.5)
fill输入内容
for _ in range(5):# page.fill('#kw', '自动化')page.locator('#kw').fill('测试')
按键操作press
支持键盘按键,可执行的按键有Backquote, Minus, Equal, Backslash, Backspace, Tab, Delete, Escape,ArrowDown, End, Enter, Home, Insert, PageDown, PageUp, ArrowRight,ArrowUp, F1 - F12, Digit0 - Digit9, KeyA - KeyZ, etc。同时支持单个字符的输入,如输入特殊符号,如¥,&等。
Control(即Ctrl键)、方向键ArrowLeft(小键盘左边的向左的箭头键,可根据实际需要换成对应的方向键)
page.locator('#kw').press("Control+ArrowLeft")page.locator('#kw').press("Control+ArrowRight")page.locator('#kw').press("&") # 输入&符号page.locator('#kw').press("Shift+A") # 控制输入大小写
文件上传
支持上传单个或多个文件上传多个文件时,使用列表传入。
file_name = [r'D:\儿童音频诗词歌曲\22 三字经+弟子规+百家姓(全集)跟读\11 《三字经》11.mp3',r'D:\儿童音频诗词歌曲\22 三字经+弟子规+百家姓(全集)跟读\10 《三字经》10.mp3']page.locator('xpath=//input[@name="file"][@multiple="multiple"]').nth(0).set_input_files(file_name)
下拉选/单选框/复选框
select_option()支持在 < select > 元素中选择一个或多个选项。# 支持value和label的参数选择(参数值可以是单个字符串或多个值的列表),支持通过下标index选择(参数值可以是单个int值或多个int值的列表),根据多选和单选决定。
page.locator('xpath=//select[@name="sutext"]').select_option('启用')
对于input中具有checkbox属性的元素可使用check或set_checked选择值。set_checked是选中或取消选择复选框或单选按钮最简单的方法。
page.get_by_label('XXX').check() # 选中
page.get_by_label('XXX').uncheck() # 取消选中
page.get_by_label('XXX').is_checked() # 元素是否选择状态,返回布尔值
page.locator('[value="姓名"]').set_checked(checked=True) # set_checked设置选中状态
page.set_checked('[value="姓名"]', checked=True)
滚动条操作
滚动操作有三种方式:通过上面的鼠标滚轮操作、通过scroll_into_view_if_needed方法操作、通过执行JavaScript语句操作。
通过滚轮和JavaScript语句操作可通过先获取页面高度再循环操作。
height = page.query_selector('body').evaluate("document.body.scrollHeight") # 获取页面高度for h in range(0, height, 100): # 每100个像素滚动一次# page.evaluate_handle(f'window.scrollTo(0,{h});')page.evaluate(f'window.scrollTo(0,{h});')page.wait_for_timeout(500)
滚动到指定元素出现
方法1:
page.locator('xpath=//input[@name="file"][@multiple="multiple"]').last.scroll_into_view_if_needed() # 滚动到指定元素为止
方法2:
expression = '''const element = document.querySelector("#su");if (element) {{element.scrollIntoView();}}'''
page.evaluate(expression)相关文章:
python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
目录 鼠标事件 悬停 移动 按键 点击 滚轮操作 拖拽 键盘事件 输入文本内容 type输入内容 fill输入内容 按键操作press 文件上传 下拉选/单选框/复选框 滚动条操作 鼠标事件 悬停 page.get_by_text(设置,exactTrue).nth(1).hover() 移动 page.mouse.move(x33…...
【论文+源码】Diffusion-LM 改进了可控文本生成
这篇论文探讨了如何在不重新训练的情况下控制语言模型(LM)的行为,这是自然语言生成中的一个重大开放问题。尽管近期一些研究在控制简单句子属性(如情感)方面取得了成功,但在复杂的细粒度控制(如…...
双目立体校正和Q矩阵
立体校正 对两个摄像机的图像平面重投影,使二者位于同一平面,而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R,T) 从上图中可以看出,该算法主要分为两步: 使成像平面共面 这个办法很直观ÿ…...
vscode 自用插件
vscode按住ctrl鼠标左键无法跟踪跳转方法名,装这些插件就可以 vscode-elm-jump:常规的代码跳转定义 Vue CSS Peek:跳转css定义 vue-helper:变量函数只跳转定义 Vetur 代码提示 Baidu Comate 自动帮你写console.log Turbo Console Log: ctrl alt l 选中变量之后&am…...
OpenCV:在图像中添加高斯噪声、胡椒噪声
目录 在图像中添加高斯噪声 高斯噪声的特性 添加高斯噪声的实现 给图像添加胡椒噪声 实现胡椒噪声的步骤 相关阅读 OpenCV:图像处理中的低通滤波-CSDN博客 OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV:图像滤波、卷积与…...
DuckDB:Golang操作DuckDB实战案例
DuckDB是一个嵌入式SQL数据库引擎。它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的。DuckDB支持各种数据类型和SQL特性。凭借其在以内存为中心的环境中处理高速分析的能力,它迅速受到数据科学家和分析师的欢迎。在这篇博文中࿰…...
MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
kotlin的协程的基础概念
Kotlin的协程是一种用于简化异步编程的强大工具。 理解协程的基础概念可以帮助开发者有效地利用其能力。 以下是Kotlin协程的一些关键基础概念: 协程(Coroutines) : 协程是一种用于处理并发任务的编程模型,它可以在单…...
Spring--SpringMVC使用(接收和响应数据、RESTFul风格设计、其他扩展)
SpringMVC使用 二.SpringMVC接收数据2.1访问路径设置2.2接收参数1.param和json2.param接收数据3 路径 参数接收4.json参数接收 2.3接收cookie数据2.4接收请求头数据2.5原生api获取2.6共享域对象 三.SringMVC响应数据3.1返回json数据ResponseBodyRestController 3.2返回静态资源…...
隐藏php版本信息x-powered-by
在生产环境中,并不想让别人知道用的是什么版本的php,可以把x-powered-by隐藏掉 在nginx配置文件加上fastcgi_hide_header X-Powered-By; 如下图所示 配置修改后平滑重启nginx...
哈夫曼树(构建、编码、译码)(详细分析+C++代码实现)
D 哈夫曼树 题目要求 编写一个哈夫曼编码译码程序。针对一段文本,根据文本中字符出现频率构造哈夫曼树,给出每个字符的哈夫曼编码,并进行译码,计算编码前后文本大小。 为确保构建的哈夫曼树唯一,本题做如下限定&…...
C++ 二叉搜索树
目录 概念 性能分析 二叉搜索树的插入 二叉树的查找 二叉树的前序遍历 二叉搜索树的删除(重点) 完整代码 key与value的使用 概念 对于一个二叉搜索树 若它的左子树不为空,则左子树上所有的节点的值都小于等于根节点的值若它的右子树不为空…...
docker构建Java项目镜像常用的Java版本,国内私有仓库公网快速下载,解决从docker.io无法下载的问题
2015工作至今,10年资深全栈工程师,CTO,擅长带团队、攻克各种技术难题、研发各类软件产品,我的代码态度:代码虐我千百遍,我待代码如初恋,我的工作态度:极致,责任ÿ…...
低代码系统-氚云、简道云表单控件对比
组件对比 氚云 简道云 是否都有 1 单行文本 单行文本 ☑️ 2 多行文本 多行文本 ☑️ 3 日期 日期时间 ☑️ 4 数字 数字 ☑️ 5 单选框 单选按钮组 ☑️ 6 复选框 复选框组 ☑️ 7 下拉框 下拉框 ☑️ 8 附件 附件 ☑️ 9 图片 图片 ☑️ 10 地址 地…...
为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️
前言 在使用 Spring 框架时,依赖注入(DI)是一个非常重要的概念。通过注解,我们可以方便地将类的实例注入到其他类中,提升开发效率。Autowired又是被大家最为熟知的方式,但很多开发者在使用 IntelliJ IDEA …...
Unity在WebGL中拍照和录视频
原工程地址https://github.com/eangulee/UnityWebGLRecoder Unity版本2018.3.6f1,有点年久失修了 https://github.com/xue-fei/Unity.WebGLRecorder 修改jslib适配了Unity2021 效果图 录制的视频 Unity在WebGL中拍照和录视频...
爬虫基础之爬取某站视频
目标网址:为了1/4螺口买小米SU7,开了一个月,它值吗?_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…...
mongoDB常见指令
即使我们自己开发用不到mongoDB,但是接手别人项目的时候,别人如果用了,我们也要会简单调试一下 虽然mongoDB用的不是sql语句,但语句的逻辑都是相似的,比如查看数据库、数据表,增删改查这些 我们下面以doc…...
人工智能之深度学习_[5]-神经网络优化学习率衰减优化正则化方法
文章目录 神经网络入门二3 神经网络优化方法3.1 梯度下降算法回顾3.2 反向传播(BP算法)3.2.1 反向传播概念3.2.2 反向传播详解 3.3 梯度下降优化方法3.3.1 指数加权平均3.3.2 动量算法Momentum3.3.3 AdaGrad3.3.4 RMSProp3.3.5 Adam3.3.6 小结 4 学习率衰…...
Oracle之Merge into函数使用
Merge into函数为Oracle 9i添加的语法,用来合并update和insert语句。所以也经常用于update语句的查询优化: 一、语法格式: merge into A using B on (A.a B.a) --注意on后面带括号,且不能更新join的字段 when matched then upd…...
抖音数字资产管理方法论:构建个人内容沉淀系统的技术实践
抖音数字资产管理方法论:构建个人内容沉淀系统的技术实践 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...
用Python+OpenCV手把手实现Prewitt边缘检测(附完整代码与效果对比图)
用PythonOpenCV手把手实现Prewitt边缘检测(附完整代码与效果对比图) 边缘检测是计算机视觉中最基础也最关键的预处理步骤之一。想象一下,当你需要让计算机"看清"一张照片中的物体轮廓时,边缘检测算法就是它的"视觉…...
告别拍脑袋规划!用ArcGIS做绿道选线:如何科学量化坡度、水域、道路成本并加权计算
科学规划绿道的ArcGIS高阶技法:从成本栅格构建到最优路径生成绿道规划从来不是简单的"两点之间直线最短",而是需要综合考虑地形、生态、人文等多维因素的复杂决策过程。传统规划中常见的"拍脑袋"决策方式,往往导致建成后…...
Arduino PWM转4-20mA工业电流信号:二阶滤波与V/I转换电路设计
1. 项目概述:从PWM到工业标准电流信号在工业自动化、过程控制和传感器领域,4-20 mA电流环是一个几乎无处不在的标准。它用4 mA代表测量值的下限(如0C),20 mA代表上限(如100C),这种设…...
2605.VGGT-Omega 论文解读: 3D重建的Scaling Law, Register Attention效率革命 | Oxford+Meta CVPR26 Oral
VGGT-Omega: Scaling Feed-Forward 3D Reconstruction Jianyuan Wang, Minghao Chen, Shangzhan Zhang, Nikita Karaev, Johannes Schonberger, et al. Visual Geometry Group, Oxford Meta AI | CVPR 2026 Oral | arXiv 2605.15195 Paper | Project Page 一句话总结 VGGT-Om…...
Python基础语法:常用内置函数
round():四舍五入 # 省略 ndigits print(round(3.14)) # 输出 3(int) print(round(3.66)) # 输出 4# 指定 ndigits print(round(3.14159, 2)) # 输出 3.14(float) print(round(3.666, 2)) # 输出 3.67# …...
ARM PMU性能监控单元原理与实践指南
1. ARM PMU性能监控单元概述性能监控单元(PMU)是现代ARM处理器中用于硬件级性能分析的核心组件。它通过一组可编程的硬件计数器,实现对处理器内部各种关键事件的精确测量。这些事件涵盖了从指令执行、缓存访问到内存子系统行为等处理器活动的…...
腾讯 Marvis 初级使用教程——从安装到上手
腾讯最新系统级AI助手Marvis(2026年5月20日发布),官网 https://marvis.qq.com,主打“一句话操作电脑”、跨端协同、GUI Agent执行。虽然是个【小龙虾】,但上手其实不难。这篇就简单写写 Marvis 的安装和基础使用&#…...
手把手教你用Mind+和Blynk,让手机轻松遥控掌控板(含自建服务器避坑指南)
从零搭建物联网控制平台:Mind与Blynk深度整合实战 当你第一次尝试用手机控制硬件设备时,那种"隔空取物"的奇妙感总会让人兴奋不已。想象一下,躺在沙发上就能调节书桌上的智能台灯亮度,或者在外出时随时查看家中的温湿度…...
模拟电路实现自主循线机器人:无MCU的硬件逻辑设计
1. 项目概述:用最纯粹的模拟电路,造一台会“思考”的机器人每次看到那些在赛道上灵巧穿梭的循线小车,你是不是也手痒,想自己动手做一个?但一听到“单片机”、“编程”、“Arduino”这些词,又觉得门槛太高&a…...
