Библиотеки для организации E2E тестирования на базе Microsoft Playwright с поддержкой паттерна Page Object Model (POM), Dependency Injection и гибкой конфигурации браузеров.
Базовые абстракции для реализации паттерна Page Object Model с использованием паттерна обёртки (Wrapper). Позволяет интегрировать слой POM вашей инфраструктуры с SkbKontur.Playwright.TestCore.
Базовый интерфейс обёртки.
- Предоставляет доступ к обёрнутому объекту через свойство
WrappedItem
Интерфейс для PageElements - обёрток локаторов Playwright.
- Наследуется от
IWrapper<TLocator>, гдеTLocator- тип локатора Playwright - Используется для создания типизированных элементов управления
Интерфейс для PageObjects - обёрток страниц Playwright.
- Наследуется от
IWrapper<TPage>, гдеTPage- тип страницы Playwright - Предоставляет свойство
Urlдля получения URL страницы
Интерфейс для создания страниц (PageObjects).
- Методы:
Create<TPage>(TWrappedItem page)- создание из готового объектаCreate<TPage>(Func<TWrappedItem> getPage)- создание с lazy-получением
Интерфейс для создания контролов (PageElements).
- Методы:
Create<TControl>(TWrappedItem locator)- создание из локатораCreate<TControl>(Func<TWrappedItem> getLocator)- создание с lazy-получением локатораCreate<TControl>(ILocatorWrapper<TWrappedItem> locatorWrapper, string dataTestId)- создание с data-test-id через обёрткуCreate<TControl>(TWrappedItem locator, string dataTestId)- создание с data-test-id
Инфраструктура для запуска E2E тестов на базе Playwright с поддержкой Dependency Injection и паттерна Page Object Model.
- Построена на принципах Dependency Injection
- Использует паттерн Factory для создания компонентов
- Поддерживает различные стратегии аутентификации
- Обеспечивает thread-safety и lazy loading для тяжёлых объектов
- Интегрируется с различными тестовыми фреймворками (NUnit, xUnit, MSTest)
Создание и управление экземпляром Playwright.
- Кэширует экземпляр Playwright
- Применяет конфигурацию через generic параметр
TConfiguration - Использует lazy loading для инициализации
Абстрактная фабрика для создания браузерных контекстов.
- Поддерживает различные браузеры (Chrome, Firefox)
- Интегрируется со стратегиями аутентификации
- Управляет жизненным циклом контекстов браузера
Конкретные реализации для запуска браузеров.
- Используют
IBrowserConfiguratorдля настроек запуска - Создают новые контексты для каждого теста
Создание персистентных контекстов браузеров.
- Используют отдельные директории пользователя
- Сохраняют состояние между запусками тестов
- Полезны для работы с расширениями браузера
Основная фабрика для создания Page Objects и элементов управления.
- Реализует интерфейсы:
IPageFactory,IControlFactory,IPageObjectsFactory - Создаёт page objects и элементы управления с автоматическим внедрением зависимостей
- Поддерживает создание коллекций элементов через
ElementsCollection<TItem>
Определяет интерфейс стратегии аутентификации.
- Предоставляет методы для получения аутентификатора
Определяет интерфейс аутентификатора.
- Метод
CreateStorageStateAsync()- создание состояния аутентификации (cookies, localStorage) - Используется для кэширования состояния между тестами
Стратегия с кэшированием состояния аутентификации.
- Кэширует состояние аутентификации между тестами
- Использует двойную проверку блокировки для thread-safety
- Значительно ускоряет выполнение тестов
Пустые реализации для сценариев без аутентификации.
- Используются по умолчанию
- Не выполняют никаких действий по аутентификации
Настройка глобальных параметров Playwright.
- Устанавливает атрибут для поиска элементов (по умолчанию
data-tid) - Настраивает таймауты и другие глобальные параметры
- Применяется при инициализации Playwright
Настройка параметров запуска браузеров.
- Метод
GetLaunchOptions()- опции запуска браузера - Метод
GetLaunchPersistentContextOptions()- опции персистентного контекста HeadlessConfiguratorавтоматически определяет headless режим в CI среде
Обновление настроек контекста браузера.
- Метод
ExecuteAsync(BrowserNewContextOptions options)- модификация опций контекста ViewportSizeUpdater- устанавливает размер viewport браузера- Применяется перед созданием контекста
Конфигурация трассировки Playwright.
- Метод
GetTracingStartOptions()- опции запуска трассировки - Метод
GetTracingStopOptions()- опции остановки и сохранения трассировки - Сохраняет трассировку в ZIP файлы с названиями тестов
FixtureTracingConfigurator- сохраняет трассировку для всего класса тестов
Предоставление метаданных о текущем тесте.
- ID теста
- Имя теста
- Класс теста
- Рабочая директория для артефактов
- Используется для именования файлов трассировки
Создание и управление контекстами браузеров.
- Создают новый контекст браузера для каждого теста
- Интегрируют трассировку автоматически
- Применяют
IContextOptionsUpdaterперед созданием контекста
Управление трассировкой на уровне контекста браузера.
- Стартуют запись трассировки при создании контекста
- Останавливают и сохраняют трассировку после теста
- Интегрируются с
ITracingConfigurator
Доступ к localStorage браузера.
- Методы:
Get,Set,Remove,Clear - Полная реализация API localStorage
- Работает через JavaScript-инъекции в контекст страницы
Получение активной страницы браузера.
- Возвращает текущую активную страницу
- Создаёт новую страницу при необходимости
- Интегрируется с контекстом браузера
Интерфейс для объектов, требующих асинхронной загрузки.
- Метод
WaitLoadAsync()- ожидание загрузки объекта - Используется в page objects для ожидания загрузки страницы
Представление коллекции элементов на странице.
- Параметры конструктора:
ILocator locator,IControlFactory controlFactory - Поддерживает итерацию через
IEnumerable<TItem> - Методы:
GetEnumerator()- получение енумератора для итерацииExpect()- получениеILocatorAssertionsдля проверок Playwright
Расширения для работы с коллекциями элементов.
- Методы для проверки текста элементов с учётом порядка
- Упрощённые методы фильтрации и доступа
Создание зависимостей для конструкторов page objects.
- Метод
CreateDependency(Type controlType)- создание массива зависимостей - Использует
IServiceProviderдля разрешения зависимостей - Работает с рефлексией для анализа конструкторов
Фильтрация параметров конструкторов.
- Определяет, какие параметры должны разрешаться через DI
- Исключает базовые типы Playwright (
IPage,ILocator) из DI - Позволяет настраивать правила разрешения зависимостей
Расширения для IServiceCollection для регистрации компонентов в DI.
AddPlaywrightTestCore<TTestInfoGetter>()- регистрация базовых компонентовUsePom()- регистрация инфраструктуры Page Object ModelUseTestInfoProvider<T>()- регистрация провайдера информации о тестахUseBrowser<TFactory, TConfigurator, TUpdater>()- настройка браузераUseAuthenticator<TAuthenticator, TStrategy>()- настройка аутентификацииReplaceTracing<TTracing, TConfigurator>()- замена реализации трассировки
Установка браузеров Playwright.
Данная библиотека использует Dependency Injection (DI) для управления жизненным циклом браузера, страниц и аутентификации.
В методе инициализации вашего тестового проекта (например, в GlobalSetup или базовом классе тестов) создайте ServiceCollection и вызовите метод AddPlaywrightTestCore.
var services = new ServiceCollection();
services.AddPlaywrightTestCore() // Регистрация базовой инфраструктуры
.UsePom(); // Регистрация инфраструктуры Page Object ModelПо умолчанию библиотека использует EmptyTestInfoProvider. Чтобы трассировки и отчеты содержали корректные имена тестов, необходимо подключить реализацию, специфичную для вашего фреймворка (NUnit, xUnit или MSTest), либо использовать дефолтный провайдер.
// Пример подключения своего провайдера метаданных тестов
services.UseTestInfoProvider<DefaultTestInfoProvider>();Если ваши тесты требуют авторизации, замените стандартный «пустой» аутентификатор на ваш рабочий:
services.UseAuthenticator<MyProjectAuthenticator, AuthWithCacheStrategy>();Для запуска тестов в конкретном режиме (например, в Headful для локальной отладки) используйте метод UseBrowser:
services.UseBrowser<ChromeFactory, HeadfulConfigurator, ViewportSizeUpdater>();Вы можете переопределить логику сохранения трассировок (скриншотов, видео, логов Playwright):
services.ReplaceTracing<CustomContextTracing, DefaultTracingConfigurator>();Использование Fluent API позволяет настроить весь стек одной цепочкой:
var serviceProvider = new ServiceCollection()
.AddPlaywrightTestCore<DefaultPlaywrightConfiguration>() // Настройка базовых параметров
.UseTestInfoProvider<NUnitTestInfoProvider>() // Интеграция с NUnit
.UseBrowser<ChromeFactory, HeadlessConfigurator, ViewportSizeUpdater>() // Chrome headless
.UseAuthenticator<IdentityServerAuthenticator, AuthWithCacheStrategy>() // Авторизация с кэшем
.UsePom() // Page Object Model
.BuildServiceProvider();Расширение для регистрации всех компонентов TestCore в DI контейнере с поддержкой NUnit:
public static IServiceCollection UsePlaywright(this IServiceCollection services)
{
return services
.AddPlaywrightTestCore<DefaultPlaywrightConfiguration>()
.UseTestInfoProvider<NUnitTestInfoProvider>()
.UseBrowser<ChromeFactory, HeadlessConfigurator, ViewportSizeUpdater>()
.UsePom();
}Адаптер для получения метаданных тестов из NUnit TestContext:
public class NUnitTestInfoProvider : ITestInfoGetter
{
public string GetTestId() => TestContext.CurrentContext.Test.ID;
public string GetTestName() => TestContext.CurrentContext.Test.Name;
public string GetTestClassName() => TestContext.CurrentContext.Test.ClassName;
public string GetWorkDirectory() => TestContext.CurrentContext.WorkDirectory;
}Стандартный базовый класс демонстрирующий использование инфраструктуры:
public class BaseTest
{
protected IServiceProvider ServiceProvider { get; private set; }
protected IPageFactory PageFactory { get; private set; }
[OneTimeSetUp]
public void OneTimeSetUp()
{
ServiceProvider = new ServiceCollection()
.UsePlaywright()
.BuildServiceProvider();
PageFactory = ServiceProvider.GetRequiredService<IPageFactory>();
}
[Test]
public async Task ExampleTest()
{
var page = PageFactory.Create<MainPage>();
await page.NavigateAsync();
await page.SearchBox.FillAsync("Playwright");
// ...
}
}- Dependency Injection в основе - все компоненты разрешаются через DI контейнер
- Lazy loading - тяжёлые объекты (Playwright, браузеры) создаются по требованию
- Thread safety - стратегии аутентификации защищены от конкурентного доступа
- Расширяемость - интерфейсы позволяют легко заменять реализации
- Гибкая конфигурация - Fluent API для настройки всех компонентов
- Интеграция с Playwright - полная поддержка всех возможностей Playwright
- POM паттерн - поддержка создания типизированных page objects и page elements
- Tracing и отладка - встроенная поддержка трассировки для debugging
- CI/CD готовность - автоматическое определение headless режима в CI окружении
- Фреймворк-агностичность - поддержка разных фреймворков тестирования (NUnit, xUnit, MSTest)
Эта инфраструктура предоставляет полноценное решение для E2E тестирования веб-приложений с Microsoft Playwright, следуя современным принципам архитектуры и обеспечивая высокую поддерживаемость и расширяемость кода тестов.