テストの記述
はじめに
Playwright のテストはシンプルで、以下のことを行います。
- アクションを実行し、
- 期待される状態に対してアサートします。
アクションを実行する前に何かを待つ必要はありません。Playwright は、各アクションを実行する前に、広範囲のアクション可能性チェックが合格するまで自動的に待機します。
チェックを実行する際に競合状態に対処する必要もありません。Playwright のアサーションは、最終的に満たされる必要のある期待値を記述するように設計されています。
それだけです!これらの設計上の選択により、Playwright ユーザーはテストにおける不安定なタイムアウトや競合状態のチェックを完全に忘れることができます。
学習内容
最初のテスト
テストの作成方法については、以下の例をご覧ください。
- MSTest
- NUnit
- xUnit
- xUnit v3
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Playwright;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;
namespace PlaywrightTests;
[Parallelizable(ParallelScope.Self)]
[TestFixture]
public class ExampleTest : PageTest
{
[Test]
public async Task HasTitle()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Test]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// 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();
}
}
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.dokyumento.jp");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[TestMethod]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// 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();
}
}
using System.Text.RegularExpressions;
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task HasTitle()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Fact]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// 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();
}
}
using System.Text.RegularExpressions;
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit.v3;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task HasTitle()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Fact]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
// 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.dokyumento.jp");
Playwright は、ページが読み込み状態に達するまで待機してから先に進みます。Page.GotoAsync() オプションの詳細については、こちらをご覧ください。
インタラクション
アクションの実行は、要素の特定から始まります。Playwright はそのためにロケーター API を使用します。ロケーターは、いつでもページ上の要素を見つける方法を表します。利用可能なさまざまな種類のロケーターの詳細については、こちらをご覧ください。Playwright は、アクションを実行する前に要素がアクション可能になるまで待機するため、利用可能になるのを待つ必要はありません。
// Create a locator.
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
// Click it.
await getStarted.ClickAsync();
ほとんどの場合、1行で記述されます。
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、xUnit、および xUnit v3 テストフレームワークの基本クラスは、個別の Page インスタンスを提供することで、各テストを互いに分離します。ページは、新しいブラウザプロファイルに相当するブラウザコンテキストによってテスト間で分離されます。これにより、複数のテストが単一のブラウザで実行される場合でも、すべてのテストが新しい環境を取得します。
- MSTest
- NUnit
- xUnit
- xUnit v3
using System.Threading.Tasks;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;
namespace PlaywrightTests;
[Parallelizable(ParallelScope.Self)]
[TestFixture]
public class ExampleTest : PageTest
{
[Test]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
}
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.dokyumento.jp");
}
}
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
}
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit.v3;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
}
テストフックの使用
- MSTest
- NUnit
- xUnit
- xUnit v3
SetUp/TearDown を使用してテスト環境を準備およびクリーンアップできます。
using System.Threading.Tasks;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;
namespace PlaywrightTests;
[Parallelizable(ParallelScope.Self)]
[TestFixture]
public class ExampleTest : PageTest
{
[Test]
public async Task MainNavigation()
{
// Assertions use the expect API.
await Expect(Page).ToHaveURLAsync("https://playwright.dokyumento.jp/");
}
[SetUp]
public async Task SetUp()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
}
TestInitialize/TestCleanup を使用してテスト環境を準備およびクリーンアップできます。
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.dokyumento.jp/");
}
[TestInitialize]
public async Task TestInitialize()
{
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
}
InitializeAsync/DisposeAsync を使用してテスト環境を準備およびクリーンアップできます。
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task MainNavigation()
{
// Assertions use the expect API.
await Expect(Page).ToHaveURLAsync("https://playwright.dokyumento.jp/");
}
override public async Task InitializeAsync()
{
await base.InitializeAsync();
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
public override async Task DisposeAsync()
{
Console.WriteLine("After each test cleanup");
await base.DisposeAsync();
}
}
InitializeAsync/DisposeAsync を使用してテスト環境を準備およびクリーンアップできます。
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit.v3;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task MainNavigation()
{
// Assertions use the expect API.
await Expect(Page).ToHaveURLAsync("https://playwright.dokyumento.jp/");
}
override public async Task InitializeAsync()
{
await base.InitializeAsync();
await Page.GotoAsync("https://playwright.dokyumento.jp");
}
public override async Task DisposeAsync()
{
Console.WriteLine("After each test cleanup");
await base.DisposeAsync();
}
}