SkbKontur.Playwright.ReactUI.Controls
4.0.0
Prefix Reserved
See the version list below for details.
dotnet add package SkbKontur.Playwright.ReactUI.Controls --version 4.0.0
NuGet\Install-Package SkbKontur.Playwright.ReactUI.Controls -Version 4.0.0
<PackageReference Include="SkbKontur.Playwright.ReactUI.Controls" Version="4.0.0" />
<PackageVersion Include="SkbKontur.Playwright.ReactUI.Controls" Version="4.0.0" />
<PackageReference Include="SkbKontur.Playwright.ReactUI.Controls" />
paket add SkbKontur.Playwright.ReactUI.Controls --version 4.0.0
#r "nuget: SkbKontur.Playwright.ReactUI.Controls, 4.0.0"
#:package SkbKontur.Playwright.ReactUI.Controls@4.0.0
#addin nuget:?package=SkbKontur.Playwright.ReactUI.Controls&version=4.0.0
#tool nuget:?package=SkbKontur.Playwright.ReactUI.Controls&version=4.0.0
Playwright.ReactUI.Controls
Библиотека предназначена для взаимодействия с компонентами @skbkontur/react-ui при тестировании с помощью Playwright.NET
Как использовать
В качестве примера взят компонент Input:
<Input data-tid="InputId" />
Инициализация
var input = new Input(page.GetByTestId("InputId"));
Взаимодействие
await input.FillAsync("newValue").ConfigureAwait(false);
Проверка
await input.ExpectV2().ToHaveValueAsync("newValue").ConfigureAwait(false);
Создание своего компонента
public class Header : ControlBase
{
public Header(ILocator rootLocator)
: base(rootLocator)
{
SomeInput = new Input(rootLocator.GetByTestId("InputId"));
}
public Input SomeInput { get; }
}
Создание набора ассертов к своему компоненту
public class HeaderAssertions : ControlBaseAssertionsV2
{
private readonly Header header;
public HeaderAssertions(Header header)
: base(header)
{
this.header = header;
}
public async Task ToBeVisibleAsync()
=> await header.RootLocator.Expect().ToBeVisibleAsync().ConfigureAwait(false);
}
Для "подключения" набора достаточно добавить к своему компоненту следующую строчку:
public new HeaderAssertions ExpectV2() => new(this);
Расширения
Предоставляется набор расширений, а также атрибуты для автозаполнения контролов в PageObjects и PageElements
Как использовать
Примеры расширений для компонента Input:
await input.AppendTextAsync("newValue").ConfigureAwait(false);- добавление значенияnewValueк уже существующему в Inputawait input.WaitToBeVisibleAsync().ConfigureAwait(false);- ожидание видимости компонента на страницеawait input.WaitToHaveValueAsync("TODO").ConfigureAwait(false);- ожидание значенияTODOв Input'e
AutoFillControlsAttribute
Чтобы воспользоваться атрибутом AutoFillControls необходимо следующее:
- Страница (PageObject) должна наследоваться от PageBase. Если у вас есть свой базовый класс страницы, то он должен наследовать PageBase
- Составной / сложный компонент (PageElement), т.е. контрол, который состоит из нескольких контролов (см. пример ниже), должен наследоваться от CompoundControlBase, а не ControlBase
- На PageObject / PageElement навесить атрибут [AutoFillControls]
Для заполнения самих контролов существует несколько атрибутов:
- RootByTid - ищет контрол по переданному data-tid'у
- RootByLocator - ищет контрол по переданному селектору (css / xpath)
- ChildByTid - ищет элемент списка по переданному data-tid'у; используется только для инициализации ControlList совместно с RootByTid / RootByLocator
- ChildByLocator - ищет элемент списка по переданному селектору (css / xpath); используется только для инициализации ControlList совместно с RootByTid / RootByLocator
- SkipAutoFillControl - если по каким-то причинам контрол нельзя автозаполнить, то необходимо навесить на него атрибут SkipAutoFillControl и инициализировать в конструкторе
Библиотека предоставляет возможность создать свой атрибут для заполнения контролов. Для этого надо реализовать IRootLocatorAttribute и(или) IChildLocatorAttribute (см. пример ниже)
Если появится желание реализовать свой атрибут, то лучше сначало прийти в меня. Возможно ваш атрибут лучше поместить в библиотеку
Если никакой атрибут заполнения контрола не указан, то AutoFillControls будет искать контрол по data-tid'у имени свойства
Примеры использования AutoFillControlsAttribute
// PageObject
[AutoFillControls]
public class TestPage : PageBase
{
public TestPage(IPage page)
: base(page)
{
}
// Контрол инициализируется с data-tid'ом Compound
public Compound Compound { get; init; }
// Контрол инициализируется с data-tid'ом LinkId
[RootByTid("LinkId")]
public Link Link { get; init; }
// Контрол инициализируется с локатором LocatorId (здесь может быть css / xpath)
[RootByLocator("LocatorId")]
public Input Input { get; init; }
}
// PageElement
[AutoFillControls]
public class Compound : CompoundControlBase
{
public Compound(ILocator rootLocator)
: base(rootLocator)
{
Button = new Button(rootLocator.GetByText("ButtonId"));
}
// Контрол инициализируется в конструкторе и не будет автозаполняться
[SkipAutoFillControl]
public Button Button { get; init; }
// Для создания списка необходимо указать Root* и Child* атрибуты. Child атрибут должен быть обязательно указан
[RootByTid("RootList")]
[ChildByLocator("ChildItem")]
public ControlList<Label> List { get; init; }
}
Пример реализации IRootLocatorAttribute
// Ищет контрол по GetByText
[AttributeUsage(AttributeTargets.Property)]
public class RootByTextAttribute : Attribute, IRootLocatorAttribute
{
public RootByTextAttribute(string selector) => Selector = selector;
public string Selector { get; }
public ILocator Resolve(ILocator locator) => locator.GetByText(Selector);
public ILocator Resolve(IPage page) => page.GetByText(Selector);
}
DI
В систему добавлена базовая поддержка Dependency Injection (DI) через 2 ключевых интерфейса, которые также обеспечивают и автоматическую инициализацию контролов.
Добавлена возможность кастомизации механизма автоматического создания контролов через IAutoControlsSetter
Минимальные требования
- netstandard2.0 / NET6
- Playwright 1.51.0
- @skbkontur/react-ui 4.25.2 (рекомендуется использовать последние версии)
Запуск Storybook
Для запуска тестов в проектах Controls и Controls.Extensions необходим Storybook. Его можно запустить локально или в docker-контейнере
Локальный запуск
- Установить Node.js (проверялось на версии 18.19.0)
- Запустить скрипт
scripts/RunLocalStorybook.ps1
Запуск в Docker
- Установить Docker
- Запустить скрипт
scripts/RunStorybookInDocker.ps1
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Playwright (>= 1.51.0)
- SkbKontur.Playwright.POM.Abstractions (>= 1.0.0)
- System.Linq.Async (>= 6.0.1)
-
net6.0
- Microsoft.Playwright (>= 1.51.0)
- SkbKontur.Playwright.POM.Abstractions (>= 1.0.0)
- System.Linq.Async (>= 6.0.1)
-
net8.0
- Microsoft.Playwright (>= 1.51.0)
- SkbKontur.Playwright.POM.Abstractions (>= 1.0.0)
- System.Linq.Async (>= 6.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.2.0 | 216 | 4/6/2026 |
| 4.1.1 | 565 | 3/16/2026 |
| 4.1.0 | 177 | 3/16/2026 |
| 4.0.1 | 884 | 1/27/2026 |
| 4.0.0 | 100 | 1/22/2026 |
| 4.0.0-betac761fd74 | 97 | 1/20/2026 |
| 4.0.0-betac1918b74 | 104 | 1/22/2026 |
| 4.0.0-beta4ec7bd11 | 99 | 1/16/2026 |
| 4.0.0-beta2cc952c6 | 273 | 12/16/2025 |