Playwright教程

news2024/11/24 19:27:02

Playwright简介

支持多数浏览器

  • 在Chromium,Firefox和WebKit上进行测试。Playwright拥有适用于所有现代浏览器的完整API覆盖,包括Google Chrome和Microsoft Edge(带有Chromium),Apple Safari(带有WebKit)和Mozilla Firefox。

  • 跨平台的WebKit测试。使用Playwright,使用适用于Windows,Linux和macOS的WebKit构建,测试您的应用程序在Apple Safari中的行为。在本地和CI上进行测试。

  • 测试手机。使用设备仿真在移动Web浏览器中测试您的自适应Web应用程序。

  • 无报文头与有报文头。Playwright支持所有浏览器和所有平台的无头(无浏览器UI)和有头(有浏览器UI)模式。有报文头模式适用于调试,而无报文头适用于CI / cloud执行。

拥有快速可靠的执行

  • 自动等待APIs。Playwright交互会自动等待直到元素准备就绪。这样可以提高可靠性并简化测试编写流程。

  • 无超时自动化。Playwright会接收浏览器信号,例如网络请求,页面导航和页面加载事件,以消除导致睡眠中断的烦恼。

  • 与浏览器上下文保持并行。对于多个并行孤立的浏览器上下文可执行环境重复使用一个单独的浏览器实例。

  • 弹性元素选择器。Playwright可以依靠面向用户的字符串(例如文本内容和可访问性标签)来选择元素。这些字符串比紧耦合到DOM结构的选择器更具弹性。

拥有强大的自动化功能

  • 多个域,页面和框架。Playwright是一种进程外自动化驱动程序,不受页面内JavaScript执行范围的限制,并且可以自动执行具有多个页面的方案。

  • 强大的网络控制。Playwright引入上下文范围的网络拦截以便进行终止或者模拟网络请求。

  • 现代网络功能。Playwright通过插入阴的选择器,地理位置,权限,Web Worker和其他现代WebAPI支持Web组件。

  • 涵盖所有场景的能力。支持文件下载和上传,进程外iframe,原生输入事件,甚至是深色模式

与selenium对比

Selenium 架构

 蓝色图中的Selenium Language Binding就是我们平时使用的编码语言,包括java、python等等。可以看到这些语言并没有直接与Browser Drivers进行通信,而是通过了JSON WireProtocol,这就是webdriver协议,然后通过webdriver协议在与各个浏览器的driver进行通信,最后各个浏览器的driver与其对应的浏览器进行通信。这里我们以chromedriver为例进行讲解,他负责与chrome浏览器进行通信。我们在代码中直接 newChromeDriver() 将会启动一个 ChromeDriver进程,ChromeDriver是一个独立的服务,它是google为网站开发人员提供的自动化测试接口,是 selenium 和chrome浏览器进行通信的桥梁。chromeDriver解析webdriver协议,然后根据解析结果,调用与之对应的Chrome DevTool Protocol(CDP)协议来操控chrome浏览器,它可以和浏览器内核进行交互进而操控浏览器,这里就不对该协议进行详细介绍了。另外,其他浏览器的dirver与其对应浏览器的通信原理与ChromeDriver类似

Playwright 架构

 client:在客户端是我们用不同的编程语言编写的代码,如JavaScript,Java,Python,C#等。
 server:Playwright的server通过nodejs构建并负责与client 以及不同的 Web 浏览器引擎进行通信。
 通信协议:client通过WebSocket 协议与Playwright server 通信;
 Playwright使用 Chrome DevTools 协议(CDP)与 Chromium 通信。对于Firefox和WebKit,Playwright实现了自己的协议,类似于CDP。一旦触发测试,client端代码将被转换为JSON格式,然后使用websocket协议发送到服务器。palywright通过单个 websocket 协议连接传达所有请求,该连接将保持不变,直到所有测试执行完成。由于命令是在单个连接上发送的,因此测试失败或不稳定的可能性较小,并且命令可以快速执行。这种架构与Selenium相反,Selenium使用HTTP连接协议,并将每个命令(如浏览器打开,单击,发送密钥或关闭浏览器)作为单独的HTTP请求发送。此外,在Selenium中,服务器和客户端之间的连接将在每次请求后终止,并为下一个请求重新建立。最后划重点:这就是Playwright比selenium快的原因!

Playwright安装

 pip install playwright # 安装第三方库
 playwright install # 安装自带浏览器和ffmpeg

API

内容管理器PlaywrightContextManager

浏览器类型BrowserType

 with sync_playwright() as pw: 
 def sync_playwright() -> PlaywrightContextManager:
       return PlaywrightContextManager()
pw对象属性(方法)说明
chromiumchromium内核浏览器
devices设备
firefoxfirefox浏览器
webkitwebkit内核浏览器

浏览器类型BrowserType

 from playwright.sync_api import sync_playwright
 with sync_playwright() as pw:
     browser = pw.chromium.launch(headless=False)
对象属性(方法)说明
connect
connect_over_cdp
executable_path
launch运行,可以配置参数
launch_persistent_context
name浏览器的名字
on
once
remove_listener

浏览器对象browser

 from playwright.sync_api import sync_playwright
 ​
 with sync_playwright() as pw:
     browser = pw.chromium.launch(headless=False)
对象属性(方法)说明
close
contexts
is_connected
new_browser_cdp_session
new_context一个上下文,可用来管理多个窗口
new_page打开一个新窗口
on
once
remove_listener
versionchromium的版本

页面对象Page

 page = browser.new_page()
 #源码
 def new_page(
     self,
     *,
     viewport: ViewportSize = None,
     screen: ViewportSize = None,
     no_viewport: bool = None,
     ignore_https_errors: bool = None,
     java_script_enabled: bool = None,
     bypass_csp: bool = None,
     user_agent: str = None,
     locale: str = None,
     timezone_id: str = None,
     geolocation: Geolocation = None,
     permissions: typing.List[str] = None,
     extra_http_headers: typing.Optional[typing.Dict[str, str]] = None,
     offline: bool = None,
     http_credentials: HttpCredentials = None,
     device_scale_factor: float = None,
     is_mobile: bool = None,
     has_touch: bool = None,
     color_scheme: Literal["dark", "light", "no-preference"] = None,
     forced_colors: Literal["active", "none"] = None,
     reduced_motion: Literal["no-preference", "reduce"] = None,
     accept_downloads: bool = None,
     default_browser_type: str = None,
     proxy: ProxySettings = None,
     record_har_path: typing.Union[str, pathlib.Path] = None,
     record_har_omit_content: bool = None,
     record_video_dir: typing.Union[str, pathlib.Path] = None,
     record_video_size: ViewportSize = None,
     storage_state: typing.Union[StorageState, str, pathlib.Path] = None,
     base_url: str = None,
     strict_selectors: bool = None
     ) -> "Page":
 ​
对象属性(方法)说明
click在页面上定位后点击,click(待点击元素的selector)
dblclick双击
drag_and_drop拖拽
evaluate执行js
fill在页面上定位后输入,ϐill(selector,'要输入的内容')
frame_locator定位frame
get_attribute获取属性
go_back后退
go_forward前进
goto打开URL
hover悬停
keyboard键盘
locator定位器
mouse鼠标
screenshot截图,注意要传参path='1.png'
title页面title
text_content文本信息
url页面url
wait_for_timeout超时等待,类似于time.sleep,不建议在Playwright中使用

★定位locator

定位方式

定位方式示例备注
idpage.locator('id=ls_username').fill('admin')
csspage.locator('input#ls_username.pn.vm')css是默认的语法直接写,也可以用css=
xpathpage.locator("xpath=//a")注意一定不要'//a'加引号
textpage.locator("text=百度")同样text部分也不要加引号
页面布局定位page.locator("text=百度:near(表达式)")
page.locator("text=百度:above(表达式)")
page.locator("text=百度:below(表达式)")
page.locator("text=百度:left-of(表达式)")
page.locator("text=百度:right-of(表达式)")
下标定位page.locator('input >> nth=0').fill('admin')第一个input中输入admin
组合定位page.locator('td>.xi2.xw1 >> text=立即注text可以去其他方式组合起来

定位Element

定位方式示例备注
query_selectorpage.query_selector('input').fill('admin')获取页面xxx节点,多个时返回第一个
query_selector_allpage.query_selector_all('input')[0].fill('admin')获取页面所有xxx节点,返回对象是list,每个元

鼠标操作

操作示例
单击page.click("[value='click me']")
右击page.click('[value="right click me"]',button='right')
双击page.dblclick("[value='dbl click me']")
按住shift点击page.click('元素selecotr', modifiers=['Shift'])

元素对象Locator

 username = page.locator('#ls_username')
对象属性(方法)说明
all_inner_texts
all_text_contents所有文本内容
click单击
count定位到的元素的个数
dblclick双击
evaluate执行js
fill输入内容(没有间隙)
filter定位再定位
ϐirst多个中的第1个
get_attribute获取元素的属性
last多个中的最后一个
locator定位再定位
text_content文本内容
type可以通过delay参数指定输入的间隔,单位注意是毫秒

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

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

相关文章

VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION--论文笔记

论文笔记 论文来源 Very Deep Convolutional Networks for Large-Scale Image Recognition 代码来源 还没上传 数据集 这里采用的是猫狗数据集 还没上传 1论文摘要的翻译 在这项工作中,我们研究了卷积网络深度对其在大规模图像识别设置中的准确性的影响。我…

CTFHUB技能树——SSRF(二)

目录 上传文件 ​FastCGI协议 Redis协议 上传文件 题目描述&#xff1a;这次需要上传一个文件到flag.php了.祝你好运 index.php与上题一样&#xff0c;使用POST请求的方法向flag.php传递参数 //flag.php页面源码 <?phperror_reporting(0);if($_SERVER["REMOTE_ADDR&…

删除MySQL中所有表的外键

方法一&#xff1a; 原理 查询schema中所有外键名称然后拼接生成删除语句 第一步&#xff1a; SELECT CONCAT(ALTER TABLE ,TABLE_SCHEMA,.,TABLE_NAME, DROP FOREIGN KEY ,CONSTRAINT_NAME, ;) FROM information_schema.TABLE_CONSTRAINTS c WHERE c.TABLE_SCHEMA数据库名…

node环境问题(无法加载文件D:\Software\Node.js\node_global\vue.ps1,因为在此系统上禁止运行脚本。)

问题&#xff1a;npm安装lerna显示安装成功&#xff0c;但是lerna -v的时候报错 解决步骤&#xff1a; 1、输入&#xff1a;Get-ExecutionPolicy 2、输入&#xff1a;Set-ExecutionPolicy -Scope CurrentUser&#xff08;有选项的选Y&#xff09; 3、输入&#xff1a;RemoteSi…

超详细的前后端实战项目(Spring系列加上vue3)前端篇(二)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分 昨天完成了全局页面的代码&#xff0c;和登录页面的代码&#xff0c;不过昨天的代码还有一些需要补充的&#xff0c;这里添加一下 内容补充&#xff1a;在调用登…

信息系统项目管理师0129:输入(8项目整合管理—8.7监控项目工作—8.7.1输入)

点击查看专栏目录 文章目录 8.7 监控项目工作8.7.1 输入8.7 监控项目工作 监控项目工作是跟踪、审查和报告整体项目进展,以实现项目管理计划中确定的绩效目标的过程。本过程的主要作用: 让干系人了解项目的当前状态并认可为处理绩效问题而采取的行动;通过成本和进度预测,让…

房地产支持政策加码不断,美克家居全力变革未来可期

2023年我国经济处于恢复发展阶段&#xff0c;而家具制造业“回温”速度明显慢于经济增速&#xff0c;在这一背景下&#xff0c;美克家居如此营收表现并不令人感到意外。而在充沛现金流支撑下&#xff0c;辅以全方位开展降本增效的年度经营规划&#xff0c;公司亏损收窄或已为期…

rclone迁移对象存储之间的数据

1 概述 rclone是一款文件复制工具&#xff0c;既可以用于在linux主机之间复制文件&#xff0c;也可以在对象存储之间复制文件。 rclone的官网为&#xff1a; https://rclone.orgrlcone关于对象存储的官方文档为&#xff1a; https://rclone.org/s32 安装 2.1 yum安装 yum …

【全网最全】2024电工杯数学建模A题前两问完整解答+21页初步参考论文+py代码+保奖思路等(后续会更新成品论文)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题前两问完整解答21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有…

在线生成数据库er图的工具

网址 https://databasediagram.com/ 其实很早之前我也有类似的想法&#xff0c;根据数据表结构&#xff0c;显示数据表之间的关系图。 当时我还写了一个工具&#xff0c;可惜后来就没怎么用过了。 这个网站和我当时的思路很像&#xff0c;只不过他这个页面显示比我的好得多&…

谈恋爱没经验?那就来刷谈恋爱经验宝宝吧

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

C++青少年简明教程:If选择语句

C青少年简明教程&#xff1a;If选择语句 C中选择语句的语法是&#xff1a; if (条件) { 条件成立时需要执行的语句... } [else { 条件不成立时需要执行的语句... }] 说明&#xff1a; if后面使用一个括号&#xff0c;括号里是条件——关系表达式。 所谓的关系表达式就是判…

报错:找不到或无法加载主类 com.example.SpringbootApplication(idea)

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 错误: 找不到或无法加载主类 com.example.SpringbootApplication 原因: java.lang.NoClassDefFoundError: com/example/SpringBootAppli…

上位机图像处理和嵌入式模块部署(mcu中的串口接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在mcu开发中&#xff0c;mcu扮演着非常重要的角色。一方面&#xff0c;串口可以帮助我们对固件功能进行调试&#xff0c;另外一方面&#xff0c;串…

小猫咪的奇幻冒险:一个简单的Python小游戏

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、游戏简介与演示 二、游戏开发与运行 1. 环境搭建 2. 代码解析 3. 加速机制 三、游戏…

k近邻和kd树

K近邻 选取k值的时候可以采用交叉验证的方法 一般采用欧氏距离 kd树 采用树这个特殊的数据结构来实现k近邻算法 先假设是二维的情况 下面讲解kd树的完整构造过程 找这个中位数是按照每棵子树来创建的 前提是已经有了一棵kd树,然后来一个实例点

45岁前TVB有型熟男生图流出

凭无线处境剧《爱回家》中饰演律师「严谨」一角成功入屋的张达伦&#xff0c;于2022年约满无线离巢后&#xff0c;正式「卖身」给杜琪峰成为旗下艺人&#xff0c;先后亮相ViuTV剧集及综艺节目&#xff0c;又参与电影演出&#xff0c;作多方面尝试和发展。 日前有网民食完糖水在…

网段与广播域

ip地址与子网掩码做与运算得到网络号&#xff0c;得到的网络号相同就是同一个网段&#xff0c;否则不是&#xff0c;跟他们在什么位置没有任何关系 这里面pc3和前两个pc虽然不在同一个网段&#xff0c;但是pc1发广播包的时候&#xff0c;pc3也能收到&#xff0c;因为路由器的所…

离开谷歌:九年之后,我为何选择离开这家公司

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【学习笔记】Windows GDI绘图(四)矩阵Matrix详解

矩阵Matrix 基于矩阵在GDI绘图的重要性&#xff0c;所以想深入了学习矩阵的相关属性与方法。 先上个本文中所有的函数图例演示吧。 原型&#xff1a; namespace System.Drawing.Drawing2D;public sealed unsafe class Matrix : MarshalByRefObject, IDisposableMatrix类封装…