新一代自动化测试神器Playwright
转载请注明出处??
作者:测试蔡坨坨
原文链接:caituotuo.top/4bedb73c.html
你好,我是测试蔡坨坨。
说到WebUI自动化测试,首当其冲的当属Selenium,在很长的一段时间内,Selenium统治着Web自动化,Selenium其实经历了四个阶段,从2006年发布的Selenium 1.0到最新的Selenium 4.8.3。
-
2006年,Selenium 1.0发布
Selenium 1.0包含Selenium IDE(浏览器插件,可以帮助我们录制并生成脚本,对于不会代码的同学来说,它是一个非常好的开始,但现在基本被淘汰了)、Selenium Grid(分布式,将一套脚本分发到不同的机器上执行,功能非常强大,现在还在使用)、Selenium RC(脚本控制浏览器实现自动化的原理,但是它的实现并不完善,到Selenium 2.0时代被WebDriver替代)。
同年,Google工程师Simon Stewart发起了一个名为WebDriver的项目,它也是一个自动化测试工具,彼时刚刚起步,后来它也成为Selenium的竞品之一。
-
2009年,Selenium 2.0发布
2009年,在Google测试自动化会议上,Selenium和WebDriver两个团队的开发人员在沟通后决定合并这两个项目,新项目被命名为Selenium Web Driver,也就是Selenium 2.0。很多人接触Selenium,也是从Selenium 2.0开始的。WebDriver的实现原理其实就是在
Web浏览器
和我们的脚本
之间有一个WebDriver,通过WebDriver协议去驱动并操作浏览器(具体实现+源码解析可参考往期文章「Selenium底层逻辑源码解析」)。WebDriver的作者是这样解释二者合并的原因:“一方面WebDriver解决了Selenium存在的缺点(例如:可以绕过JavaScript沙箱,WebDriver有出色的API),另一方面Selenium解决了WebDriver存在的问题,还有就是Selenium主要贡献者和WebDriver的作者都认为合并项目是为用户提供最优秀框架的最佳途径。”
Selenium 2.x(WebDriver)真正兴起是在2014年开始,到2016年左右成为Web自动化最热门的框架。几乎谈及Web自动化,那就是Selenium。它不仅在Web自动化测试领域很火,在爬虫领域也是非常热门。
-
2016年,Selenium 3.0发布
这个版本并没有引入新的工具,主要是加强了对浏览器的支持。
完全移除了Selenium RC;WebDriver暴露一个供浏览器接入的API,通过各浏览器厂商提供的Driver来接入;将内置的Firefox Driver剔除;支持Firefox通过GRCKO Driver来接入Selenium;通过Apple提供的Safari Driver来接入Safari;通过Edge Driver支持IE接入。
所以,3.x和2.x其实没有太大的区别。
-
2021年,Selenium 4.0发布
在Selenium 3.x中,与浏览器的通信基于JSON-wire协议,因此Selenium需要对API进行编解码。而Selenium 4遵循W3C标准协议,Driver与浏览器之间通信的标准化使得它们可以直接通信。
除此之外,Selenium 4还做了一些其他的改动,可参考往期文章「Selenium 4 有哪些不一样?」。
由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化,因此Selenium一统天下的地位也由于新框架的出现变得不那么稳固。
2020年左右出现的Cypress、TestCafe、Puppeteer,在技术雷达中被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三个框架都是基于JavaScript开发的,所以就需要测试人员熟悉JavaScript,并且都不支持Python,所以使用率并没有很高。
Playwright简介
2020年,微软(Microsoft)开源了一个名为Playwright的工具,与Selenium一样入门简单,支持多语言(Python、Java、Node.js、.NET),大厂出品,必属精品。它刚出现的时候,并没有多火,随着时间的推移,到2022年左右,Playwright已经被更多的人注意到并接受它,甚至比Selenium更好更强大。
Playwright是一款定位于端到端(End-to-End,端到端就是用于测试整个应用程序的流程是否符合预期的测试技术,模拟用户真实使用场景,为实现这一目标,该系统通常被视为黑盒子,也就是所谓的黑盒测试,主要通过GUI和API等公共接口对其进行操作)的测试工具。
虽然目前在国内Web自动化测试的扛把子还是Selenium,但是国外已经有很多企业都在使用Playwright,比如:Adobe、微软自带的某些项目(Visual Studio Code、Bing)、Disney Hostar等。
既然在市面上已经有非常成熟好用的Selenium框架,并且在持续的更新,社群也十分活跃,微软为什么还要整一个额外的自动化测试工具出来呢?
两个工具的定位不同,由于Playwright是后出来的工具,所以在一些细节方面会处理得更好。
-
跨浏览器
虽然Selenium提供了几乎所有浏览器的兼容和支持,但是还需要额外下载对应的浏览器版本的驱动,否则Selenium WebDriver可能就无法启动。而Playwright内置了各种浏览器以及浏览器驱动(支持所有现代渲染引擎,包括Chromium、Firefox和WebKit),并且不需要额外的升级和管理,这样一来整个自动化测试项目将会更加稳定。
-
自动等待
在使用Selenium的时候,我们通常会根据测试需求,在代码中加入各种等待,而在Playwright中没有所谓的隐式等待,而显示等待也已经封装好了,直接调用即可。
-
Web优先断言
Playwright会根据网络环境进行自动断言,直到满足某种条件为止。
-
追踪
Playwright可以很方便地配置重试策略,并进行自动的追踪结果,以截图和录屏的方式进行记录。
-
并行执行
在Selenium中,执行测试用例是单线程的,但是在Playwright中,由于运行机制不一样(Selenium的指令发送是通过http协议,而Playwright则是使用socket协议;Playwright是通过上下文管理浏览器,相当于每一个测试用例都会创建一个独立的上下文,浏览器的上下文其实就是一个全新的浏览器,这种方式的好处就是在提速的同时又实现测试与测试之间的隔离,使得测试结果更加准确),所以可以实现并行执行。
-
强大的工具集
Playwright给我们提供了强大的工具集,例如:脚本录制工具codegen、脚本编写以及调试工具playwright等。
Playwright初体验
以Python语言为例,编写第一个Playwright脚本。
PS:Playwright 需要 Python >=3.7 版本
安装playwright
pip install playwright
安装内置浏览器
使用以下命令安装Playwright自带的各种浏览器:
playwright install
由于安装的内容比较多,所以这一步需要花费一点时间。
第一个Playwright脚本
1. 使用with方式启动
# author: 测试蔡坨坨
# datetime: 2023/4/8 2:18
# function: 第一个playwright脚本,使用with写法
from playwright.sync_api import sync_playwright, expect
def run(playwright):
chromium = playwright.chromium # or "firefox" or "webkit".
browser = chromium.launch(headless=False) # headless表示是否使用无头浏览器(也就是无GUI模式)
page = browser.new_page()
page.goto("https://caituotuo.top")
# other actions...
print(page.title())
browser.close()
with sync_playwright() as playwright:
run(playwright)
# 这里使用的是with方法,Python中的with方法可以很方便处理一些需要提前设置,事后需要清理的工作
# playwright正好有上下文处理,所以使用with写法会使代码更加简洁
# 比如:
# with open("/caituotuo.txt") as f:
# f.read()
#
# 非with方式可能存在问题:1.可能忘记关闭文件句柄 2.文件读取数据时发生异常,但是没有进行任何处理
# f = open("/caituotuo.txt")
# data = f.read()
# f.close()
2. 使用start()方式启动
# author: 测试蔡坨坨
# datetime: 2023/4/8 2:20
# function: 使用start()写法,直接实例化playwright同步方法
from playwright.sync_api import sync_playwright
playwright = sync_playwright().start()
chromium = playwright.chromium # or "firefox" or "webkit".
browser = chromium.launch(headless=False) # headless表示是否使用无头浏览器(也就是无GUI模式)
page = browser.new_page()
page.goto("https://caituotuo.top")
# other actions...
print(page.title())
browser.close()
总结
Selenium和Playwright都是流行的自动化测试工具,都拥有丰富的功能和API,都可以用于Web应用程序的自动化测试。选择一个测试框架,必须考虑日常工作中的场景以及当前的团队,进而选择合适的自动化测试工具来进行测试。而不是使用一个新的花里胡哨的框架,然后一段时间后因为它没有满足我们的需求而抛弃它。
当然,同时掌握多种技术栈再好不过了,正所谓“兵来将挡,水来土掩”,无论企业中选择哪种工具,都可以快速上手,也是自身能力的体现。
最重要的是要行动起来,多写多练,日积月累,自然会如鱼得水,真正把自动化测试在企业中落地,带来对应的效率和质量保障方面的提升。