playwright自动化测试工具,是相较于Selenium自动化测试工具后出现的WEB UI自动化测试工具,帮助快速获取界面元素,构建页面元素定位的编码。
本文系统地介绍了playwright的基础概念,架构,安装过程,编码demo(python实例),常用API,录制脚本的方法以及playwright在无头模式的应用和其与selenium的对比。
简单介绍:
playwright能够普及使用,因为其具有以下优点:
playwright是由微软开发的Web UI自动化测试工具, 支持的浏览器包括:Chromium, Firefox and WebKit,支持的编码语言包括:Node.js、Python、C# 和 Java语言。
官网https://playwright.dev/
playwright具有以下特点:
一、支持所有主流浏览器并跨平台
支持所有主流浏览器:基于Chromium内核的Google Chrome 和 Microsoft Edge浏览器), WebKit内核的Apple Safari 和 Mozilla Firefox浏览器,不支持IE11。
跨平台:Windows、Linux 和macOS
可用于模拟移动端WEB应用的测试,不支持在真机上测试。
支持无头模式(默认)和有头模式
二、快速可靠的执行
自动等待元素
Playwright基于Websocket协议,可以接受浏览器(服务端)的信号
浏览器上下文并行:单个浏览器实例下创建多个浏览器上下文,每个浏览器上下文可以处理多个页面。
有弹性的元素选择:可以使用文本、可访问标签选择元素。
playwright与selenium使用的协议不同:
selenium使用的是http协议,playwright使用的是websock协议,Playwright使用 Chrome DevTools 协议 (CDP) 与 Chromium 通信。对于Firefox和WebKit,Playwright实现了自己的协议,类似于CDP。一旦触发测试,client端代码将被转换为JSON格式,然后使用websocket 协议发送到服务器。palywright通过单个 websocket 协议连接传达所有请求,该连接将保持不变,直到所有测试执行完成。由于命令是在单个连接上发送的,因此测试失败或不稳定的可能性较小,并且命令可以快速执行。这种架构与Selenium相反,Selenium使用HTTP连接协议,并将每个命令(如浏览器打开,单击,发送密钥或关闭浏览器)作为单独的HTTP请求发送。此外,在Selenium中,服务器和客户端之间的连接将在每次请求后终止,并为下一个请求重新建立。最后划重点:这就是Playwright比selenium快的原因!
websock协议和http协议介绍:
WebSocket协议是H5的提出的在单个TCP协议上进行全双工通信的协议,它允许服务器主动向客户端推送数据,客户端和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输,WebSocket是基于HTTP协议的,借助HTTP协议来完成握手。
WebSocket的工作过程
客户端发送HTTP请求,经过三次握手,建立TCP连接,在HTTP请求里存放WebSocket支持的版本号等信息
服务器接收请求,同样以HTTP协议回应
连接成功,客户端与服务器建立持久性的连接,连接之后客户端和服务器之间就可以随时通讯了,直到其中一方关闭连接
两个协议之间的比较
相同点:
都是基于TCP协议实现的
都使用Request/Response模型进行连接的建立
WebSocket是基于HTTP的,他们的兼容性都很好
在连接的建立过程中对错误的处理方式相同
都可以在网络中传输数据
不同点:
WebSocket是持久连接,而HTTP是短连接,这意味着WebSocket可以在连接建立后保持连接状态,而HTTP需要在每次请求完成后关闭连接。
WebSocket是以ws/wss开头,而HTTP则是以http/https开头
WebSocket是有状态的,而HTTP是无状态的,这意味着WebSocket可以在连接建立后保持状态,而HTTP每次请求都是独立的。
WebSocket连接之后,服务器和客户端可以双向发送数据,而HTTP只能是客户端发起一次请求后,服务器才能返回数据
playwright的安装:
playwright如果基于python环境进行测试的话,就需要先安装python,然后控制台输入pip install playwright
安装Chromium、Firefox、WebKit等浏览器的驱动文件(内置浏览器)
python -m playwright install
playwright脚本编写:
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.baidu.com/")
page.locator("#kw").click()
page.locator("#kw").fill("playwright介绍")
page.locator("#kw").click()
page.locator("#kw").click()
page.locator("#kw").click()
page.locator("#kw").press("ArrowLeft")
page.locator("#kw").press("ArrowLeft")
page.locator("#kw").fill("playwright使用介绍")
page.get_by_role("button", name="百度一下").click()
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
playwright元素定位的方法还是以往的8大定位方法,不过相比较selenium在写法上有区别:详细定位方法之前文章整理过https://blog.youkuaiyun.com/qqlovelinlin/article/details/138997908,可以看这个文章
playwright 和selenium比较:
playwright比selenium快,但是不适用于旧版浏览器和设备