深入玩转Playwright:高级操作解析与实践

playwright高级操作

iframe切换

​ 很多时候,网页可能是网页嵌套网页,就是存在不止一个html标签,这时候我们的selenium或者playwright一般来说定位不到,为什么呢?

​ 因为默认是定位到第一个标准的html标签内部。

from playwright.sync_api import sync_playwright
p = sync_playwright().start()browser = p.chromium.launch(headless=False)
page = browser.new_page()page.goto("https://cdn2.byhy.net/files/selenium/sample2.html")lcs = page.locator('.plant').all()
for lc in lcs:print(lc.inner_text(timeout=1000))# 默认是等30s,我们修改为1s

在这里插入图片描述

​ 接下来我们好好分析一下这个网页结构,发现存在一个iframe标签,有过前端开发基础的同学应该能看出来了,就是实现了网页的嵌套。

在这里插入图片描述

​ 但是我们需要的内容,在 这个iframe标签中,所以需要切换到其中。

可以使用 Page 或者 Locator 对象的 frame_locator 方法定位到你要操作的frame。

  • frame_locator() - 帧定位器 |剧作家 Python — FrameLocator | Playwright Python

​ 使用 iframe 时,您可以创建一个帧定位器,该定位器将进入 iframe 并允许选择该 iframe 中的元素。

# selector 为css选择器或者xpath选择器
frame_locator.frame_locator(selector)

现在我们对上面的案例进行修改:

from playwright.sync_api import sync_playwright
p = sync_playwright().start()browser = p.chromium.launch(headless=False)
page = browser.new_page()page.goto("https://cdn2.byhy.net/files/selenium/sample2.html")
#------------------修改的代码------------------------------------
# 产生一个  FrameLocator 对象
frame = page.frame_locator("iframe[src='sample1.html']")
# 再 在其内部进行定位
lcs = frame.locator('.plant').all()
for lc in lcs:print(lc.inner_text(timeout=2000))

在这里插入图片描述

窗口切换:

​ 在playwright的使用过程中,可能会涉及不同页面的切换,则会使用需要BrowserContext 来切换浏览器对象的上下文,不然你获取的对象还是之前的。

from playwright.sync_api import sync_playwright
p = sync_playwright().start()browser = p.chromium.launch(headless=False)
page = browser.new_page()page.goto("https://cdn2.byhy.net/files/selenium/sample3.html")# 点击链接,打开新窗口  会切换到bing
page.locator("a").click()# 打印网页窗口标题
print(page.title())

但是显然结果并没有发生变化,这是因为上下文对象没有变化。

在这里插入图片描述

from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch(headless=False)
# 创建 BrowserContext 对象
context = browser.new_context()# 通过context 创建page
page = context.new_page()
page.goto("https://cdn2.byhy.net/files/selenium/sample3.html")
# 点击链接,打开新窗口
page.locator("a").click()
# 等待2秒, 不能用 time.sleep
page.wait_for_timeout(2000)# pages属性是 所有窗口对应Page对象的列表
newPage = context.pages[1]
# 打印新网页窗口标题
print(newPage.title())
# 打印老网页窗口标题
print(page.title())
print(context.pages)

结果:

必应
白月黑羽测试网页3
[<Page url='https://cdn2.byhy.net/files/selenium/sample3.html'>, <Page url='https://cn.bing.com/'>]

BrowserContext 对象有个 pages 属性,这是一个列表,里面依次为所有窗口对应Page对象。

关闭网页:

Browser对象有close 方法,可以实现关闭整个浏览器。

如果只是要关闭某个网页窗口,可以调用该窗口对应的Page对象的 close 方法。

page.close()
page.close(**kwargs)
移动网页:

​ 假如我们有多个网页,但是想切换某个网页到最前面,需要怎么设置呢?

将页面放在前面(TAB):

page.bring_to_front()
固定界面:

定时器+debugger 执行js代码:卡住页面

setTimeout(function(){debugger}, 5000)
截屏:

​ playwright和selenium都可以实现截屏,当然这个方法主要用于验证码,将图片交给第三方打码平台然后就可以实现滑块,点选等等。

网页截屏:

# 窗口大小
page.screenshot(path='ss1.png')# 截屏完整页面,页面内容长度超过窗口高度时,包括不可见部分,包括滑动。
page.screenshot(path='ss1.png', full_page=True)

当然也可以对某个部分进行截图:

tag=page.locator('input[type=file]')
tag.screenshot(path='ss2.png')
拖拽:
  • drag_and_drop()

相关参数:

  • source 用于搜索要拖动的元素的选择器
  • target 用于搜索要拖放到的元素的选择器
  • source_position 此时单击源元素相对于元素填充框的左上角
  • target_position 相对于元素填充框的左上角,在目标元素上放置

​ 此方法将源元素拖动到目标元素。它将首先移动到源元素,执行 , mousedown 然后移动到目标元素并执行 mouseup .

page.drag_and_drop("#source", "#target")
# or specify exact positions relative to the top-left corners of the elements:
page.drag_and_drop("#source","#target",source_position={"x": 34, "y": 7},target_position={"x": 10, "y": 20}
)

drag_to(target)

相关参数文档:https://playwright.dev/python/docs/api/class-locator#locator-drag-to

# 选中  `span#t1`  文本内容
page.locator('#t1').select_text()
# 拖拽到 输入框  `[placeholder="captcha"]` 里面去
page.drag_and_drop('#t1', '[placeholder="captcha"]')

还有一种就是已经定位到某个对象了,这时候可以不使用page对象来进行操控:

source = page.locator("#source")
target = page.locator("#target")source.drag_to(target)
# or specify exact positions relative to the top-left corners of the elements:
source.drag_to(target,source_position={"x": 34, "y": 7},target_position={"x": 10, "y": 20}
)
# 选中  `span#t1`  文本内容
lc = page.locator('#t1')lc.select_text()# 拖拽到 输入框  `[placeholder="captcha"]` 里面去
lc.drag_to(page.locator('[placeholder="captcha"]'))

总结:

​ 在本文中,我们深入探索了Playwright的高级操作。我们学习了如何在应用中切换iframe,以及如何处理多个窗口的切换。我们还了解了如何关闭网页和移动网页位置,以及如何固定界面,以便进行更精确的测试。此外,我们还学习了如何使用Playwright进行屏幕截图和拖拽操作。

​ 通过掌握这些高级操作,我们可以更好地利用Playwright的强大功能来自动化测试和模拟用户交互。这些技巧可以帮助我们处理各种复杂的场景,例如在应用中嵌套的iframe、多个窗口之间的切换以及拖拽操作。

​ Playwright的灵活性和易用性使其成为一个强大的自动化测试工具。通过学习并掌握这些高级操作,我们可以更好地利用Playwright的功能,提高测试效率和准确性。

​ 希望本文对你了解和应用Playwright的高级操作有所帮助,并能够在你的测试工作中发挥作用。

温馨提示:

​ 整理源于:快速上手 | 白月黑羽 (byhy.net),如有侵权,请及时联系删除!

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

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

相关文章

STM32——USART

一、通信 1.1通信是什么&#xff1b; 通信是将一个设备的数据发送到另一个设备中&#xff0c;从而实现硬件的扩展&#xff1b; 1.2通信的目的是什么&#xff1b; 实现硬件的扩展-在STM32中集成了很多功能&#xff0c;例如PWM输出&#xff0c;AD采集&#xff0c;定时器等&am…

小程序样例5:简单登录界面

基本功能 1、头像选择、用户名、密码、昵称选择、性别、城市 2、确认注册跳转 我的页面。 3、其他注册方式跳转用户名 密码登录方式 4、清除 和 密码显示按钮&#xff1a; 5、用户名、密码合法性校验&#xff1a; 6、点击微信图标&#xff0c;调转回微信登录&#xff1a; 代码…

部署YUM仓库服务

一、yum仓库 1. yum简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 为什么会有依赖关系的发生 因为linux本身就是以系统简洁为自身优势&#xff0c;所以…

超超超详细讲解TCP三次握手与四次挥手(大图解),值得收藏

TCP 三次握手与四次挥手深入探究 TCP基础知识 TCP 头格式有哪些 TCP首部包括20字节的固定首部部分及长度可变的其他选项&#xff0c;所以TCP首部长度可变。20个字节又分为5部分&#xff0c;每部分4个字节32位&#xff0c;如图中的前5行&#xff0c;每行表示32位。 TCP 头格…

云服务器如何快速部署访问静态页面(个人网站博客等)

1&#xff0c;购买云服务器 2&#xff0c;配置安全项 云服务器ecs下&#xff0c;配置ip、端口所有人都可访问 3&#xff0c;关闭防火墙&#xff0c;将前端静态项目传输到云服务器上 可以使用SecureCRT&#xff0c;本地远程连接到服务器&#xff08;需要用户名与密码&#x…

LVS常用的NAT模式和DR模式实战示例

引言&#xff1a;紧接上文&#xff0c;了解LVS&#xff0c;这一篇就够了-CSDN博客&#xff0c;今天我们对LVS常用的两种模式来进行示例配置演示 LVS-NAT模式 1、环境准备 准备 3 台纯净的虚拟机 关闭防火墙和selinux 例&#xff1a; lvs-server 添加两个网卡 NAT模式 …

基于连续相位负载调制的单输入宽带混合Doherty功率放大器设计(2023.05 MTT)-从理论到ADS版图

基于连续相位负载调制的单输入宽带混合Doherty功率放大器设计-从理论到ADS版图 最近开始搞大论文了&#xff0c;Doherty方面对最新的一些的技术看的比较少&#xff0c;找几个牛逼的学习一下下&#xff0c;虽然最后可能也用不上。已经完成了理论的推导和ADS版图仿真&#xff0c…

4、this指向、动画案例、封装、offset、client、scroll

一、this指向问题 1、在构造函数中this指向实例化对象 2、在自定义对象的函数&#xff08;方法&#xff09;中指向this指向当前的对象 3、在普通函数中this指向window 4、函数中this指向&#xff1a;在事件函数中this指向事件源 5、在定时器函数中this指向window 二、动…

动态分析C语言代码生成函数调用关系的利器——gprof

大纲 准备工作下载libevent代码安装编译依赖编译libevent 收集运行数据编译插入检测代码的可执行程序收集数据 数据转换环境准备转换为dot 转换为图片环境准备转换图片 参考代码参考资料 gprof是一个C语言程序性能分析工具。在编译期间&#xff0c;我们给编译指令增加-pg选项&a…

第 8 章:Linux中使用时钟、计时器和信号

在本章中&#xff0c;我们将开始探索Linux环境中可用的各种计时器。随后&#xff0c;我们将深入了解时钟的重要性&#xff0c;并探讨UNIX时间的概念。接下来&#xff0c;我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后&#xff0c;我们将进入std::chrono的领域&…

创业7年复盘,中美企业服务市场差异浅析

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿在公司内部的飞书订阅号发表了多篇 Rethink Data & Analytics 的内部信&#xff0c;分享了对数据与分析行业的一些战略思考&#xff0c;尤其是 AI 带来的各种变化和革命&#xff0c;是如何深刻地影响这个行业乃至整…

一篇文带你使用js实现拖拽排序

先介绍一下html5的drag属性,拖放&#xff08;Drag 和 drop&#xff09;是 HTML5 标准的组成部分。想要启用drag&#xff0c;只要给元素加上draggable"true"就行了&#xff08;Safari 5.1.2除外&#xff09;。   实际效果&#xff1a; 拖动事件(了解事件详情)   事…

Node.js 模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他 模块使用 1…

股票市场

&#xff08;一&#xff09;股票市场 顾名思义&#xff0c;就是买卖股票的场所。就是为了撮合想发展但缺钱的企业与有钱但想投资的投资者。 股票市场按照交易场所&#xff0c;可分为场内市场和场外市场&#xff1a; 场内市场是指证券交易所&#xff0c; 场外市场就是证券交易…

【Linux】Linux环境基础开发工具使用

上篇博客我们学习了Linux权限相关知识&#xff0c;那么这节课我们来学习一下Linux环境基础开发工具使用吧~&#xff0c;主要包括yum、vim、gcc/g的使用&#xff0c;以及Linux项目自动化构建工具。 目录 Linux软件包管理器--yum yum是什么 yum相关操作 yum本地配置 Linux编…

蓝桥杯-循环节长度

两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为: 循环节。比如&#xff0c;11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法&#xff0c;可以求出循环节的长度。请仔细阅读代码&#xff0c;并填写划线部分缺少的代码。 注…

redis—Zset有序集合

目录 前言 1.常见命令 2.使用场景 3.渐进式遍历 4.数据库管理 前言 有序集合相对于字符串、列表、哈希、集合来说会有一-些陌生。它保留了集合不能有重复成员的 特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有-个唯- -的浮 点类型的分数(score) …

20240126收获

el-table比较常见的需要跳转column的场景&#xff0c;目前遇到三种&#xff0c;一种是前面列变成序号&#xff0c;用的是typeindex和&#xff1a;index来设置索引&#xff0c;第二种是变成多选&#xff0c;用的是typeselect和在table上加上select-change事件&#xff0c;第三种…

故障脚本的重要作用:预防、诊断与恢复

故障脚本是在信息技术和计算机领域中广泛使用的一种自动化工具&#xff0c;它们的主要目的是预测、诊断和修复系统或软件中的故障。这些脚本在现代技术环境中扮演着至关重要的角色&#xff0c;本文将介绍故障脚本的主要作用。 一、预防性作用 监控和预警 故障脚本可以用于监控系…

web应用课——(第一讲:html基础标签)

目录 一、html文件结构 二、文本标签 三、图片 四、音频和视频 五、超链接 六、表单 七、列表 八、表格 九、语义标签 十、特殊符号 一、html文件结构 <html>标签&#xff1a;表示一个 HTML 文档的根&#xff08;顶级元素&#xff09;&#xff0c;所以它也被…