playwright - 剧作家, 端对端测试

news2024/12/23 17:57:17


outside_default.png

本文基于 playwright v1.34.3, node v18.16.0

注意:playwright 版本随 node lts 版本更新而更新,所以请确保 node 版本与 playwright 版本匹配。

写在前面

前端开发阶段,少不了测试,一般包含两类测试:单元测试、端对端测试(e2e)。

对于组件和函数,单元测试库如jestmocha, 就可以轻松胜任。但如果是涉及到页面多模块的复杂交互场景,e2e就必不可少了。e2e能做到:

  1. 模拟用户在浏览器中的操作

  2. 模拟真实浏览器运行环境

  3. 操控运行时环境,获取运行时的数据

  4. 截屏比对各个节点效果

e2e,开源领域有许多工具可用,出名的有google的puppeteer。当然puppeteer只是提供了与chrome浏览器交互的能力,要做到e2e,你还需使用如jest的测试库。

这里要介绍一下另一个e2e测试工具,本文的主角,专为e2e而生的playwright("剧作家")。

playwright 是什么

「GitHub Copilot回答」: “Playwright 是一个 Node.js 库,用于自动化浏览器、单页应用程序和跨浏览器测试。它支持 Chromium、Firefox 和 WebKit,可以在这些浏览器中执行自动化测试、爬虫、性能测试等任务。Playwright 还提供了一些方便的 API,如截图、录制视频、模拟用户输入等。同时,Playwright 还支持多种语言,如 JavaScript、TypeScript、Python、Java 和 C# 等。”

为什么选择 playwright

比起“傀儡师”(puppeteer)拥有的操作浏览器的能力,剧作家(playwright)拥有的支持跨操作系统多浏览器多开发语言的创作能力,显然更加强大。(国内下载安装友好!!)

首先,playwright 出自名门,是微软研发团队所开发的一款Web自动化测试框架,发布于2020年初。强大的开源社区为 playwright 的持续发展,提供了稳定的保障。紧跟浏览器版本,及时发布适配版本。

其次,核心成员有来自puppeteer团队的,和前辈puppeteer是一脉相承。所以puppeteer的项目,基本可以做到无缝对接。

最后,最重要的能力,也醒目地写在 github 的 README.md 里面, 这里简要概括一下:

  1. 稳定性高,不易出错,支持“Auto-wait”、“Web-first assertions”、“Tracing”;

  2. 无需取舍,不受限制,“Multiple everything”、“Trusted events”、“Test frames, pierce Shadow DOM”;

  3. 隔离性强,执行速度快,“Browser contexts”、“Log in once”;

  4. 工具强大,拥有“Codegen”、“Playwright inspector”、“Trace Viewer”;

直接安装使用

puppeteer一样,除了需要安装 playwright,还需要下载 playwright 的浏览器驱动,如 chromiumfirefoxwebkit

安装和初始化

安装之前,为了加速下载,可以在全局变量或者 .npmrc 中设置下载源 PLAYWRIGHT_DOWNLOAD_HOST,如:

PLAYWRIGHT_DOWNLOAD_HOST="https://cdn.npmmirror.com/binaries/playwright"

推荐使用 npm init playwright 来安装 playwright

npm init playwright@latest

此时会有个问答提示,如下:

Getting started with writing end-to-end tests with Playwright:
Initializing project in '.'
✔ Do you want to use TypeScript or JavaScript? · JavaScript
✔ Where to put your end-to-end tests? · tests
✔ Add a GitHub Actions workflow? (y/N) · false
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · false

其中:

  1. 可以选择初始化项目的语言类型,TypeScript 或者 JavaScript

  2. 可以选择测试文件的存放目录,默认是 tests

  3. 可以选择是否添加 GitHub Actions 的工作流,用于自动化测试;

  4. 可以选择是否自动安装浏览器驱动,如果选择 false,则需要手动安装。

手动安装浏览器驱动

npx playwright install

另外如果只想下载  Chromium  可以使用--with-deps, 如:

npx playwright install --with-deps chromium

下载过程如下:

Downloading Chromium 114.0.5735.35 (playwright build v1064) from https://cdn.npmmirror.com/binaries/playwright/builds/chromium/1064/chromium-mac-arm64.zip
122.8 Mb [====================] 100% 0.0s
Chromium 114.0.5735.35 (playwright build v1064) downloaded to /Users/liuyapeng/Library/Caches/ms-playwright/chromium-1064
Downloading FFMPEG playwright build v1009 from https://cdn.npmmirror.com/binaries/playwright/builds/ffmpeg/1009/ffmpeg-mac-arm64.zip
1 Mb [====================] 100% 0.0s
FFMPEG playwright build v1009 downloaded to /Users/liuyapeng/Library/Caches/ms-playwright/ffmpeg-1009

为了避免重复下载和方便管理浏览器,playwright 会将浏览器下载到默认缓存文件夹。

  • Windows: %USERPROFILE%\AppData\Local\ms-playwright

  • MacOS: ~/Library/Caches/ms-playwright

  • Linux: ~/.cache/ms-playwright

# 以macOS为例
ls ~/Library/Caches/ms-playwright
chromium-1064 ffmpeg-1009

运行

在上述初始化项目的过程中,已经生成了一个测试文件 tests/example.spec.js,内容如下:

const { test, expect } = require('@playwright/test');

test('has title', async ({ page }) => {
  await page.goto('https://playwright.dev/');

  // Expect a title "to contain" a substring.
  await expect(page).toHaveTitle(/Playwright/);
});
// ...

还有一个tests-examples文件夹,里面有更多的测试用例,可以参考。

同时,项目路径下还生成了一个 playwright.config.js 配置文件,内容如下:

const { defineConfig, devices } = require('@playwright/test');
module.exports = defineConfig({
  testDir: './tests',
  /* Run tests in files in parallel */
  fullyParallel: true,
  /* Fail the build on CI if you accidentally left test.only in the source code. */
  forbidOnly: !!process.env.CI,
  /* Retry on CI only */
  retries: process.env.CI ? 2 : 0,
  /* Opt out of parallel tests on CI. */
  workers: process.env.CI ? 1 : undefined,
  /* Reporter to use. See https://playwright.dev/docs/test-reporters */
  reporter: 'html',
   projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] },
    },
    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },
  ],
  // ...
});

这里可以配置测试文件的目录、测试报告的格式、测试的浏览器等。

最后,运行测试:

npx playwright test

playwright test 读取playwright.config.js的配置,你也可以在这条命令后添加参数设置,如通过 --project 来指定运行的浏览器,如:

npx playwright test --project chromium

测试完成后,可以查看测试报告,如:

npx playwright show-report

a1e977ba78a433af4ce3a47c692ed043.png

生成测试代码

对于开发者来说,写测试代码不是难事,难的是没时间写。高质量的代码,测试代码的数量往往是比业务代码还多。所以,我们需要一些工具来帮助我们生成测试代码。

可以通过 cli 命令来启动一个浏览器,然后手动操作,最后生成测试代码:

npx playwright codegen

0b6b791fb6bd37f616a237b8ddabb25e.gif

推荐使用 vscode 插件来生成测试代码,后面会介绍。

通过vscode插件

playwright 提供了一个 vscode 插件,可以方便地生成测试代码、运行测试、查看测试报告等。

安装插件

de5e3d65b23ba834fa039abb4b7b5346.png

使用插件

直接点击主侧边栏 “测试”,可以很方便地运行测试:

0abdf8701f361b7634ed6bcc1259f59b.png

点击 playwright 插件的 “录制新用例”,会在tests中自动生成一个新文件, 其他流程同npx playwright codegen操作。

使用ui可视化测试用例

playwright 提供了一个很强大的功能,就是通过使用--ui,启动一个页面,可以很方便地运行测试用例、查看测试结果、逐帧对比测试过程等。这对于设计走查也是非常有用的。

如果你使用过e2e工具 cypress,两者的功能类似,但是playwright的功能更强大。

npx playwright test --ui

53652a194427c530399a9d986996768d.gif

其它用途

  • 截图

注:使用storybook开发组件库时,可以使用playwright官方提供的 storywright 来自动生成 story 截图,方便查看组件的样式。

const { chromium } = require('playwright');
  (async () => {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    await page.goto('https://www.baidu.com');
    await page.screenshot({ path: `baidu.png` });
    await browser.close();
  })();
  • 爬虫

const { chromium } = require('playwright');
  (async () => {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    await page.goto('https://www.baidu.com');
    const title = await page.title();
    console.log(title);
    await browser.close();
  })();
  • 性能测试

const { chromium } = require('playwright');
 (async () => {
   const browser = await chromium.launch();
   const page = await browser.newPage();
   await page.goto('https://www.baidu.com');
   const performanceTiming = JSON.parse(
     await page.evaluate(() => JSON.stringify(window.performance.timing))
   );
   console.log(performanceTiming);
   await browser.close();
 })();

总结

本文是对 playwright 的一个简单的入门介绍,主要介绍了它强大的端对端测试能力。对于端对端测试来说,playwright 为我们写测试用例提供了很多便利,比如自动等待、自动截图、自动重试、自动断言等等,包括很多可视化的工具,比如生成测试代码、生成测试报告、生成测试录像等等。可以说,playwright 能显著提高我们的测试开发效率,让我们更专注于测试用例的编写,是一个非常值得推荐的工具。当然,playwright 的能力远不止于此,需要你自己去官网文档中去探索。

参考链接

  • https://playwright.dev/

  • https://jecyu.github.io/Fe-Auto-Testing/concepts/

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

b8eab23426fc856003b997e84fcee0de.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591872.html

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

相关文章

chatgpt赋能python:Python中输入怎么写?完整教程

Python中输入怎么写?完整教程 如果你正在学习Python编程,那么输入是你必须掌握的重要概念之一。在Python中,输入是指将数据从用户的键盘输入到程序中。这些数据可以是字符串、整数、浮点数或其他任何类型的值。本文将提供有关Python中输入的…

外贸大环境下soho人策略

前阵子也跟一个工厂在聊,现在普遍毛利率只有5%-6%,根本不敢涨价,能不降价就不错了(汇率在涨,所以有的客户还会要求降价)。 卷是一定的。而且,各位如果有了解过拼多多的TEMU业务的,应…

1727_使用虚拟机安装CentOS-7

全部学习汇总:GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 离开Linux很久了,甚至怀念,虚拟机里装个CentOS 7玩玩。使用的是VM虚拟机,下载了CentOS 7的everything安装包。 1&#xf…

chatgpt赋能python:Python中符号怎么输入

Python中符号怎么输入 如果你是一位Python程序员,你肯定会经常使用各种符号,比如冒号、逗号、括号、引号等等。但是有些符号在输入的时候可能会有一些困难,尤其是对于初学者而言。那么在Python中符号怎么输入呢?下面我们来详细介…

4.1 文件操作(File类)

ava中,对文件操作的常用类是java.io.File。这个类提供了许多方法来操作文件和目录。本章节我们将学习关于File类的重要方法以及如何使用它们来操作文件。 4.1.1 创建File对象 创建一个File对象不会在磁盘上创建一个新文件。File对象只是一个在Java代码中表示文件或…

代码覆盖率

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代…

【30天熟悉Go语言】4 Go的变量、常量、运算符

文章目录 一、前言二、变量1、变量的基础使用2、变量的多种使用方式1)全局变量2)局部变量3)丢弃赋值 3、Go和Java的变量对比 三、常量1、Go和Java的常量对比 三、运算符1、算术运算符 、--2、运算符 &、* 四、总结 一、前言 Go系列文章&a…

计算机组成原理 之 第四章 指令系统

1. 指令格式 通常包括操作码字段(OP)和地址码字段(A),有的指令不需要地址码 指令系统(指令集):一台计算机的所有指令的集合,eg:X86、ARM (1&#…

手机安卓Termux搭建Hexo博客网站,发布公网访问

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章:安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…

一键搭建本地Wordpress环境 - MacOS

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

聊聊企业无线网络安全

新钛云服已累计为您分享749篇技术干货 不知不觉无线网络已经成为了办公网主流。最早接触无线网络的时候是2001年,那时候笔记本电脑还比较少见,标配也不支持无线网络,要使用无线网络需要另外加一块PCMIA接口的无线网卡。第一次体验无线网络的时…

【k8s】Jenkins实现springcloud应用CI、CD实践 【三】

一、运行Jenkins流水线流程思路: 场景:java微服务应用, 单体仓库,多个微服务模块,(并行构建、自动化构建、根据模块变更仅更新特定模块) java、nodejsCI阶段 并行方式; 根据模块变…

【AUTOSAR】Com通讯栈配置说明(三)---- CanSM模块

CanNm模块 该项目中的Nm 并非 autosar nm, 不适用ETAS 配置 CanSM CanSMConfiguration CanSMModeRequestRepetitionMax: 模式请求失败后最大的重试次数 CanSMModeRequestRepetitionTime:模式请求重试时间间隔 CanSMManagerNetworks CanSMBorCounterL1…

数据结构与算法-递归

2.3 递归 概述 定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller in…

分享一个下载软件的html

主要是html与js,css实现 页面如下: 点击软件后会滑动到,软件介绍,然后弹出二维码: <!DOCTYPE HTML> <!--HTML for wufuba.comAuthor: www.wufuba.com --> <html lang="zh-cmn-Hans"><head><title>xxx软件</title><m…

Ora提示词版ChatGPT机器人

Ora可以自己创建一个ChatGPT机器人&#xff0c;可以设置自己的提示词例如我创建的AI佛祖https://ora.ai/aesthetic-red-nfa4/ai%E4%BD%9B%E7%A5%96 提示词 创建机器人的时候&#xff0c;需要设定自己的提示词&#xff0c;例如&#xff1a; 假设你是佛祖&#xff0c;名字叫做释迦…

设计模式之~享元模式

定义&#xff1a; 享元模式英文称为“Flyweight Pattern”&#xff0c;又译为羽量级模式或者蝇量级模式。 享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c…

git 分支管理:009

1. 分支的(创建、切换、删除) 注意&#xff1a;进行分支操作之前&#xff0c; 需要将当前分支需要提交的文件全部提交&#xff0c; 否则会将未处理的内容一并带到新分支下&#xff0c;这样容易造成分支内容混乱。 查看分支&#xff1a;git branch 创建分支&#xff1a;git bran…

氟化物超标怎么处理

项目基本信息 工艺及产品信息 甲方 / 采用工艺 过滤系统螯合树脂除氟系统 工程公司 / 工艺原理 废水除氟&#xff0c;耐受氯离子、硫酸根等阴离子的干扰 开始时间 2020/11/12 工艺特点 再生周期长 结束时间 2020/11/30 型号 CH-87 项目周期及项目地 15天 江…

力扣高频SQL50题(基础版)——第一天

力扣高频SQL50题(基础版)——第一天 1 可回收且低脂的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # WHERE子句中使用多条件 SELECT product_id FROM Products WHERE low_fatsY AND recyclableY1.3 运行截图 2 寻找用户推荐人 2.1 题目内容…