跳转到主要内容

编写测试

简介

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.net.cn");

// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}

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

// Click the get started link.
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();

// Expects page to have a heading with the name of Installation.
await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Installation" })).ToBeVisibleAsync();
}
}

操作

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

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

Playwright 将等待页面达到加载状态,然后才继续。了解更多关于 Page.GotoAsync() 选项的信息。

交互

执行操作从定位元素开始。Playwright 使用 Locators API 来完成此操作。Locators 代表了一种随时在页面上查找元素的方式,了解更多关于可用的不同类型的 locators。Playwright 将等待元素可操作后才执行操作,因此无需等待它可用。

// Create a locator.
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });

// Click it.
await getStarted.ClickAsync();

在大多数情况下,它会写在一行中

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

基本操作

这是最受欢迎的 Playwright 操作列表。请注意,还有更多操作,因此请务必查看 Locator 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、xUnit 和 xUnit v3 测试框架基类将通过提供单独的 Page 实例来隔离每个测试。由于浏览器上下文,页面在测试之间是隔离的,这相当于一个全新的浏览器配置文件,即使多个测试在单个浏览器中运行,每个测试也能获得一个全新的环境。

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.net.cn");
}
}

使用测试钩子

您可以使用 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()
{
// Assertions use the expect API.
await Expect(Page).ToHaveURLAsync("https://playwright.net.cn/");
}

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

接下来