Skip to content

Commit 5d8d697

Browse files
authored
Merge pull request #25 from SephVin/options
Добавил опции к методам
2 parents 97aa93a + 22079f2 commit 5d8d697

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+677
-394
lines changed

src/Controls.Extensions/ControlListExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ public static async Task ClickLastItemAsync<T>(
4545
public static async Task<T> GetSingleItemAsync<T>(this ControlList<T> controlList) where T : ControlBase
4646
{
4747
await controlList.ExpectV2().ToHaveCountAsync(1).ConfigureAwait(false);
48-
return await controlList.GetFirstItemAsync().ConfigureAwait(false);
48+
return controlList.GetFirstItem();
4949
}
5050

51-
[Obsolete("Используй GetItemAsync из ControlList")]
51+
[Obsolete("Используй GetItem из ControlList")]
5252
public static async Task<T> GetSingleItemAsync<T>(
5353
this ControlList<T> controlList,
5454
Func<T, Task<bool>> predicate,

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.2.0</Version>
26+
<Version>3.3.0</Version>
2727
<Authors>Evgeniy Ivanov</Authors>
2828
<Product>Playwright.ReactUI.Controls.Extensions</Product>
2929
<PackageReadmeFile>README-Controls.Extensions.md</PackageReadmeFile>

src/Controls/Assertions/RadioGroupAssertionsV2.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async Task ToBeCheckedByValueAsync(string value, LocatorAssertionsToBeChe
3030

3131
public async Task ToBeCheckedByIndexAsync(int index, LocatorAssertionsToBeCheckedOptions? options = default)
3232
{
33-
var radio = await radioGroup.GetByIndexAsync(index).ConfigureAwait(false);
33+
var radio = radioGroup.GetByIndex(index);
3434
await radio.ExpectV2().ToBeCheckedAsync(options).ConfigureAwait(false);
3535
}
3636

@@ -48,7 +48,7 @@ public async Task ToBeUncheckedByValueAsync(string value, LocatorAssertionsToBeC
4848

4949
public async Task ToBeUncheckedByIndexAsync(int index, LocatorAssertionsToBeCheckedOptions? options = default)
5050
{
51-
var radio = await radioGroup.GetByIndexAsync(index).ConfigureAwait(false);
51+
var radio = radioGroup.GetByIndex(index);
5252
await radio.ExpectV2().ToBeUncheckedAsync(options).ConfigureAwait(false);
5353
}
5454

src/Controls/Autocomplete.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public async Task<string> GetValueAsync(LocatorInputValueOptions? options = defa
3030

3131
public async Task FillAsync(string value, LocatorFillOptions? options = default)
3232
{
33-
await FocusAsync().ConfigureAwait(false);
34-
await ClearAsync().ConfigureAwait(false);
33+
await FocusAsync(new LocatorFocusOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
34+
await ClearAsync(new LocatorClearOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
3535
await InputLocator.FillAsync(value, options).ConfigureAwait(false);
3636
}
3737

@@ -44,10 +44,12 @@ public async Task PressSequentiallyAsync(string value, LocatorPressSequentiallyO
4444
public async Task ClearAsync(LocatorClearOptions? options = default)
4545
=> await InputLocator.ClearAsync(options).ConfigureAwait(false);
4646

47-
public async Task FocusAsync()
47+
public async Task FocusAsync(LocatorFocusOptions? options = default)
4848
{
49-
await InputLocator.Expect().ToBeEnabledAsync().ConfigureAwait(false);
50-
await InputLocator.FocusAsync().ConfigureAwait(false);
49+
await ExpectV2()
50+
.ToBeEnabledAsync(new LocatorAssertionsToBeEnabledOptions { Timeout = options?.Timeout })
51+
.ConfigureAwait(false);
52+
await InputLocator.FocusAsync(options).ConfigureAwait(false);
5153
}
5254

5355
public async Task BlurAsync(LocatorBlurOptions? options = default)
@@ -56,9 +58,6 @@ public async Task BlurAsync(LocatorBlurOptions? options = default)
5658
public override async Task ClickAsync(LocatorClickOptions? options = default)
5759
=> await InputLocator.ClickAsync(options).ConfigureAwait(false);
5860

59-
public async Task<Tooltip> GetTooltipAsync(TooltipType type)
60-
=> await TooltipProvider.GetTooltipAsync(type, this).ConfigureAwait(false);
61-
6261
public async Task SelectFirstSuggestionAsync(LocatorClickOptions? options = default)
6362
{
6463
var suggestions = await GetSuggestionsAsync().ConfigureAwait(false);
@@ -83,6 +82,9 @@ public async Task SelectSuggestionAsync(Regex regex, LocatorClickOptions? option
8382
await suggestions.GetByText(regex).ClickAsync(options).ConfigureAwait(false);
8483
}
8584

85+
public async Task<Tooltip> GetTooltipAsync(TooltipType type)
86+
=> await TooltipProvider.GetTooltipAsync(type, this).ConfigureAwait(false);
87+
8688
[Obsolete("Используй ExpectV2. В будущих версиях этот метод будет удален")]
8789
public override ILocatorAssertions Expect() => new InputAssertions(RootLocator.Expect(), InputLocator.Expect());
8890

src/Controls/Button.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public async Task<string> GetTextAsync(LocatorInnerTextOptions? options = defaul
3232
public override async Task ClickAsync(LocatorClickOptions? options = default)
3333
=> await ButtonLocator.ClickAsync(options).ConfigureAwait(false);
3434

35-
public async Task FocusAsync()
35+
public async Task FocusAsync(LocatorFocusOptions? options = default)
3636
{
37-
await ButtonLocator.Expect().ToBeEnabledAsync().ConfigureAwait(false);
38-
await ButtonLocator.FocusAsync().ConfigureAwait(false);
37+
await ButtonLocator.Expect()
38+
.ToBeEnabledAsync(new LocatorAssertionsToBeEnabledOptions { Timeout = options?.Timeout })
39+
.ConfigureAwait(false);
40+
await ButtonLocator.FocusAsync(options).ConfigureAwait(false);
3941
}
4042

4143
public async Task BlurAsync(LocatorBlurOptions? options = default)

src/Controls/Checkbox.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ public async Task CheckAsync(LocatorCheckOptions? options = default)
3636
public async Task UncheckAsync(LocatorUncheckOptions? options = default)
3737
=> await RootLocator.UncheckAsync(options).ConfigureAwait(false);
3838

39-
public async Task FocusAsync()
39+
public async Task FocusAsync(LocatorFocusOptions? options = default)
4040
{
41-
await InputLocator.Expect().ToBeEnabledAsync().ConfigureAwait(false);
42-
await InputLocator.FocusAsync().ConfigureAwait(false);
41+
await ExpectV2()
42+
.ToBeEnabledAsync(new LocatorAssertionsToBeEnabledOptions { Timeout = options?.Timeout })
43+
.ConfigureAwait(false);
44+
await InputLocator.FocusAsync(options).ConfigureAwait(false);
4345
}
4446

4547
public async Task BlurAsync(LocatorBlurOptions? options = default)

src/Controls/Combobox.cs

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,77 +44,98 @@ public async Task<string> GetSelectedValueAsync()
4444
/// Используй этот метод, когда в меню существует несколько элементов с одинаковым названием
4545
/// В остальных случаях лучше использовать `SelectAsync`
4646
/// </summary>
47-
public async Task SelectFirstAsync(string value)
47+
public async Task SelectFirstAsync(string value, LocatorClickOptions? options = default)
4848
{
4949
var items = await GetComboboxMenuItemsLocatorAsync(value).ConfigureAwait(false);
50-
await items.First.ClickAsync().ConfigureAwait(false);
50+
await items.First.ClickAsync(options).ConfigureAwait(false);
5151
}
5252

5353
/// <summary>
5454
/// Используй этот метод, когда в меню существует несколько элементов с одинаковым названием
5555
/// В остальных случаях лучше использовать `SelectAsync`
5656
/// </summary>
57-
public async Task SelectFirstAsync(Regex value)
57+
public async Task SelectFirstAsync(Regex value, LocatorClickOptions? options = default)
5858
{
5959
var items = await GetComboboxMenuItemsLocatorAsync(value).ConfigureAwait(false);
60-
await items.First.ClickAsync().ConfigureAwait(false);
60+
await items.First.ClickAsync(options).ConfigureAwait(false);
6161
}
6262

63-
public async Task SelectAsync(string value)
63+
public async Task SelectAsync(string value, LocatorClickOptions? options = default)
6464
{
6565
var items = await GetComboboxMenuItemsLocatorAsync(value).ConfigureAwait(false);
66-
await items.Expect().ToHaveCountAsync(1).ConfigureAwait(false);
67-
await items.ClickAsync().ConfigureAwait(false);
66+
await items.Expect()
67+
.ToHaveCountAsync(1, new LocatorAssertionsToHaveCountOptions { Timeout = options?.Timeout })
68+
.ConfigureAwait(false);
69+
await items.ClickAsync(options).ConfigureAwait(false);
6870
}
6971

70-
public async Task SelectAsync(Regex value)
72+
public async Task SelectAsync(Regex value, LocatorClickOptions? options = default)
7173
{
7274
var items = await GetComboboxMenuItemsLocatorAsync(value).ConfigureAwait(false);
73-
await items.Expect().ToHaveCountAsync(1).ConfigureAwait(false);
74-
await items.ClickAsync().ConfigureAwait(false);
75+
await items.Expect()
76+
.ToHaveCountAsync(1, new LocatorAssertionsToHaveCountOptions { Timeout = options?.Timeout })
77+
.ConfigureAwait(false);
78+
await items.ClickAsync(options).ConfigureAwait(false);
7579
}
7680

7781
public async Task FillAsync(string value, LocatorFillOptions? options = default)
7882
{
79-
await FocusAsync().ConfigureAwait(false);
83+
await FocusAsync(new LocatorFocusOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
8084
await NativeInputLocator.FillAsync(value, options).ConfigureAwait(false);
8185
}
8286

8387
public async Task ClearAsync(LocatorClearOptions? options = default)
8488
{
85-
await FocusAsync().ConfigureAwait(false);
89+
await FocusAsync(new LocatorFocusOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
8690
await NativeInputLocator.ClearAsync(options).ConfigureAwait(false);
8791
}
8892

89-
public async Task FocusAsync()
93+
public async Task FocusAsync(LocatorFocusOptions? options = default)
9094
{
91-
await NativeInputLocator.Expect().ToBeEnabledAsync().ConfigureAwait(false);
95+
await NativeInputLocator.Expect()
96+
.ToBeEnabledAsync(new LocatorAssertionsToBeEnabledOptions { Timeout = options?.Timeout })
97+
.ConfigureAwait(false);
9298
await RootLocator
9399
.Locator("input[type='text']")
94100
.Or(RootLocator.Locator("[data-tid='InputLikeText__root']"))
95-
.FocusAsync()
101+
.FocusAsync(options)
96102
.ConfigureAwait(false);
97103
}
98104

99-
public async Task BlurAsync()
100-
=> await NativeInputLocator.PressAsync("Tab").ConfigureAwait(false);
105+
public async Task BlurAsync(LocatorBlurOptions? options = default)
106+
=> await NativeInputLocator.PressAsync(
107+
"Tab",
108+
new LocatorPressOptions { Timeout = options?.Timeout }
109+
).ConfigureAwait(false);
101110

102111
public override async Task ClickAsync(LocatorClickOptions? options = default)
103112
{
104113
// NOTE: rootLocator всегда в состоянии enabled, даже если ComboBox disabled
105-
await NativeInputLocator.Expect().ToBeEnabledAsync().ConfigureAwait(false);
114+
await ExpectV2()
115+
.ToBeEnabledAsync(new LocatorAssertionsToBeEnabledOptions { Timeout = options?.Timeout })
116+
.ConfigureAwait(false);
106117
await base.ClickAsync(options).ConfigureAwait(false);
107118
}
108119

109120
public async Task<Tooltip> GetTooltipAsync(TooltipType type)
110121
=> await TooltipProvider.GetTooltipAsync(type, this).ConfigureAwait(false);
111122

123+
/// <summary>
124+
/// Возвращает список меню по data-tid из react-ui:
125+
/// - MenuItem__root
126+
/// - MenuMessage__root
127+
/// - ComboBoxMenu__item
128+
/// - ComboBoxMenu__notFound
129+
/// - MenuHeader__root
130+
/// - MenuFooter__root
131+
/// </summary>
112132
public async Task<ControlList<MenuItem>> GetMenuItemsAsync()
113133
{
114134
await FocusAsync().ConfigureAwait(false);
115135
var container = await portal.GetContainerAsync().ConfigureAwait(false);
116136
await container.Locator("[data-tid='Spinner__root']")
117-
.WaitForAsync(new LocatorWaitForOptions { State = WaitForSelectorState.Hidden }).ConfigureAwait(false);
137+
.WaitForAsync(new LocatorWaitForOptions { State = WaitForSelectorState.Hidden })
138+
.ConfigureAwait(false);
118139

119140
return new ControlList<MenuItem>(
120141
container,

src/Controls/ControlBase.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ protected ControlBase(ILocator rootLocator)
2121
public virtual async Task<bool> IsVisibleAsync(LocatorIsVisibleOptions? options = default)
2222
=> await RootLocator.IsVisibleAsync(options).ConfigureAwait(false);
2323

24-
public async Task<bool> HasErrorAsync()
24+
public async Task<bool> HasErrorAsync(LocatorGetAttributeOptions? options = default)
2525
{
26-
await WaitForAsync().ConfigureAwait(false);
27-
return await HasAttributeAsync(DataVisualState.Error).ConfigureAwait(false);
26+
await WaitForAsync(new LocatorWaitForOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
27+
return await HasAttributeAsync(DataVisualState.Error, options).ConfigureAwait(false);
2828
}
2929

30-
public async Task<bool> HasWarningAsync()
30+
public async Task<bool> HasWarningAsync(LocatorGetAttributeOptions? options = default)
3131
{
32-
await WaitForAsync().ConfigureAwait(false);
33-
return await HasAttributeAsync(DataVisualState.Warning).ConfigureAwait(false);
32+
await WaitForAsync(new LocatorWaitForOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
33+
return await HasAttributeAsync(DataVisualState.Warning, options).ConfigureAwait(false);
3434
}
3535

3636
public virtual async Task ClickAsync(LocatorClickOptions? options = default)
@@ -45,10 +45,10 @@ public async Task ScrollIntoViewIfNeededAsync(LocatorScrollIntoViewIfNeededOptio
4545
public async Task WaitForAsync(LocatorWaitForOptions? options = default)
4646
=> await RootLocator.WaitForAsync(options).ConfigureAwait(false);
4747

48-
public async Task<bool> HasAttributeAsync(string name)
48+
public async Task<bool> HasAttributeAsync(string name, LocatorGetAttributeOptions? options = default)
4949
{
50-
await WaitForAsync().ConfigureAwait(false);
51-
return await GetAttributeValueAsync(name).ConfigureAwait(false) != null;
50+
await WaitForAsync(new LocatorWaitForOptions { Timeout = options?.Timeout }).ConfigureAwait(false);
51+
return await GetAttributeValueAsync(name, options).ConfigureAwait(false) != null;
5252
}
5353

5454
public async Task<string?> GetAttributeValueAsync(

src/Controls/ControlList.cs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,37 @@ Func<ILocator, TItem> itemFactory
3131
public override async Task<bool> IsVisibleAsync(LocatorIsVisibleOptions? options = default)
3232
=> await ItemsLocator.First.IsVisibleAsync(options).ConfigureAwait(false);
3333

34+
/// <summary>
35+
/// Поведение метода идентично вызову Locator.All()
36+
///
37+
/// getItems не ждет появления элементов, соответствующих локатору, а сразу возвращает всё, что есть на странице в данный момент.
38+
/// Когда список элементов меняется динамически, использование getItems приведёт к непредсказуемым и нестабильным результатам.
39+
/// Когда список элементов стабилен, но загружается динамически, необходимо дождаться полной загрузки списка перед вызовом getItems
40+
/// </summary>
3441
public async Task<IReadOnlyList<TItem>> GetItemsAsync()
3542
{
3643
var itemLocators = await GetItemLocatorsAsync().ConfigureAwait(false);
3744
return itemLocators.Select(x => itemFactory(x)).ToList();
3845
}
3946

40-
public async Task<TItem> GetFirstItemAsync()
41-
=> await GetItemAsync(0).ConfigureAwait(false);
47+
/// <summary>
48+
/// Поведение метода идентично вызову Locator.Nth(0)
49+
/// </summary>
50+
public TItem GetFirstItem() => GetItem(0);
4251

52+
/// <summary>
53+
/// Поведение метода идентично вызову Locator.Nth(-1)
54+
/// </summary>
4355
public async Task<TItem> GetLastItemAsync()
4456
{
4557
var itemsCount = await CountAsync().ConfigureAwait(false);
46-
return await GetItemAsync(itemsCount - 1).ConfigureAwait(false);
58+
return GetItem(itemsCount - 1);
4759
}
4860

49-
public async Task<TItem> GetItemAsync(int index)
50-
{
51-
var itemLocators = await GetItemLocatorsAsync().ConfigureAwait(false);
52-
return itemFactory(itemLocators[index]);
53-
}
61+
/// <summary>
62+
/// Поведение метода идентично вызову Locator.Nth(index)
63+
/// </summary>
64+
public TItem GetItem(int index) => itemFactory(ItemsLocator.Nth(index));
5465

5566
public async Task<TItem> GetFirstItemAsync(
5667
Func<TItem, Task<bool>> predicate,
@@ -125,7 +136,7 @@ public async Task<TItem> GetItemAsync(Func<TItem, Task<bool>> predicate, int tim
125136
"Если вы его используете, то убедитесь, что Controls.Extensions у вас добавлен")]
126137
public async Task ClickItemAsync(int index, LocatorClickOptions? options = default)
127138
{
128-
var item = await GetItemAsync(index).ConfigureAwait(false);
139+
var item = GetItem(index);
129140
await item.ClickAsync(options).ConfigureAwait(false);
130141
}
131142

src/Controls/Controls.csproj

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

0 commit comments

Comments
 (0)