LocatorAssertions
Класс LocatorAssertions предоставляет методы утверждений, которые могут быть использованы для проверки состояния Locator в тестах.
using Microsoft.Playwright;
using Microsoft.Playwright.MSTest;
namespace PlaywrightTests;
[TestClass]
public class ExampleTests : PageTest
{
[TestMethod]
public async Task StatusBecomesSubmitted()
{
// ...
await Page.GetByRole(AriaRole.Button, new() { Name = "Sign In" }).ClickAsync();
await Expect(Page.Locator(".status")).ToHaveTextAsync("Submitted");
}
}
Методы
ToBeAttachedAsync
Добавлено в: v1.33Убеждается, что Locator указывает на элемент, который подключен к Document или ShadowRoot.
Использование
await Expect(Page.GetByText("Hidden text")).ToBeAttachedAsync();
Аргументы
options
LocatorAssertionsToBeAttachedOptions?
(опционально)
Возвращает
ToBeCheckedAsync
Добавлено в: v1.20Убеждается, что Locator указывает на отмеченный элемент ввода.
Использование
var locator = Page.GetByLabel("Subscribe to newsletter");
await Expect(locator).ToBeCheckedAsync();
Аргументы
options
LocatorAssertionsToBeCheckedOptions?
(опционально)-
Checked
bool? (опционально) Добавлено в: v1.18#Предоставляет состояние для утверждения. По умолчанию утверждает, что элемент ввода отмечен. Эта опция не может быть использована, когда Indeterminate установлена в true.
-
Indeterminate
bool? (опционально) Добавлено в: v1.50#Утверждает, что элемент находится в неопределенном (смешанном) состоянии. Поддерживается только для флажков и радиокнопок. Эта опция не может быть true, когда Checked предоставлена.
-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToBeDisabledAsync
Добавлено в: v1.20Убеждается, что Locator указывает на отключенный элемент. Элемент считается отключенным, если у него есть атрибут "disabled" или он отключен через 'aria-disabled'. Обратите внимание, что только элементы управления, такие как HTML button
, input
, select
, textarea
, option
, optgroup
, могут быть отключены установкой атрибута "disabled". Атрибут "disabled" на других элементах игнорируется браузером.
Использование
var locator = Page.Locator("button.submit");
await Expect(locator).ToBeDisabledAsync();
Аргументы
options
LocatorAssertionsToBeDisabledOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToBeEditableAsync
Добавлено в: v1.20Убеждается, что Locator указывает на редактируемый элемент.
Использование
var locator = Page.GetByRole(AriaRole.Textbox);
await Expect(locator).ToBeEditableAsync();
Аргументы
options
LocatorAssertionsToBeEditableOptions?
(опционально)
Возвращает
ToBeEmptyAsync
Добавлено в: v1.20Убеждается, что Locator указывает на пустой редактируемый элемент или на DOM-узел, который не содержит текста.
Использование
var locator = Page.Locator("div.warning");
await Expect(locator).ToBeEmptyAsync();
Аргументы
options
LocatorAssertionsToBeEmptyOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToBeEnabledAsync
Добавлено в: v1.20Убеждается, что Locator указывает на включенный элемент.
Использование
var locator = Page.Locator("button.submit");
await Expect(locator).ToBeEnabledAsync();
Аргументы
options
LocatorAssertionsToBeEnabledOptions?
(опционально)
Возвращает
ToBeFocusedAsync
Добавлено в: v1.20Убеждается, что Locator указывает на сфокусированный DOM-узел.
Использование
var locator = Page.GetByRole(AriaRole.Textbox);
await Expect(locator).ToBeFocusedAsync();
Аргументы
options
LocatorAssertionsToBeFocusedOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToBeHiddenAsync
Добавлено в: v1.20Убеждается, что Locator либо не разрешается ни в один DOM-узел, либо разрешается в невидимый узел.
Использование
var locator = Page.Locator(".my-element");
await Expect(locator).ToBeHiddenAsync();
Аргументы
options
LocatorAssertionsToBeHiddenOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToBeInViewportAsync
Добавлено в: v1.31Убеждается, что Locator указывает на элемент, который пересекает область просмотра, согласно API наблюдателя пересечений.
Использование
var locator = Page.GetByRole(AriaRole.Button);
// Убедитесь, что хотя бы часть элемента пересекает область просмотра.
await Expect(locator).ToBeInViewportAsync();
// Убедитесь, что элемент полностью вне области просмотра.
await Expect(locator).Not.ToBeInViewportAsync();
// Убедитесь, что хотя бы половина элемента пересекает область просмотра.
await Expect(locator).ToBeInViewportAsync(new() { Ratio = 0.5 });
Аргументы
options
LocatorAssertionsToBeInViewportOptions?
(опционально)-
Ratio
[float]? (опционально)#Минимальное соотношение элемента для пересечения области просмотра. Если равно
0
, то элемент должен пересекать область просмотра при любом положительном соотношении. По умолчанию0
. -
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToBeVisibleAsync
Добавлено в: v1.20Убеждается, что Locator указывает на подключенный и видимый DOM-узел.
Чтобы проверить, что хотя бы один элемент из списка виден, используйте Locator.First.
Использование
// Конкретный элемент виден.
await Expect(Page.GetByText("Welcome")).ToBeVisibleAsync();
// По крайней мере один элемент в списке виден.
await Expect(Page.GetByTestId("todo-item").First).ToBeVisibleAsync();
// По крайней мере один из двух элементов виден, возможно, оба.
await Expect(
Page.GetByRole(AriaRole.Button, new() { Name = "Sign in" })
.Or(Page.GetByRole(AriaRole.Button, new() { Name = "Sign up" }))
.First
).ToBeVisibleAsync();
Аргументы
options
LocatorAssertionsToBeVisibleOptions?
(опционально)
Возвращает
ToContainTextAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент, который содержит указанный текст. Все вложенные элементы будут учитываться при вычислении текстового содержимого элемента. Вы также можете использовать регулярные выражения для значения.
Использование
var locator = Page.Locator(".title");
await Expect(locator).ToContainTextAsync("substring");
await Expect(locator).ToContainTextAsync(new Regex("\\d messages"));
Если вы передаете массив в качестве ожидаемого значения, ожидания следующие:
- Локатор разрешается в список элементов.
- Элементы из подмножества этого списка содержат текст из ожидаемого массива соответственно.
- Соответствующее подмножество элементов имеет тот же порядок, что и ожидаемый массив.
- Каждое текстовое значение из ожидаемого массива соответствует какому-то элементу из списка.
Например, рассмотрим следующий список:
<ul>
<li>Item Text 1</li>
<li>Item Text 2</li>
<li>Item Text 3</li>
</ul>
Посмотрим, как мы можем использовать утверждение:
// ✓ Содержит правильные элементы в правильном порядке
await Expect(Page.Locator("ul > li")).ToContainTextAsync(new string[] {"Text 1", "Text 3", "Text 4"});
// ✖ Неправильный порядок
await Expect(Page.Locator("ul > li")).ToContainTextAsync(new string[] {"Text 3", "Text 2"});
// ✖ Ни один элемент не содержит этот текст
await Expect(Page.Locator("ul > li")).ToContainTextAsync(new string[] {"Some 33"});
// ✖ Локатор указывает на внешний элемент списка, а не на элементы списка
await Expect(Page.Locator("ul")).ToContainTextAsync(new string[] {"Text 3"});
Аргументы
-
expected
string | Regex | IEnumerable<string> | IEnumerable<Regex> Добавлено в: v1.18#Ожидаемая подстрока или RegExp или список из них.
-
options
LocatorAssertionsToContainTextOptions?
(опционально)-
IgnoreCase
bool? (опционально) Добавлено в: v1.23#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
. -
UseInnerText
bool? (опционально) Добавлено в: v1.18#Использовать ли
element.innerText
вместоelement.textContent
при получении текста DOM-узла.
-
Возвращает
Детали
Когда параметр expected
является строкой, Playwright нормализует пробелы и разрывы строк как в фактическом тексте, так и в ожидаемой строке перед сопоставлением. Когда используется регулярное выражение, фактический текст сопоставляется как есть.
ToHaveAccessibleDescriptionAsync
Добавлено в: v1.44Убеждается, что Locator указывает на элемент с заданным доступным описанием.
Использование
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveAccessibleDescriptionAsync("Save results to disk");
Аргументы
-
Ожидаемое доступное описание.
-
options
LocatorAssertionsToHaveAccessibleDescriptionOptions?
(опционально)-
IgnoreCase
bool? (опционально)#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveAccessibleErrorMessageAsync
Добавлено в: v1.50Убеждается, что Locator указывает на элемент с заданным сообщением об ошибке aria.
Использование
var locator = Page.GetByTestId("username-input");
await Expect(locator).ToHaveAccessibleErrorMessageAsync("Username is required.");
Аргументы
-
Ожидаемое доступное сообщение об ошибке.
-
options
LocatorAssertionsToHaveAccessibleErrorMessageOptions?
(опционально)-
IgnoreCase
bool? (опционально)#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveAccessibleNameAsync
Добавлено в: v1.44Убеждается, что Locator указывает на элемент с заданным доступным именем.
Использование
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveAccessibleNameAsync("Save to disk");
Аргументы
-
Ожидаемое доступное имя.
-
options
LocatorAssertionsToHaveAccessibleNameOptions?
(опционально)-
IgnoreCase
bool? (опционально)#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveAttributeAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным атрибутом.
Использование
var locator = Page.Locator("input");
await Expect(locator).ToHaveAttributeAsync("type", "text");
Аргументы
-
name
string Добавлено в: v1.18#Имя атрибута.
-
value
string | Regex Добавлено в: v1.18#Ожидаемое значение атрибута.
-
options
LocatorAssertionsToHaveAttributeOptions?
(опционально)-
IgnoreCase
bool? (опционально) Добавлено в: v1.40#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveClassAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданными CSS-классами. Когда предоставляется строка, она должна полностью соответствовать атрибуту class
элемента. Чтобы сопоставить отдельные классы или выполнить частичное сопоставление, используйте регулярное выражение:
Использование
<div class='middle selected row' id='component'></div>
var locator = Page.Locator("#component");
await Expect(locator).ToHaveClassAsync(new Regex("(^|\\s)selected(\\s|$)"));
await Expect(locator).ToHaveClassAsync("middle selected row");
Когда передается массив, метод утверждает, что список найденных элементов соответствует соответствующему списку ожидаемых значений классов. Атрибут class каждого элемента сопоставляется с соответствующей строкой или регулярным выражением в массиве:
var locator = Page.Locator("list > .component");
await Expect(locator).ToHaveClassAsync(new string[]{"component", "component selected", "component"});
Аргументы
-
expected
string | Regex | IEnumerable<string> | IEnumerable<Regex> Добавлено в: v1.18#Ожидаемый класс или RegExp или список из них.
-
options
LocatorAssertionsToHaveClassOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveCountAsync
Добавлено в: v1.20Убеждается, что Locator разрешается в точное количество DOM-узлов.
Использование
var locator = Page.Locator("list > .component");
await Expect(locator).ToHaveCountAsync(3);
Аргументы
-
Ожидаемое количество.
-
options
LocatorAssertionsToHaveCountOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveCSSAsync
Добавлено в: v1.20Убеждается, что Locator разрешается в элемент с заданным вычисленным стилем CSS.
Использование
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveCSSAsync("display", "flex");
Аргументы
-
name
string Добавлено в: v1.18#Имя CSS-свойства.
-
value
string | Regex Добавлено в: v1.18#Значение CSS-свойства.
-
options
LocatorAssertionsToHaveCSSOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveIdAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным ID DOM-узла.
Использование
var locator = Page.GetByRole(AriaRole.Textbox);
await Expect(locator).ToHaveIdAsync("lastname");
Аргументы
-
id
string | Regex Добавлено в: v1.18#ID элемента.
-
options
LocatorAssertionsToHaveIdOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveJSPropertyAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным свойством JavaScript. Обратите внимание, что это свойство может быть как примитивного типа, так и простым сериализуемым объектом JavaScript.
Использование
var locator = Page.Locator(".component");
await Expect(locator).ToHaveJSPropertyAsync("loaded", true);
Аргументы
-
name
string Добавлено в: v1.18#Имя свойства.
-
value
[object] Добавлено в: v1.18#Значение свойства.
-
options
LocatorAssertionsToHaveJSPropertyOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveRoleAsync
Добавлено в: v1.44Убеждается, что Locator указывает на элемент с заданной ролью ARIA.
Обратите внимание, что роль сопоставляется как строка, игнорируя иерархию ролей ARIA. Например, утверждение о роли суперкласса "checkbox"
на элементе с ролью подкласса "switch"
завершится неудачей.
Использование
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveRoleAsync(AriaRole.Button);
Аргументы
-
role
enum AriaRole { Alert, Alertdialog, Application, Article, Banner, Blockquote, Button, Caption, Cell, Checkbox, Code, Columnheader, Combobox, Complementary, Contentinfo, Definition, Deletion, Dialog, Directory, Document, Emphasis, Feed, Figure, Form, Generic, Grid, Gridcell, Group, Heading, Img, Insertion, Link, List, Listbox, Listitem, Log, Main, Marquee, Math, Meter, Menu, Menubar, Menuitem, Menuitemcheckbox, Menuitemradio, Navigation, None, Note, Option, Paragraph, Presentation, Progressbar, Radio, Radiogroup, Region, Row, Rowgroup, Rowheader, Scrollbar, Search, Searchbox, Separator, Slider, Spinbutton, Status, Strong, Subscript, Superscript, Switch, Tab, Table, Tablist, Tabpanel, Term, Textbox, Time, Timer, Toolbar, Tooltip, Tree, Treegrid, Treeitem }
#Требуемая роль aria.
-
options
LocatorAssertionsToHaveRoleOptions?
(опционально)-
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveTextAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным текстом. Все вложенные элементы будут учитываться при вычислении текстового содержимого элемента. Вы можете использовать регулярные выражения для значения.
Использование
var locator = Page.Locator(".title");
await Expect(locator).ToHaveTextAsync(new Regex("Welcome, Test User"));
await Expect(locator).ToHaveTextAsync(new Regex("Welcome, .*"));
Если вы передаете массив в качестве ожидаемого значения, ожидания следующие:
- Локатор разрешается в список элементов.
- Количество элементов равно количеству ожидаемых значений в массиве.
- Элементы из списка имеют текст, соответствующий ожидаемым значениям массива, один за другим, в порядке.
Например, рассмотрим следующий список:
<ul>
<li>Text 1</li>
<li>Text 2</li>
<li>Text 3</li>
</ul>
Посмотрим, как мы можем использовать утверждение:
// ✓ Имеет правильные элементы в правильном порядке
await Expect(Page.Locator("ul > li")).ToHaveTextAsync(new string[] {"Text 1", "Text 2", "Text 3"});
// ✖ Неправильный порядок
await Expect(Page.Locator("ul > li")).ToHaveTextAsync(new string[] {"Text 3", "Text 2", "Text 1"});
// ✖ Последний элемент не совпадает
await Expect(Page.Locator("ul > li")).ToHaveTextAsync(new string[] {"Text 1", "Text 2", "Text"});
// ✖ Локатор указывает на внешний элемент списка, а не на элементы списка
await Expect(Page.Locator("ul")).ToHaveTextAsync(new string[] {"Text 1", "Text 2", "Text 3"});
Аргументы
-
expected
string | Regex | IEnumerable<string> | IEnumerable<Regex> Добавлено в: v1.18#Ожидаемая строка или RegExp или список из них.
-
options
LocatorAssertionsToHaveTextOptions?
(опционально)-
IgnoreCase
bool? (опционально) Добавлено в: v1.23#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
. -
UseInnerText
bool? (опционально) Добавлено в: v1.18#Использовать ли
element.innerText
вместоelement.textContent
при получении текста DOM-узла.
-
Возвращает
Детали
Когда параметр expected
является строкой, Playwright нормализует пробелы и разрывы строк как в фактическом тексте, так и в ожидаемой строке перед сопоставлением. Когда используется регулярное выражение, фактический текст сопоставляется как есть.
ToHaveValueAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным значением ввода. Вы можете использовать регулярные выражения для значения.
Использование
var locator = Page.Locator("input[type=number]");
await Expect(locator).ToHaveValueAsync(new Regex("[0-9]"));
Аргументы
-
value
string | Regex Добавлено в: v1.18#Ожидаемое значение.
-
options
LocatorAssertionsToHaveValueOptions?
(опционально)-
Timeout
[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToHaveValuesAsync
Добавлено в: v1.23Убеждается, что Locator указывает на мультивыбор/комбобокс (т.е. select
с атрибутом multiple
) и указанные значения выбраны.
Использование
Например, учитывая следующий элемент:
<select id="favorite-colors" multiple>
<option value="R">Red</option>
<option value="G">Green</option>
<option value="B">Blue</option>
</select>
var locator = Page.Locator("id=favorite-colors");
await locator.SelectOptionAsync(new string[] { "R", "G" });
await Expect(locator).ToHaveValuesAsync(new Regex[] { new Regex("R"), new Regex("G") });
Аргументы
-
values
IEnumerable<string> | IEnumerable<Regex>#Ожидаемые в данный момент выбранные опции.
-
options
LocatorAssertionsToHaveValuesOptions?
(опционально)-
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
ToMatchAriaSnapshotAsync
Добавлено в: v1.49Утверждает, что целевой элемент соответствует заданному снимку доступности.
Использование
await page.GotoAsync("https://demo.playwright.dev/todomvc/");
await Expect(page.Locator("body")).ToMatchAriaSnapshotAsync(@"
- heading ""todos""
- textbox ""What needs to be done?""
");
Аргументы
expected
string#options
LocatorAssertionsToMatchAriaSnapshotOptions?
(опционально)-
Timeout
[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000
.
-
Возвращает
Свойства
Not
Добавлено в: v1.20Заставляет проверку утверждения для противоположного условия. Например, этот код проверяет, что Локатор не содержит текст "error"
:
await Expect(locator).Not.ToContainTextAsync("error");
Использование
Expect(Locator).Not
Тип