跳到主要内容

测试生成器

简介

Playwright 具备在你于浏览器中执行操作时为你生成测试的能力,是快速开始测试的绝佳方式。Playwright 将查看你的页面并找出最佳定位器,优先考虑 role、text 和 test id 定位器。如果生成器找到多个与定位器匹配的元素,它将改进定位器,使其具有唯一标识目标元素的弹性。

在 VS Code 中生成测试

安装 VS Code 扩展程序,并直接从 VS Code 生成测试。该扩展程序在 VS Code Marketplace 上提供。请查看我们的 VS Code 入门指南

录制新测试

要录制测试,请单击测试侧边栏中的“录制新”按钮。这将创建一个 test-1.spec.ts 文件,并打开一个浏览器窗口。

record new in vs code

在浏览器中,转到你要测试的 URL,然后开始点击以录制你的用户操作。

generating user actions

Playwright 将记录你的操作,并在 VS Code 中直接生成测试代码。你还可以通过选择工具栏中的图标之一,然后单击页面上的元素进行断言来生成断言。可以生成以下断言

  • '断言可见性' 以断言元素是否可见
  • '断言文本' 以断言元素是否包含特定文本
  • '断言值' 以断言元素是否具有特定值

generating assertions

录制完成后,单击“取消”按钮或关闭浏览器窗口。然后,你可以检查你的 test-1.spec.ts 文件,并在需要时手动改进它。

code from a generated test

在光标处录制

要从测试中的特定点开始录制,请将光标移动到要录制更多操作的位置,然后单击测试侧边栏中的“在光标处录制”按钮。如果你的浏览器窗口尚未打开,请首先选中“显示浏览器”运行测试,然后单击“在光标处录制”按钮。

record at cursor in vs code

在浏览器窗口中,开始执行你要录制的操作。

add feed the dog to todo app

在 VS Code 的测试文件中,你将看到新生成的动作已添加到测试中光标所在的位置。

code from a generated test

生成定位器

你可以使用测试生成器生成定位器。

  • 单击测试侧边栏中的“选取定位器”按钮,然后将鼠标悬停在浏览器窗口中的元素上,以查看突出显示在每个元素下方的定位器。
  • 单击你需要的元素,它现在将显示在 VS Code 中的“选取定位器”框中。
  • 在键盘上按 Enter 键将定位器复制到剪贴板,然后粘贴到代码中的任何位置。或者,如果你想取消,请按 'escape' 键。
Pick locators in VS code

使用 Playwright Inspector 生成测试

运行 codegen 命令时,将打开两个窗口,一个是浏览器窗口,你可以在其中与要测试的网站进行交互,另一个是 Playwright Inspector 窗口,你可以在其中录制测试,然后将其复制到编辑器中。

运行 Codegen

使用 codegen 命令运行测试生成器,后跟你要为其生成测试的网站的 URL。URL 是可选的,你可以始终在没有 URL 的情况下运行命令,然后直接在浏览器窗口中添加 URL。

npx playwright codegen demo.playwright.dev/todomvc

录制测试

运行 codegen 命令并在浏览器窗口中执行操作。Playwright 将生成用户交互的代码,你可以在 Playwright Inspector 窗口中看到这些代码。完成测试录制后,停止录制并按“复制”按钮将生成的测试复制到编辑器中。

使用测试生成器,你可以录制

  • 诸如单击或填充之类的操作,只需与页面交互即可
  • 断言,方法是单击工具栏中的图标之一,然后单击页面上的元素以进行断言。你可以选择
    • '断言可见性' 以断言元素是否可见
    • '断言文本' 以断言元素是否包含特定文本
    • '断言值' 以断言元素是否具有特定值

Recording a test

完成与页面的交互后,按“录制”按钮停止录制,然后使用“复制”按钮将生成的代码复制到编辑器。

使用“清除”按钮清除代码以重新开始录制。完成后,关闭 Playwright inspector 窗口或停止终端命令。

生成定位器

你可以使用测试生成器生成 定位器

  • 按“录制”按钮停止录制,然后将出现“选取定位器”按钮。
  • 单击“选取定位器”按钮,然后将鼠标悬停在浏览器窗口中的元素上,以查看突出显示在每个元素下方的定位器。
  • 要选择定位器,请单击你要定位的元素,该定位器的代码将出现在“选取定位器”按钮旁边的字段中。
  • 然后,你可以在此字段中编辑定位器以对其进行微调,或使用“复制”按钮复制它并将其粘贴到你的代码中。

picking a locator

模拟

你可以使用测试生成器通过模拟生成测试,以便为特定的视口、设备、配色方案生成测试,以及模拟地理位置、语言或时区。测试生成器还可以在保留身份验证状态的同时生成测试。

模拟视口大小

Playwright 打开一个浏览器窗口,其视口设置为特定的宽度和高度,并且不响应,因为测试需要在相同的条件下运行。使用 --viewport 选项生成具有不同视口大小的测试。

npx playwright codegen --viewport-size="800,600" playwright.dev
Codegen generating code for tests for playwright.dev website with a specific viewport js

模拟设备

使用 --device 选项录制脚本和测试,同时模拟移动设备,该选项设置视口大小和用户代理等。

npx playwright codegen --device="iPhone 13" playwright.dev
Codegen generating code for tests for playwright.dev website emulated for iPhone 13 js

模拟配色方案

使用 --color-scheme 选项录制脚本和测试,同时模拟配色方案。

npx playwright codegen --color-scheme=dark playwright.dev
Codegen generating code for tests for playwright.dev website in dark mode js

模拟地理位置、语言和时区

使用 --timezone--geolocation--lang 选项录制脚本和测试,同时模拟时区、语言和位置。页面打开后

  1. 接受 Cookie
  2. 在右上角,单击“定位我”按钮以查看地理位置的实际效果。
npx playwright codegen --timezone="Europe/Rome" --geolocation="41.890221,12.492348" --lang="it-IT" bing.com/maps
Codegen generating code for tests for bing maps showing timezone, geolocation as Rome, Italy and in Italian language

保留身份验证状态

运行带有 --save-storagecodegen 以在会话结束时保存 cookieslocalStorage。这对于单独录制身份验证步骤并在以后录制更多测试时重用它很有用。

npx playwright codegen github.com/microsoft/playwright --save-storage=auth.json
github page before logging in js

登录

执行身份验证并关闭浏览器后,auth.json 将包含存储状态,然后你可以在测试中重用该状态。

login to GitHub screen

确保你仅在本地使用 auth.json,因为它包含敏感信息。在你完成生成测试后,将其添加到你的 .gitignore 或删除它。

加载身份验证状态

使用 --load-storage 运行以使用先前从 auth.json 加载的存储。这样,所有 cookieslocalStorage 都将恢复,使大多数 Web 应用程序无需再次登录即可进入身份验证状态。这意味着你可以从登录状态继续生成测试。

npx playwright codegen --load-storage=auth.json github.com/microsoft/playwright
github signed in showing use of load storage js

使用自定义设置录制

如果你想在某些非标准设置中使用 codegen(例如,使用 browserContext.route()),可以调用 page.pause(),这将打开一个带有 codegen 控件的单独窗口。

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

(async () => {
// Make sure to run headed.
const browser = await chromium.launch({ headless: false });

// Setup context however you like.
const context = await browser.newContext({ /* pass any options */ });
await context.route('**/*', route => route.continue());

// Pause the page, and start recording manually.
const page = await context.newPage();
await page.pause();
})();