Написание тестов
Введение
Тесты 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");
// Ожидаем, что заголовок "содержит" подстроку.
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();
}
}
Действия
Навигация
Большинство тестов начнется с перехода страницы на 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 изолируют каждый тест друг от друга, предоставляя отдельный экземпляр 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");
}
}
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");
}
}
Использование хуков тестов
- 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()
{
// Утверждения используют 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();
}
}