Библиотеки для организации 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
- Трёхуровневая модель: Playwright → Browser → BrowserContext → Page
- Поддерживает различные стратегии аутентификации
- Обеспечивает thread-safety и lazy loading для тяжёлых объектов
- Расширяемая система трассировки и действий при закрытии страниц
Создание и управление экземпляром Playwright.
- Кэширует экземпляр Playwright
- Применяет конфигурацию через generic параметр
TConfiguration - Использует lazy loading для инициализации
- Реализует
IDisposableиIAsyncDisposable
Получение и управление экземпляром браузера.
SingletonBrowserProvider— один экземпляр браузера на весь процесс (статическое поле)TransientBrowserProvider— экземпляр браузера привязан к конкретному провайдеру- Потокобезопасная инициализация через
SemaphoreSlim
Управление жизненным циклом контекста браузера.
- Создаёт контекст через
IBrowserContextFactory - Автоматически запускает и останавливает трассировку
- Управляет очисткой ресурсов при
Dispose
Фабрики для создания экземпляров браузеров.
- Возвращают
IBrowser(не контекст) - Используют
IBrowserConfiguratorдля настроек запуска - Поддерживают Chrome (Chromium), Firefox и WebKit
Фабрика для создания контекстов браузера.
- Получает
IBrowserчерезIBrowserGetter - Применяет стратегию аутентификации
- Обновляет параметры контекста через
IContextOptionsUpdater
Создание персистентных контекстов браузеров.
- Используют отдельные директории пользователя
- Реализуют
IBrowserContextFactory - Полезны для работы с расширениями браузера
Основная фабрика для создания Page Objects и элементов управления.
- Реализует интерфейсы:
IPageFactory,IControlFactory,IPageObjectsFactory - Создаёт page objects и элементы управления с автоматическим внедрением зависимостей
- Поддерживает создание коллекций элементов через
ElementsCollection<TItem>
Определяет интерфейс стратегии аутентификации.
- Предоставляет методы для получения аутентификатора
Определяет интерфейс аутентификатора.
- Метод
CreateStorageStateAsync()- создание состояния аутентификации (cookies, localStorage) - Используется для кэширования состояния между тестами
Стратегия с кэшированием состояния аутентификации.
- Кэширует состояние аутентификации между тестами
- Использует двойную проверку блокировки для thread-safety
- Реализует
IDisposableиIAsyncDisposable
Пустые реализации для сценариев без аутентификации.
- Используются по умолчанию
- Не выполняют никаких действий по аутентификации
Настройка глобальных параметров Playwright.
DefaultPlaywrightConfiguration— пустая конфигурация без параметровDataTidConfiguration— устанавливает атрибутdata-tidдля поиска элементов- Применяется при инициализации Playwright
Настройка параметров запуска браузеров.
- Метод
GetLaunchOptions()- опции запуска браузера - Метод
GetLaunchPersistentContextOptions()- опции персистентного контекста HeadlessConfiguratorавтоматически определяет headless режим в CI среде
Обновление настроек контекста браузера.
- Метод
ExecuteAsync(BrowserNewContextOptions options)- модификация опций контекста ViewportSizeUpdater- устанавливает размер viewport браузера- Применяется перед созданием контекста
Конфигурация трассировки Playwright.
- Метод
GetTracingStartOptions()- опции запуска трассировки - Метод
GetTracingStopOptions()- опции остановки и сохранения трассировки DefaultTracingConfiguratorсодержит свойстваTestName,TestClassName,WorkDirectoryс значениями по умолчанию- Сохраняет трассировку в ZIP файлы с названиями тестов
Управление трассировкой на уровне контекста браузера.
FullTracing— записывает и сохраняет трассировку всегдаFailureTestsTracing— сохраняет трассировку только при падении теста (используетIFailureTestResult)- Стартуют запись трассировки при создании контекста
- Останавливают и сохраняют трассировку после теста
Интерфейс для определения результата выполнения теста.
- Используется
FailureTestsTracingдля условной записи трассировок - Реализация зависит от тестового фреймворка (NUnit, xUnit, MSTest)
Доступ к localStorage браузера.
- Методы:
Get,Set,Remove,Clear - Полная реализация API localStorage
- Работает через JavaScript-инъекции в контекст страницы
Получение активной страницы браузера.
- Возвращает текущую активную страницу
- Создаёт новую страницу при необходимости
- Выполняет
IBeforeDisposePageActionsперед закрытием страницы
Расширение поведения при закрытии страницы.
- Позволяет выполнить действия перед закрытием (например, сохранить скриншот)
NoActions— реализация по умолчанию (ничего не делает)- Регистрируется через DI, поддерживает множественные регистрации
Интерфейс для объектов, требующих асинхронной загрузки.
- Метод
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()— регистрация с конфигурацией по умолчанию (DefaultPlaywrightConfiguration,SingletonBrowserProvider)AddPlaywrightTestCore<TConfig, TBrowserProvider>()— регистрация с указанной конфигурацией и провайдером браузераUsePom()— регистрация инфраструктуры Page Object ModelUseBrowser<TFactory, TConfigurator, TUpdater>()— настройка фабрики браузераUseAuthenticator<TAuthenticator, TStrategy>()— настройка аутентификацииReplaceTracing<TTracing, TConfigurator, TFailureProvider>()— замена реализации трассировки
Установка браузеров Playwright.
Данная библиотека использует Dependency Injection (DI) для управления жизненным циклом браузера, страниц и аутентификации.
В методе инициализации вашего тестового проекта (например, в GlobalSetup или базовом классе тестов) создайте ServiceCollection и вызовите метод AddPlaywrightTestCore.
var services = new ServiceCollection();
services.AddPlaywrightTestCore() // Регистрация базовой инфраструктуры
.UsePom(); // Регистрация инфраструктуры Page Object ModelПо умолчанию используется DefaultPlaywrightConfiguration (пустая конфигурация) и SingletonBrowserProvider (один браузер на процесс).
Для установки атрибута data-tid для поиска элементов:
services.AddPlaywrightTestCore<DataTidConfiguration, SingletonBrowserProvider>();SingletonBrowserProvider— один экземпляр браузера на весь процесс (по умолчанию, быстрее)TransientBrowserProvider— экземпляр браузера на каждый провайдер
services.AddPlaywrightTestCore<DataTidConfiguration, TransientBrowserProvider>();Если ваши тесты требуют авторизации, замените стандартный «пустой» аутентификатор на ваш рабочий:
services.UseAuthenticator<MyProjectAuthenticator, AuthWithCacheStrategy>();Для запуска тестов в конкретном режиме (например, в Headful для локальной отладки) используйте метод UseBrowser:
services.UseBrowser<ChromeFactory, HeadfulConfigurator, ViewportSizeUpdater>();Поддерживаемые фабрики: ChromeFactory, FirefoxFactory, WebkitFactory.
Вы можете переопределить логику сохранения трассировок:
// Запись трассировки только при падении теста
services.ReplaceTracing<FailureTestsTracing, MyTracingConfigurator, MyFailureTestResult>();Для сохранения скриншотов или сбора данных перед закрытием:
// Замените NoActions на свою реализацию
services.AddScoped<IBeforeDisposePageActions, ScreenshotOnFailure>();var serviceProvider = new ServiceCollection()
.AddPlaywrightTestCore<DataTidConfiguration, SingletonBrowserProvider>()
.UseBrowser<ChromeFactory, HeadlessConfigurator, ViewportSizeUpdater>()
.UseAuthenticator<IdentityServerAuthenticator, AuthWithCacheStrategy>()
.ReplaceTracing<FailureTestsTracing, MyTracingConfigurator, NUnitFailureTestResult>()
.UsePom()
.BuildServiceProvider();public static IServiceCollection UsePlaywright(this IServiceCollection services)
{
return services
.AddPlaywrightTestCore<DataTidConfiguration, SingletonBrowserProvider>()
.UseBrowser<ChromeFactory, HeadlessConfigurator, ViewportSizeUpdater>()
.UsePom();
}[Parallelizable(ParallelScope.All)]
public class RunPwShould
{
private static readonly IServiceProvider ServiceProvider = new ServiceCollection()
.AddPlaywrightTestCore()
.UsePom()
.BuildServiceProvider();
[Test]
public async Task BeSuccess_FromAsyncScope()
{
await using var scope = ServiceProvider.CreateAsyncScope();
var services = scope.ServiceProvider;
var navigation = services.GetRequiredService<Navigation>();
var page = await navigation.GoToUrlAsync("https://kontur.ru");
var header = page.Locator("h1", new() { HasText = "Экосистема" });
await Assertions.Expect(header).ToContainTextAsync("для бизнеса");
}
}- Dependency Injection в основе — все компоненты разрешаются через DI контейнер
- Трёхуровневая модель — Playwright → Browser (IBrowserGetter) → BrowserContext (IBrowserContextGetter) → Page (IPageGetter)
- Lazy loading — тяжёлые объекты (Playwright, браузеры) создаются по требованию
- Thread safety — Singleton/Transient провайдеры защищены SemaphoreSlim
- Расширяемость — интерфейсы позволяют легко заменять реализации на любом уровне
- Гибкая трассировка — запись всегда (
FullTracing) или только при падении (FailureTestsTracing) - Хуки закрытия страниц —
IBeforeDisposePageActionsдля скриншотов, логов и пр. - POM паттерн — поддержка создания типизированных page objects и page elements
- CI/CD готовность — автоматическое определение headless режима в CI окружении
- Мультибраузерность — поддержка Chrome, Firefox и WebKit