Skip to content

Commit d4bbad9

Browse files
committed
Документация
1 parent 212c167 commit d4bbad9

File tree

3 files changed

+161
-4
lines changed

3 files changed

+161
-4
lines changed

README.md

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,95 @@ public new HeaderAssertions ExpectV2() => new(this);
5454

5555
# Playwright.ReactUI.Controls.Extensions
5656

57-
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**
57+
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**, а также атрибуты для автозаполнения контролов в PageObjects и PageElements
5858

5959
### Как использовать
6060

61-
**Примеры для компонента [Input](https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui_input-data-input--docs):**
61+
**Примеры расширений для компонента [Input](https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui_input-data-input--docs):**
6262

6363
+ `await input.AppendTextAsync("newValue").ConfigureAwait(false);` - добавление значения `newValue` к уже существующему в Input
6464
+ `await input.WaitToBeVisibleAsync().ConfigureAwait(false);` - ожидание видимости компонента на странице
6565
+ `await input.WaitToHaveValueAsync("TODO").ConfigureAwait(false);` - ожидание значения `TODO` в Input'e
6666

67+
**AutoFillControlsAttribute**
68+
69+
Чтобы воспользоваться атрибутом **AutoFillControls** необходимо следующее:
70+
- Страница (PageObject) должна наследоваться от **PageBase**. Если у вас есть свой базовый класс страницы, то он должен наследовать PageBase
71+
- Составной / сложный компонент (PageElement), т.е. контрол, который состоит из нескольких контролов (см. пример ниже), должен наследоваться от **CompoundControlBase**, а не **ControlBase**
72+
- На PageObject / PageElement навесить атрибут [AutoFillControls]
73+
74+
Для заполнения самих контролов существует несколько атрибутов:
75+
- **RootByTid** - ищет контрол по переданному data-tid'у
76+
- **RootByLocator** - ищет контрол по переданному селектору (css / xpath)
77+
- **ChildByTid** - ищет элемент списка по переданному data-tid'у; используется **только** для инициализации **ControlList** совместно с **RootByTid / RootByLocator**
78+
- **ChildByLocator** - ищет элемент списка по переданному селектору (css / xpath); используется **только** для инициализации **ControlList** совместно с **RootByTid / RootByLocator**
79+
80+
Библиотека предоставляет возможность создать свой атрибут для заполнения контролов. Для этого надо реализовать **IRootLocatorAttribute** и(или) **IChildLocatorAttribute** (см. пример ниже)
81+
**Если появится желание реализовать свой атрибут, то лучше сначало прийти в меня. Возможно ваш атрибут лучше поместить в библиотеку**
82+
83+
Если никакой атрибут заполнения контрола не указан, то **AutoFillControls** будет искать контрол по data-tid'у имени свойства
84+
85+
**Примеры использования AutoFillControlsAttribute**
86+
87+
```
88+
// PageObject
89+
[AutoFillControls]
90+
public class TestPage : PageBase
91+
{
92+
public TestPage(IPage page)
93+
: base(page)
94+
{
95+
}
96+
97+
// Контрол инициализируется с data-tid'ом Compound
98+
public Compound Compound { get; init; }
99+
100+
// Контрол инициализируется с data-tid'ом LinkId
101+
[RootByTid("LinkId")]
102+
public Link Link { get; init; }
103+
104+
// Контрол инициализируется с локатором LocatorId (здесь может быть css / xpath)
105+
[RootByLocator("LocatorId")]
106+
public Input Input { get; init; }
107+
}
108+
109+
// PageElement
110+
[AutoFillControls]
111+
public class Compound : CompoundControlBase
112+
{
113+
public Compound(ILocator rootLocator)
114+
: base(rootLocator)
115+
{
116+
Button = new Button(rootLocator.GetByText("ButtonId"));
117+
}
118+
119+
// Контрол инициализируется в конструкторе и не будет автозаполняться
120+
[SkipAutoFillControl]
121+
public Button Button { get; init; }
122+
123+
// Для создания списка необходимо указать Root* и Child* атрибуты. Child атрибут должен быть обязательно указан
124+
[RootByTid("RootList")]
125+
[ChildByLocator("ChildItem")]
126+
public ControlList<Label> List { get; init; }
127+
}
128+
```
129+
130+
**Пример реализации IRootLocatorAttribute**
131+
132+
```
133+
// Ищет контрол по GetByText
134+
[AttributeUsage(AttributeTargets.Property)]
135+
public class RootByTextAttribute : Attribute, IRootLocatorAttribute
136+
{
137+
public RootByTextAttribute(string selector) => Selector = selector;
138+
public string Selector { get; }
139+
140+
public ILocator Resolve(ILocator locator) => locator.GetByText(Selector);
141+
142+
public ILocator Resolve(IPage page) => page.GetByText(Selector);
143+
}
144+
```
145+
67146
# Минимальные требования
68147

69148
+ netstandard2.0 / NET6

readme/README-Controls.Extensions.md

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Playwright.ReactUI.Controls.Extensions
22

3-
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**
3+
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**, а также атрибуты для автозаполнения контролов в PageObjects и PageElements
44

55
### Как использовать
66

@@ -10,6 +10,84 @@
1010
+ `await input.WaitToBeVisibleAsync().ConfigureAwait(false);` - ожидание видимости компонента на странице
1111
+ `await input.WaitToHaveValueAsync("TODO").ConfigureAwait(false);` - ожидание значения `TODO` в Input'e
1212

13+
**AutoFillControlsAttribute**
14+
15+
Чтобы воспользоваться атрибутом **AutoFillControls** необходимо следующее:
16+
- Страница (PageObject) должна наследоваться от **PageBase**. Если у вас есть свой базовый класс страницы, то он должен наследовать **PageBase**
17+
- Составной / сложный компонент (PageElement), т.е. контрол, который состоит из нескольких контролов (см. пример ниже), должен наследоваться от **CompoundControlBase**, а не **ControlBase**
18+
- На PageObject / PageElement навесить атрибут [AutoFillControls]
19+
20+
Для заполнения самих контролов существует несколько атрибутов:
21+
- **RootByTid** - ищет контрол по переданному data-tid'у
22+
- **RootByLocator** - ищет контрол по переданному селектору (css / xpath)
23+
- **ChildByTid** - ищет элемент списка по переданному data-tid'у; используется **только** для инициализации **ControlList** совместно с **RootByTid / RootByLocator**
24+
- **ChildByLocator** - ищет элемент списка по переданному селектору (css / xpath); используется **только** для инициализации **ControlList** совместно с **RootByTid / RootByLocator**
25+
26+
Библиотека предоставляет возможность создать свой атрибут для заполнения контролов. Для этого надо реализовать **IRootLocatorAttribute** и(или) **IChildLocatorAttribute** (см. пример ниже)
27+
**Если появится желание реализовать свой атрибут, то лучше сначало прийти в меня. Возможно ваш атрибут лучше поместить в библиотеку**
28+
29+
Если никакой атрибут заполнения контрола не указан, то **AutoFillControls** будет искать контрол по data-tid'у имени свойства
30+
31+
**Примеры использования AutoFillControlsAttribute**
32+
33+
```
34+
// PageObject
35+
[AutoFillControls]
36+
public class TestPage : PageBase
37+
{
38+
public TestPage(IPage page)
39+
: base(page)
40+
{
41+
}
42+
43+
// Контрол инициализируется с data-tid'ом Compound
44+
public Compound Compound { get; init; }
45+
46+
// Контрол инициализируется с data-tid'ом LinkId
47+
[RootByTid("LinkId")]
48+
public Link Link { get; init; }
49+
50+
// Контрол инициализируется с локатором LocatorId (здесь может быть css / xpath)
51+
[RootByLocator("LocatorId")]
52+
public Input Input { get; init; }
53+
}
54+
55+
// PageElement
56+
[AutoFillControls]
57+
public class Compound : CompoundControlBase
58+
{
59+
public Compound(ILocator rootLocator)
60+
: base(rootLocator)
61+
{
62+
Button = new Button(rootLocator.GetByText("ButtonId"));
63+
}
64+
65+
// Контрол инициализируется в конструкторе и не будет автозаполняться
66+
[SkipAutoFillControl]
67+
public Button Button { get; init; }
68+
69+
// Для создания списка необходимо указать Root* и Child* атрибуты. Child атрибут должен быть обязательно указан
70+
[RootByTid("RootList")]
71+
[ChildByLocator("ChildItem")]
72+
public ControlList<Label> List { get; init; }
73+
}
74+
```
75+
76+
**Пример реализации IRootLocatorAttribute**
77+
78+
```
79+
// Ищет контрол по GetByText
80+
[AttributeUsage(AttributeTargets.Property)]
81+
public class RootByTextAttribute : Attribute, IRootLocatorAttribute
82+
{
83+
public RootByTextAttribute(string selector) => Selector = selector;
84+
public string Selector { get; }
85+
86+
public ILocator Resolve(ILocator locator) => locator.GetByText(Selector);
87+
88+
public ILocator Resolve(IPage page) => page.GetByText(Selector);
89+
}
90+
```
1391

1492
# Минимальные требования
1593

src/Controls.Extensions/Controls.Extensions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<Title>Playwright.ReactUI.Controls.Extensions</Title>
2424
<AssemblyVersion>1.0.0.0</AssemblyVersion>
2525
<FileVersion>1.0.0</FileVersion>
26-
<Version>3.1.1</Version>
26+
<Version>3.2.0</Version>
2727
<Authors>Evgeniy Ivanov</Authors>
2828
<Product>Playwright.ReactUI.Controls.Extensions</Product>
2929
<PackageReadmeFile>README-Controls.Extensions.md</PackageReadmeFile>

0 commit comments

Comments
 (0)