深入玩转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),如有侵权,请及时联系删除!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python算法题集_滑动窗口最大值

本文为Python算法题集之一的代码示例 题目239&#xff1a;滑动窗口最大值 说明&#xff1a;给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

蓝桥杯 第 2 场 小白入门赛

目录 1.蓝桥小课堂-平方和 2.房顶漏水啦 3.质数王国 4.取余 5.数学尖子生 6.魔术师 比赛链接 1.蓝桥小课堂-平方和 简单签到直接按照题目处理即可注意开long long void solve(){LL x; cin>>x;LL ans x*(x1)*(2*x1)/6;cout<<ans<<endl; } 2.房顶漏水…

opencv-python计算视频光流

光流基本概念 光流表示的是相邻两帧图像中每个像素的运动速度和运动方向。具体&#xff1a;光流是空间运动物体在观察成像平面上的像素运动的瞬时速度&#xff0c;是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xf…

仰暮计划|“那时候在生产队下面,集体干活,吃大锅饭,由队里分粮食,吃不饱饭是常事,队里分的粮食就那么点,想要吃饱真的太难了”

希望未来的中国越来越好&#xff0c;大家的生活也越来越好 老人是1955年在河南省洛阳市洛宁县的一个小山村里出生的&#xff0c;前半辈子为了生活&#xff0c;为了孩子而打拼&#xff0c;虽然经历了不少的苦难&#xff0c;但后半辈子也算是苦尽甘来&#xff0c;生活美满。现在就…

【MATLAB源码-第130期】基于matlab的BPSK-ZF迫零均衡,对比均衡前后的误码率曲线以及理论曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 信道均衡是通信系统中的一项关键技术&#xff0c;其主要目的是减少或消除由于信道特性导致的信号失真。在数字通信中&#xff0c;尤其是在无线通信系统中&#xff0c;由于多径传播等原因&#xff0c;接收到的信号会受到严重的…

浅析云性能监控的重要性及核心功能

随着企业日益依赖云计算服务&#xff0c;云性能监控变得至关重要。云性能监控是一种实时监测、分析和报告云基础设施及应用程序性能的方法。本文将深入探讨云性能监控的目的、重要性以及其核心功能&#xff0c;以帮助企业更好地理解和实施这一关键的运维实践。 一、云性能监控的…

[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

MongoDB安装以及卸载,通过Navicat 15 for MongoDB连接MongoDB

查询id&#xff1a; docker ps [rootlocalhost ~]# docker stop c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rm c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rmi mongo sudo docker pull mongo:4.4 sudo docker images 卸载旧的 sudo docker stop mong…

Django4.2(DRF)+Vue3 读写分离项目部署上线

文章目录 1 前端2 后端2.1 修改 settings.py 文件关于静态文件2.2 关于用户上传的文件图片 3 Nginx4 镜像制作4.1 nginx4.3 Django镜像4.3.1 构建 5 docker-compose 文件内容 1 前端 进入前端项目的根目录&#xff0c;运行如下命令进行构建 npm run build构建完成后&#xff…

Apple Vision Pro 评测:这款顶尖头显仅是对未来的初步探索

原文&#xff1a;Apple Vision Pro Review: The Best Headset Yet Is Just a Glimpse of the Future 作者&#xff1a;Joanna Stern 戴上 Apple Vision Pro 混合现实头显整整近 24 小时后&#xff0c;有几件事让我颇感意外&#xff1a; 我居然没感到恶心。我竟然高效完成了大…

云纱网签约百望云,联手打造数字化产业闭环

近日&#xff0c;百望云签约广东云纱数字科技有限公司&#xff0c;共建数字化发票管理系统&#xff0c;赋能产业链上下游供应商的协同交易与运营&#xff0c;助力企业实现数字化四流合一交易&#xff0c;打造数字化产业闭环。 云纱网是广东云纱数字科技有限公司依托于深厚的产业…

利用牛顿方法求解非线性方程(MatLab)

一、算法原理 1. 牛顿方法的算法原理 牛顿方法&#xff08;Newton’s Method&#xff09;&#xff0c;也称为牛顿-拉弗森方法&#xff0c;是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根&#xff0c;具体原理如下&#xff1a; 输入&#…

STM32——DMA

STM32——DMA 1.DMA介绍 什么是DMA&#xff1f; DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&…

移动端设计规范 - 文字使用规范

这是一篇关于移动端产品界面设计时&#xff0c;文字大小的使用规范&#xff0c;前端人员如果能了解一点的话&#xff0c;在实际开发中和设计沟通时&#xff0c;节省沟通成本&#xff0c;也能提高设计落地开发时的还原度。 关于 在做移动端产品设计时&#xff0c;有时候使用文字…

fpmarkets实例讲解止损,控制风险如此简单

止损和止盈是交易者在交易时都需要了解的两个基本设置&#xff0c;在上篇文章fpmarkets澳福和各位投资者分享 了止盈如何工作&#xff0c;今天我们继续实例讲解止损&#xff0c;在交易中控制不必要的风险。 止损单是基本交易订单之一。如果市场走向与预期相反&#xff0c;它会限…

[机器学习]LFM梯度下降算法

一.LFM梯度下降算法 2.代码实现 # 0. 引入依赖 import numpy as np import pandas as pd# 1. 数据准备 # 评分矩阵R R np.array([[4,0,2,0,1],[0,2,3,0,0],[1,0,2,4,0],[5,0,0,3,1],[0,0,1,5,1],[0,3,2,4,1],]) # 二维数组小技巧&#xff1a;取行数R.shape[0]和len(R)&#x…

【SPIE独立出版|长春理工大学主办】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

DSCC 2024已通过SPIE出版社审核&#xff0c;ISSN号已确定&#xff1a;ISSN: 0277-786X&#xff0c;往届均已见刊EI检索&#xff01; 2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and…

Windows Server 2025 Azure Arc 介绍

Azure Arc 是一个扩展 Azure 平台的桥梁&#xff0c;可帮助你构建可灵活地跨数据中心、边缘和多云环境运行的应用程序和服务。使用一致的开发、操作和安全模型来开发云原生应用程序。 Azure Arc 可在新的和现有的硬件、虚拟化和 Kubernetes 平台、物联网设备和集成系统上运行。…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先&#xff0c;你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来&#xff0c;你需要将Flutter…