ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ @skbkontur/react-ui ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Playwright"
Install
| Product | Versions |
|---|---|
| .NET | |
| .NET Standard |
README
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);
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ SkbKontur.Playwright.ReactUI.Controls.Extensions
ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π°Π±ΠΎΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ Π΄Π»Ρ Π°Π²ΡΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΎΠ² Π² 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);
}
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- netstandard2.0 / NET6
- Playwright 1.51.0
- @skbkontur/react-ui 4.25.2 (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ)
Changes from Previous Version
Adoption Assessment
A verified publisher signal is available. Assess fit from the package's supported frameworks, license and dependency graph rather than popularity alone.
Related Guides & Workflows
Learn how to evaluate, integrate, or audit this package in your .NET project.