編寫測試
簡介
Playwright 測試很簡單,它們
- 執行動作,以及
- 斷言符合預期的狀態。
在執行動作之前,無需等待任何事情:Playwright 會自動等待各種可操作性檢查通過,然後才執行每個動作。
在執行檢查時,也無需處理競爭條件 - Playwright 斷言的設計方式是描述最終需要滿足的預期。
就這樣!這些設計選擇讓 Playwright 使用者可以完全忘記測試中不穩定的超時和競爭條件檢查。
您將學習
第一個測試
請看以下範例,了解如何編寫測試。
- MSTest
- NUnit
- xUnit
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.dev.org.tw");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Test]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
// 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.dev.org.tw");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[TestMethod]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
// 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.dev.org.tw");
// Expect a title "to contain" a substring.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Fact]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
// 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.dev.org.tw");
Playwright 將等待頁面達到載入狀態,然後才繼續前進。了解更多關於 Page.GotoAsync() 選項的資訊。
互動
執行動作從定位元素開始。Playwright 使用定位器 API 來實現這一點。定位器代表一種在任何時刻在頁面上尋找元素的方式,了解更多關於可用的不同類型定位器的資訊。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 動作列表。請注意,還有更多動作,因此請務必查看定位器 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"));
這是最受歡迎的異步斷言列表。請注意,還有更多斷言供您熟悉
測試隔離
Playwright NUnit 和 MSTest 測試框架基底類別將透過提供單獨的 Page
實例來隔離每個測試。由於瀏覽器上下文,頁面在測試之間是隔離的,瀏覽器上下文相當於全新的瀏覽器設定檔,即使多個測試在單個瀏覽器中執行,每個測試也會獲得全新的環境。
- MSTest
- NUnit
- xUnit
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.dev.org.tw");
}
}
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.org.tw");
}
}
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
}
}
使用測試鉤子
- MSTest
- NUnit
- xUnit
您可以使用 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.dev.org.tw/");
}
[SetUp]
public async Task SetUp()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
}
}
您可以使用 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.dev.org.tw/");
}
[TestInitialize]
public async Task TestInitialize()
{
await Page.GotoAsync("https://playwright.dev.org.tw");
}
}
您可以使用 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.dev.org.tw/");
}
override public async Task InitializeAsync()
{
await base.InitializeAsync();
await Page.GotoAsync("https://playwright.dev.org.tw");
}
public override async Task DisposeAsync()
{
Console.WriteLine("After each test cleanup");
await base.DisposeAsync();
}
}