Playwright教程

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_playwrightwith 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.mzph.cn/diannao/14872.shtml

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

相关文章

【哈希映射 字符串 乘法原理】2227. 加密解密字符串

本文涉及知识点 哈希映射 字符串 乘法原理 LeetCode 2227. 加密解密字符串 给你一个字符数组 keys ,由若干 互不相同 的字符组成。还有一个字符串数组 values ,内含若干长度为 2 的字符串。另给你一个字符串数组 dictionary ,包含解密后所…

SpringCloud微服务03-微服务保护-分布式事务-MQ基础-MQ高级

一、微服务保护 1.雪崩问题 如何做好后备方案就是后续: 2.雪崩解决方案 某一个服务的线程是固定的,出现故障线程占满后,就不会让取调用这个服务,对其他服务就没有影响。 3.Sentinel ①初识Sentinel 配置过程:day05-服…

C++之多态详解

1. 多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票&a…

源码编译安装LAMP

目录 1.LAMP概述 2.编译安装Apache httpd服务 1.关闭防火墙,将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径,并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别 6.添…

数据清洗(ETL)案例实操

文章目录 数据清洗(ETL)概述案例需求和分析代码实现和结果分析 数据清洗(ETL)概述 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换&…

查询一个字符串在另一个字符串中出现的次数(java)

查询一个字符串在另一个字符串中出现的次数 例: String str1“helloworld,java,python,hellokafka,world big table helloteacher”; String str2“hello”; 字符串str2在str1中出现3次 代码 package exercise.test8;public class Demo8 {public static void mai…

【网络安全】2030年十大新兴网络安全威胁

欧盟网络安全局(ENISA)已发布了一份全面的清单,列出了预计到2030年将影响数字领域的十大新兴网络安全威胁。 该预测是为期八个月的广泛研究的成果,融合了ENISA前瞻专家小组、CSIRTs网络以及欧盟CyCLONe专家的见解。 这项研究突显…

[技术报告]InternLM2 Technical Report

摘要 像ChatGPT和GPT-4这样的大型语言模型(llm)的进化引发了人们对人工通用智能(AGI)出现的讨论。然而,在开源模型中复制这种进步一直是一个挑战。本文介绍了InternLM2,这是一个开源的大语言模型&#xff…

【面试干货】矩阵对角线元素之和

【面试干货】矩阵对角线元素之和 1、实现思想2、代码实现 💖The Begin💖点点关注,收藏不迷路💖 1、实现思想 创建一个3x3的二维数组来表示输入的矩阵。通过嵌套循环读取输入的矩阵元素,并将其保存到数组中。再次嵌套循…

揭秘齿轮加工工艺的选用原则:精准打造高效传动的秘密武器

在机械制造领域,齿轮作为传动系统中的重要组成部分,其加工工艺的选择至关重要。不同的齿轮加工工艺会影响齿轮的精度、耐用性和效率。本文将通过递进式结构,深入探讨齿轮加工工艺的选用原则,带您了解如何精准打造高效传动的秘密武…

Web应用防火墙的重要性

网络安全是一个永恒的话题,尤其是在未知威胁不断涌现的情况下。企业网络安全是保障业务稳定运行的基础,Web应用防火墙(WAF)是企业网络安全的重要屏障,其性能直接影响到网络服务的质量和安全。 Web应用防火墙是什么? Web应用防火墙…

试试这个自动备份工具!

需要定时备份数据! 在这个科技迅速发展的时代,数据安全变得极为重要。作为普通用户,我们需要了解数据备份的重要性。数据备份就像一把保护我们的伞,让我们不用担心重要文件意外丢失带来的困扰。如果我们忽视数据备份,…

SpringIOCDI—第一讲

文章目录 什么是IOC什么是控制,谁控制谁什么是反转,从什么反转到什么了 IOC的注解五大类注解Controller注解(控制器存储)Service(服务存储)Repository(仓库存储)Componet(组件存储)C…

云端漫步:搭建个人博客的移动云之旅

💂作者简介: Thunder Wang,阿里云社区专家博主,华为云云享专家,腾讯云社区认证作者,CSDN SAP应用技术领域优质创作者。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完…

每日一题(3)——统计合格率(不会哦)

我们来看一个案例: 如何理解 pass【j】 ? 为什么pass[0]3,pass[1]4? 我一直没有想通,自己重新测试了一些数据,还是没有想明白,希望大家能够集思广益,点拨点拨: 下面的数组我随便使用的数据, …

基于EBAZ4205矿板的图像处理:09基于sobel边缘检测的图像锐化

基于EBAZ4205矿板的图像处理:09基于sobel边缘检测的图像锐化 项目全部文件 随后会上传项目全部文件 先看效果 锐化的有点过头了,不过我也懒得改了,想要改也很简单,无非就是给卷积运算后的结果加个系数,通过改系数调…

【数据分析】Numpy和Pandas库基本用法及实例--基于Japyter notebook实现

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 承接上篇的博客 数据分析—技术栈和开发环境搭…

家政预约小程序03分类管理

目录 1 创建数据源2 搭建导航菜单3 搭建小程序4 设置变量5 变量绑定总结 家政预约小程序里,在首页需要展示家政可以开展的各类业务。我们把业务按照类别进行划分,本篇我们介绍一下管理后台的维护功能以及小程序的展示功能。 1 创建数据源 为了管理和展示…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行,目前西藏、陕西准考证打印入口已开通,各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…

Qt 报错总结 No suitable kits found

目录 “No suitable kits found” 解决 解决方法参考: chatGPT辅助解决QT构建报错error: multiple target patterns 我的解决方法:把语言设置为空 “No suitable kits found” 解决 没有找到合适的kits套件,在安装Qt Creator时没有安装Min…