一、Playwright 是什么?
Playwright 是微软2020年开源的一个用于 Web 测试和自动化的Node.js 库,通过一个 API,可以自动化运行在Chrome,Edge、Firefox和Safari等浏览器上。它的功能类似于 Selenium、Pyppeteer 等,都可以驱动浏览器进行各种自动化操作。它的功能也非常强大,对市面上的主流浏览器都提供了支持,API 功能简洁又强大。虽然诞生比较晚,但是现在发展得非常火热。Playwright 支持大部分的语言,Node.js,Python,Java,.net,并且支持谷歌,火狐浏览器,WebKit,对于移动端也支持,可以在 Windows、Linux、macOS 等机器上运行。脚本执行支持同步或者异步的方式。
说到UI自动化,可能大家以前主要是用Selenium。毕竟Selenium可是UI自动化方面的王者。而且Selenium上手很快,使用者广泛,社区活跃,遇到问题随时可以找到一大堆相关的网页给你提供帮助。
那既然这样,为什么新出的这个Playwright还能掀起一阵热潮呢?
一方面这是IT技术领域的一个趋势,从业人需要时刻关注业内的新技术,新方向,不断提升自己的能力,或者给公司,团队带来新的idea,这样才能不断在职业生涯中稳步向前。另一方面,Selenium虽然有着各种突出的优势,但是弊端也很明显:
它依赖多种不同的driver,根据浏览器的不断更新,就要不断去维护这些driver,以及处理相应的适用性问题。比如chromedriver升级到适用chrome version: 88,关于之前Ctrl+a的调用就不支持了,需要调整相应code。
那Playwright和Selenium具体有什么去区别呢?
区别一:
Selenium只提供了Web自动化功能,如果要做自动化测试,要结合其他自动化测试框架;
而Playwright是面向自动化测试的,除了Web自动化功能,它也包含了自动化测试的功能框架;
区别二:
两者的自动化原理:Selenium 需要单独安装 WebDriver,而 Playwright 内置浏览器驱动,直接运行
二、为什么建议你使用Playwright 来做自动化测试?
Playwright 在跨浏览器、跨平台和跨语言方面的能力非常突出,
为什么建议你使用 Playwright ?有以下几个原因:
- 兼容性非常强大。 Playwright 可以在Windows、Linux 和 macOS 上使用,所有的主流浏览器(Chromium、 WebKit、 Firefox) 都支持。并且,它还支持多种编程语言,比如Java、 JavaScript、 Python 和 .NET ,有统一的API来让你调用。
- 稳定性非常强大。 Playwright会自动等待元素出现,并可操作,从而可以减少不稳定性。它的 web 优先断言和重试逻辑有助于确保测试的可靠性,而不需要手动设置超时。
- 完全测试隔离。 每个测试都是在单独的浏览器上下文中运行,Playwright会模拟一个全新的浏览器配置文件,这样可以确保每个测试之间不会互相干扰。您可以保存身份验证状态,避免重复登录,同时保持测试的独立性。
- 高级测试场景。 Playwright允许你在多个选项卡、用户或上下文的复杂工作流中测试,并且可以让你操作真实的浏览器输入和操作DOM元素,模仿真实的用户操作。
- 丰富的调试工具。 Playwright Inspector、Codegen和Trace Viewer这些工具,方便你快速地检查元素和调试。还提供了视频、屏幕快照和 DOM 快照等方式,让你可以全面的了解测试全过程。
三、Playwright 是如何工作的?
在讲Playwright的工作原理前,我们可以先看下Selenium是如何工作的。Selenium会将每个命令作为独立的 HTTP请求发送,然后接收对应的JSON 响应,你的每个操作,比如打开浏览器窗口、单击元素或向输入框输入文本都会作为独立的 HTTP 请求发送。
而这种做法,往往意味着,我们必须等待更长的时间才能得到响应,并增加了出错的可能性。
而Playwright是怎么运行的呢?Playwright 没有通过单独的 WebSocket 与每个驱动程序进行通信。而是依赖于一个单独的 WebSocket 连接与所有驱动程序进行通信,直到测试完成。这允许在单个连接上快速发送命令,从而减少出错。
提高性能
- 减少开销:多个 WebSocket 连接会消耗系统资源,而 Playwright 通过一个连接管理所有驱动程序,减少了不必要的开销。
- 降低延迟:减少了 WebSocket 连接建立、维护的开销,提高了整体响应速度。
- 更快的执行速度:统一管理多个浏览器实例,减少通信延迟,尤其在并发测试时效果更明显。
更好的资源管理
- 减少系统负担:单个 WebSocket 消耗的内存和 CPU 资源较少,避免了多个连接导致的资源竞争。
- 简化网络通信:减少了数据包在网络中的来回传输,降低了网络负载。
大家有兴趣的,可以移步Playwright官网进行更多学习:Fast and reliable end-to-end testing for modern web apps | Playwright