跳到主要内容

编写测试

简介

Playwright 测试很简单,它们

  • 执行操作,以及
  • 根据预期 断言状态

在执行操作之前无需等待任何事情:Playwright 会在执行每个操作之前自动等待各种 可操作性检查 通过。

执行检查时也无需处理竞态条件 —— Playwright 断言的设计方式是描述最终需要满足的预期。

就是这样!这些设计选择使 Playwright 用户完全无需担心测试中不稳定的超时和竞态检查。

你将学到

第一个测试

通过以下示例,了解如何编写测试。

UnitTest1.cs
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Playwright;
using Microsoft.Playwright.MSTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PlaywrightTests;

[TestClass]
public class ExampleTest : PageTest
{
[TestMethod]
public async Task HasTitle()
{
await Page.GotoAsync("https://playwright.dev");

// 期望标题 “包含” 一个子字符串。
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}

[TestMethod]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev");

// 点击 “开始” 链接。
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();

// 期望页面有一个名为 “安装” 的标题。
await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();
}
}

操作

导航

大多数测试将从把页面导航到某个 URL 开始。之后,测试就能与页面元素进行交互。

await Page.GotoAsync("https://playwright.dev");

Playwright 将等待页面达到加载状态后再继续执行。详细了解 Page.GotoAsync() 的选项。

交互

执行操作首先要定位元素。Playwright 为此使用 定位器 API。定位器代表了一种随时在页面上查找元素的方式,详细了解可用的 不同类型的定位器。Playwright 将在执行操作前等待元素变为 可操作状态,因此无需等待元素可用。

// 创建一个定位器。
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });

// 点击它。
await getStarted.ClickAsync();

在大多数情况下,代码会写成一行:

await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();

基本操作

以下是最常用的 Playwright 操作列表。请注意,还有更多操作,务必查看 定位器 API 部分以了解更多信息。

操作描述
Locator.CheckAsync()勾选输入复选框
Locator.ClickAsync()点击元素
Locator.UncheckAsync()取消勾选输入复选框
Locator.HoverAsync()将鼠标悬停在元素上
Locator.FillAsync()填充表单字段,输入文本
Locator.FocusAsync()聚焦元素
Locator.PressAsync()按下单个按键
Locator.SetInputFilesAsync()选择要上传的文件
Locator.SelectOptionAsync()在下拉菜单中选择选项

断言

Playwright 提供了一个名为 Expect 的异步函数,用于断言并等待预期条件满足。

await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));

以下是最常用的异步断言列表。请注意,还有 更多断言 可供熟悉:

断言描述
Expect(Locator).ToBeCheckedAsync()复选框已被选中
Expect(Locator).ToBeEnabledAsync()控件已启用
Expect(Locator).ToBeVisibleAsync()元素可见
Expect(Locator).ToContainTextAsync()元素包含文本
Expect(Locator).ToHaveAttributeAsync()元素具有属性
Expect(Locator).ToHaveCountAsync()元素列表具有指定长度
Expect(Locator).ToHaveTextAsync()元素与文本匹配
Expect(Locator).ToHaveValueAsync()输入元素具有值
Expect(Page).ToHaveTitleAsync()页面具有标题
Expect(Page).ToHaveURLAsync()页面具有 URL

测试隔离

Playwright NUnit 和 MSTest 测试框架基类将通过提供单独的 Page 实例,使每个测试相互隔离。由于浏览器上下文(Browser Context)的存在,页面在测试之间是隔离的,这相当于一个全新的浏览器配置文件,每个测试都能获得一个全新的环境,即使多个测试在单个浏览器中运行也是如此。

UnitTest1.cs
using System.Threading.Tasks;
using Microsoft.Playwright.MSTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PlaywrightTests;

[TestClass]
public class ExampleTest : PageTest
{
[TestMethod]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dev");
}
}

使用测试钩子

你可以使用 TestInitialize/TestCleanup 来准备和清理测试环境:

UnitTest1.cs
using System.Threading.Tasks;
using Microsoft.Playwright.MSTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PlaywrightTests;

[TestClass]
public class ExampleTest : PageTest
{
[TestMethod]
public async Task MainNavigation()
{
// 断言使用 expect API。
await Expect(Page).ToHaveURLAsync("https://playwright.dev/");
}

[TestInitialize]
public async Task TestInitialize()
{
await Page.GotoAsync("https://playwright.dev");
}
}

后续步骤