mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
332 lines
9.1 KiB
Markdown
332 lines
9.1 KiB
Markdown
---
|
|
id: writing-tests
|
|
title: "Writing tests"
|
|
---
|
|
|
|
## Introduction
|
|
|
|
Playwright tests are simple, they
|
|
|
|
- **perform actions**, and
|
|
- **assert the state** against expectations.
|
|
|
|
There is no need to wait for anything prior to performing an action: Playwright
|
|
automatically waits for the wide range of [actionability](./actionability.md)
|
|
checks to pass prior to performing each action.
|
|
|
|
There is also no need to deal with the race conditions when performing the checks -
|
|
Playwright assertions are designed in a way that they describe the expectations
|
|
that need to be eventually met.
|
|
|
|
That's it! These design choices allow Playwright users to forget about flaky
|
|
timeouts and racy checks in their tests altogether.
|
|
|
|
**You will learn**
|
|
|
|
- [How to write the first test](/writing-tests.md#first-test)
|
|
- [How to perform actions](/writing-tests.md#actions)
|
|
- [How to use assertions](/writing-tests.md#assertions)
|
|
- [How tests run in isolation](/writing-tests.md#test-isolation)
|
|
- [How to use test hooks](/writing-tests.md#using-test-hooks)
|
|
|
|
## First test
|
|
|
|
Take a look at the following example to see how to write a test.
|
|
|
|
<Tabs
|
|
groupId="test-runners"
|
|
defaultValue="mstest"
|
|
values={[
|
|
{label: 'MSTest', value: 'mstest'},
|
|
{label: 'NUnit', value: 'nunit'},
|
|
]
|
|
}>
|
|
<TabItem value="nunit">
|
|
|
|
```csharp title="UnitTest1.cs"
|
|
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");
|
|
|
|
// 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");
|
|
|
|
// 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();
|
|
}
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="mstest">
|
|
|
|
```csharp title="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");
|
|
|
|
// 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");
|
|
|
|
// 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();
|
|
}
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Actions
|
|
|
|
### Navigation
|
|
|
|
Most of the tests will start by navigating the page to a URL. After that, the test
|
|
will be able to interact with the page elements.
|
|
|
|
```csharp
|
|
await Page.GotoAsync("https://playwright.dev");
|
|
```
|
|
|
|
Playwright will wait for the page to reach the load state prior to moving forward.
|
|
Learn more about the [`method: Page.goto`] options.
|
|
|
|
### Interactions
|
|
|
|
Performing actions starts with locating the elements. Playwright uses [Locators API](./locators.md) for that. Locators represent a way to find element(s) on the page at any moment, learn more about the [different types](./locators.md) of locators available. Playwright will wait for the element to be [actionable](./actionability.md) prior to performing the action, so there is no need to wait for it to become available.
|
|
|
|
|
|
```csharp
|
|
// Create a locator.
|
|
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
|
|
|
|
// Click it.
|
|
await getStarted.ClickAsync();
|
|
```
|
|
|
|
In most cases, it'll be written in one line:
|
|
|
|
```csharp
|
|
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
|
|
```
|
|
|
|
### Basic actions
|
|
|
|
This is the list of the most popular Playwright actions. Note that there are many more, so make sure to check the [Locator API](./api/class-locator.md) section to
|
|
learn more about them.
|
|
|
|
| Action | Description |
|
|
| :- | :- |
|
|
| [`method: Locator.check`] | Check the input checkbox |
|
|
| [`method: Locator.click`] | Click the element |
|
|
| [`method: Locator.uncheck`] | Uncheck the input checkbox |
|
|
| [`method: Locator.hover`] | Hover mouse over the element |
|
|
| [`method: Locator.fill`] | Fill the form field, input text |
|
|
| [`method: Locator.focus`] | Focus the element |
|
|
| [`method: Locator.press`] | Press single key |
|
|
| [`method: Locator.setInputFiles`] | Pick files to upload |
|
|
| [`method: Locator.selectOption`] | Select option in the drop down |
|
|
|
|
## Assertions
|
|
|
|
Playwright provides an async function called [Expect](./test-assertions) to assert and wait until the expected condition is met.
|
|
|
|
```csharp
|
|
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
|
|
```
|
|
|
|
Here is the list of the most popular async assertions. Note that there are [many more](./test-assertions.md) to get familiar with:
|
|
|
|
| Assertion | Description |
|
|
| :- | :- |
|
|
| [`method: LocatorAssertions.toBeChecked`] | Checkbox is checked |
|
|
| [`method: LocatorAssertions.toBeEnabled`] | Control is enabled |
|
|
| [`method: LocatorAssertions.toBeVisible`] | Element is visible |
|
|
| [`method: LocatorAssertions.toContainText`] | Element contains text |
|
|
| [`method: LocatorAssertions.toHaveAttribute`] | Element has attribute |
|
|
| [`method: LocatorAssertions.toHaveCount`] | List of elements has given length |
|
|
| [`method: LocatorAssertions.toHaveText`] | Element matches text |
|
|
| [`method: LocatorAssertions.toHaveValue`] | Input element has value |
|
|
| [`method: PageAssertions.toHaveTitle`] | Page has title |
|
|
| [`method: PageAssertions.toHaveURL`] | Page has URL |
|
|
|
|
|
|
## Test Isolation
|
|
|
|
The Playwright NUnit and MSTest test framework base classes will isolate each test from each other by providing a separate `Page` instance. Pages are isolated between tests due to the Browser Context, which is equivalent to a brand new browser profile, where every test gets a fresh environment, even when multiple tests run in a single Browser.
|
|
|
|
<Tabs
|
|
groupId="test-runners"
|
|
defaultValue="mstest"
|
|
values={[
|
|
{label: 'MSTest', value: 'mstest'},
|
|
{label: 'NUnit', value: 'nunit'},
|
|
]
|
|
}>
|
|
<TabItem value="nunit">
|
|
|
|
```csharp title="UnitTest1.cs"
|
|
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");
|
|
}
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="mstest">
|
|
|
|
```csharp title="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");
|
|
}
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Using Test Hooks
|
|
|
|
You can use `SetUp`/`TearDown` in NUnit or `TestInitialize`/`TestCleanup` in MSTest to prepare and clean up your test environment:
|
|
|
|
<Tabs
|
|
groupId="test-runners"
|
|
defaultValue="mstest"
|
|
values={[
|
|
{label: 'MSTest', value: 'mstest'},
|
|
{label: 'NUnit', value: 'nunit'},
|
|
]
|
|
}>
|
|
<TabItem value="nunit">
|
|
|
|
```csharp title="UnitTest1.cs"
|
|
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/");
|
|
}
|
|
|
|
[SetUp]
|
|
public async Task SetUp()
|
|
{
|
|
await Page.GotoAsync("https://playwright.dev");
|
|
}
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="mstest">
|
|
|
|
```csharp title="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.dev/");
|
|
}
|
|
|
|
[TestInitialize]
|
|
public async Task TestInitialize()
|
|
{
|
|
await Page.GotoAsync("https://playwright.dev");
|
|
}
|
|
}
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## What's Next
|
|
|
|
- [Run single test, multiple tests, headed mode](./running-tests.md)
|
|
- [Generate tests with Codegen](./codegen-intro.md)
|
|
- [See a trace of your tests](./trace-viewer-intro.md)
|
|
- [Run tests on CI](./ci-intro.md)
|
|
- [Learn more about the MSTest and NUnit base classes](./test-runners.md)
|