You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+81-2Lines changed: 81 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,16 +54,95 @@ public new HeaderAssertions ExpectV2() => new(this);
54
54
55
55
# Playwright.ReactUI.Controls.Extensions
56
56
57
-
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**
57
+
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**, а также атрибуты для автозаполнения контролов в PageObjects и PageElements
58
58
59
59
### Как использовать
60
60
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):**
62
62
63
63
+`await input.AppendTextAsync("newValue").ConfigureAwait(false);` - добавление значения `newValue` к уже существующему в Input
64
64
+`await input.WaitToBeVisibleAsync().ConfigureAwait(false);` - ожидание видимости компонента на странице
65
65
+`await input.WaitToHaveValueAsync("TODO").ConfigureAwait(false);` - ожидание значения `TODO` в Input'e
66
66
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);
Copy file name to clipboardExpand all lines: readme/README-Controls.Extensions.md
+79-1Lines changed: 79 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Playwright.ReactUI.Controls.Extensions
2
2
3
-
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**
3
+
Библиотека предоставляет набор расширений к **Playwright.ReactUI.Controls**, а также атрибуты для автозаполнения контролов в PageObjects и PageElements
4
4
5
5
### Как использовать
6
6
@@ -10,6 +10,84 @@
10
10
+`await input.WaitToBeVisibleAsync().ConfigureAwait(false);` - ожидание видимости компонента на странице
11
11
+`await input.WaitToHaveValueAsync("TODO").ConfigureAwait(false);` - ожидание значения `TODO` в Input'e
12
12
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);
0 commit comments