Написание тестов
Введение
Тесты 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.dev");
// Ожидаем, что заголовок "содержит" подстроку.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Test]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev");
// Клик по ссылке "Get started".
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
// Ожидаем, что на странице будет заголовок с именем 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");
// Ожидаем, что заголовок "содержит" подстроку.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[TestMethod]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev");
// Клик по ссылке "Get started".
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
// Ожидаем, что на странице будет заголовок с именем 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");
// Ожидаем, что заголовок "содержит" подстроку.
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
}
[Fact]
public async Task GetStartedLink()
{
await Page.GotoAsync("https://playwright.dev");
// Клик по ссылке "Get started".
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
// Ожидаем, что на странице будет заголовок с именем 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.dev");
// 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");
// 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");
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, xUnit и xUnit v3 изолируют тесты друг от друга, предоставляя отдельный экземпляр Page для каждого теста. Изоляция страниц между тестами обеспечивается Browser Context’ом — это эквивалент полностью нового профиля браузера: каждый тест получает «свежее» окружение, даже если несколько тестов выполняются в одном и том же Browser.
- 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.dev");
}
}
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");
}
}
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dev");
}
}
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit.v3;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task BasicTest()
{
await Page.GotoAsync("https://playwright.dev");
}
}
Использование хуков тестов
- 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()
{
// Утверждения используют API expect.
await Expect(Page).ToHaveURLAsync("https://playwright.dev/");
}
[SetUp]
public async Task SetUp()
{
await Page.GotoAsync("https://playwright.dev");
}
}
Вы можете использовать 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()
{
// Утверждения используют API expect.
await Expect(Page).ToHaveURLAsync("https://playwright.dev/");
}
[TestInitialize]
public async Task TestInitialize()
{
await Page.GotoAsync("https://playwright.dev");
}
}
Вы можете использовать InitializeAsync/DisposeAsync для подготовки и очистки вашей тестовой среды:
using Microsoft.Playwright;
using Microsoft.Playwright.Xunit;
namespace PlaywrightTests;
public class UnitTest1: PageTest
{
[Fact]
public async Task MainNavigation()
{
// Утверждения используют API expect.
await Expect(Page).ToHaveURLAsync("https://playwright.dev/");
}
override public async Task InitializeAsync()
{
await base.InitializeAsync();
await Page.GotoAsync("https://playwright.dev");
}
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.dev/");
}
override public async Task InitializeAsync()
{
await base.InitializeAsync();
await Page.GotoAsync("https://playwright.dev");
}
public override async Task DisposeAsync()
{
Console.WriteLine("After each test cleanup");
await base.DisposeAsync();
}
}