新一代自动化测试神器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协议去驱动并操作浏览器)。

    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

1
pip install playwright

安装内置浏览器

使用以下命令安装Playwright自带的各种浏览器:

1
playwright install

由于安装的内容比较多,所以这一步需要花费一点时间。

第一个Playwright脚本

1. 使用with方式启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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()方式启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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应用程序的自动化测试。选择一个测试框架,必须考虑日常工作中的场景以及当前的团队,进而选择合适的自动化测试工具来进行测试。而不是使用一个新的花里胡哨的框架,然后一段时间后因为它没有满足我们的需求而抛弃它。

当然,同时掌握多种技术栈再好不过了,正所谓“兵来将挡,水来土掩”,无论企业中选择哪种工具,都可以快速上手,也是自身能力的体现。

最重要的是要行动起来,多写多练,日积月累,自然会如鱼得水,真正把自动化测试在企业中落地,带来对应的效率和质量保障方面的提升。