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();
Аргументы
optionsLocatorAssertionsToBeAttachedOptions?(опционально)
Возвращает
ToBeCheckedAsync
Добавлено в: v1.20Убеждается, что Locator указывает на отмеченный элемент ввода.
Использование
var locator = Page.GetByLabel("Subscribe to newsletter");
await Expect(locator).ToBeCheckedAsync();
Аргументы
optionsLocatorAssertionsToBeCheckedOptions?(опционально)-
Checkedbool? (опционально) Добавлено в: v1.18#Предоставляет состояние для утверждения. По умолчанию утверждает, что элемент ввода отмечен. Эта опция не может быть использована, когда Indeterminate установлена в true.
-
Indeterminatebool? (опционально) Добавлено в: 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();
Аргументы
optionsLocatorAssertionsToBeDisabledOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToBeEditableAsync
Добавлено в: v1.20Убеждается, что Locator указывает на редактируемый элемент.
Использование
var locator = Page.GetByRole(AriaRole.Textbox);
await Expect(locator).ToBeEditableAsync();
Аргументы
optionsLocatorAssertionsToBeEditableOptions?(опционально)
Возвращает
ToBeEmptyAsync
Добавлено в: v1.20Убеждается, что Locator указывает на пустой редактируемый элемент или на DOM-узел, который не содержит текста.
Использование
var locator = Page.Locator("div.warning");
await Expect(locator).ToBeEmptyAsync();
Аргументы
optionsLocatorAssertionsToBeEmptyOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToBeEnabledAsync
Добавлено в: v1.20Убеждается, что Locator указывает на включенный элемент.
Использование
var locator = Page.Locator("button.submit");
await Expect(locator).ToBeEnabledAsync();
Аргументы
optionsLocatorAssertionsToBeEnabledOptions?(опционально)
Возвращает
ToBeFocusedAsync
Добавлено в: v1.20Убеждается, что Locator указывает на сфокусированный DOM-узел.
Использование
var locator = Page.GetByRole(AriaRole.Textbox);
await Expect(locator).ToBeFocusedAsync();
Аргументы
optionsLocatorAssertionsToBeFocusedOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToBeHiddenAsync
Добавлено в: v1.20Убеждается, что Locator либо не разрешается ни в один DOM-узел, либо разрешается в невидимый узел.
Использование
var locator = Page.Locator(".my-element");
await Expect(locator).ToBeHiddenAsync();
Аргументы
optionsLocatorAssertionsToBeHiddenOptions?(опционально)-
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 });
Аргументы
optionsLocatorAssertionsToBeInViewportOptions?(опционально)-
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();
Аргументы
optionsLocatorAssertionsToBeVisibleOptions?(опционально)
Возвращает
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"});
Аргументы
-
expectedstring | Regex | IEnumerable<string> | IEnumerable<Regex> Добавлено в: v1.18#Ожидаемая подстрока или RegExp или список из них.
-
optionsLocatorAssertionsToContainTextOptions?(опционально)-
IgnoreCasebool? (опционально) Добавлено в: v1.23#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000. -
UseInnerTextbool? (опционально) Добавлено в: 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");
Аргументы
-
Ожидаемое доступное описание.
-
optionsLocatorAssertionsToHaveAccessibleDescriptionOptions?(опционально)-
IgnoreCasebool? (опционально)#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveAccessibleErrorMessageAsync
Добавлено в: v1.50Убеждается, что Locator указывает на элемент с заданным сообщением об ошибке aria.
Использование
var locator = Page.GetByTestId("username-input");
await Expect(locator).ToHaveAccessibleErrorMessageAsync("Username is required.");
Аргументы
-
Ожидаемое доступное сообщение об ошибке.
-
optionsLocatorAssertionsToHaveAccessibleErrorMessageOptions?(опционально)-
IgnoreCasebool? (опционально)#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveAccessibleNameAsync
Добавлено в: v1.44Убеждается, что Locator указывает на элемент с заданным доступным именем.
Использование
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveAccessibleNameAsync("Save to disk");
Аргументы
-
Ожидаемое доступное имя.
-
optionsLocatorAssertionsToHaveAccessibleNameOptions?(опционально)-
IgnoreCasebool? (опционально)#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveAttributeAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным атрибутом.
Использование
var locator = Page.Locator("input");
await Expect(locator).ToHaveAttributeAsync("type", "text");
Аргументы
-
namestring Добавлено в: v1.18#Имя атрибута.
-
valuestring | Regex Добавлено в: v1.18#Ожидаемое значение атрибута.
-
optionsLocatorAssertionsToHaveAttributeOptions?(опционально)-
IgnoreCasebool? (опционально) Добавлено в: 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"});
Аргументы
-
expectedstring | Regex | IEnumerable<string> | IEnumerable<Regex> Добавлено в: v1.18#Ожидаемый класс или RegExp или список из них.
-
optionsLocatorAssertionsToHaveClassOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveCountAsync
Добавлено в: v1.20Убеждается, что Locator разрешается в точное количество DOM-узлов.
Использование
var locator = Page.Locator("list > .component");
await Expect(locator).ToHaveCountAsync(3);
Аргументы
-
Ожидаемое количество.
-
optionsLocatorAssertionsToHaveCountOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveCSSAsync
Добавлено в: v1.20Убеждается, что Locator разрешается в элемент с заданным вычисленным стилем CSS.
Использование
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveCSSAsync("display", "flex");
Аргументы
-
namestring Добавлено в: v1.18#Имя CSS-свойства.
-
valuestring | Regex Добавлено в: v1.18#Значение CSS-свойства.
-
optionsLocatorAssertionsToHaveCSSOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveIdAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным ID DOM-узла.
Использование
var locator = Page.GetByRole(AriaRole.Textbox);
await Expect(locator).ToHaveIdAsync("lastname");
Аргументы
-
idstring | Regex Добавлено в: v1.18#ID элемента.
-
optionsLocatorAssertionsToHaveIdOptions?(опционально)-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
ToHaveJSPropertyAsync
Добавлено в: v1.20Убеждается, что Locator указывает на элемент с заданным свойством JavaScript. Обратите внимание, что это свойство может быть как примитивного типа, так и простым сериализуемым объектом JavaScript.
Использование
var locator = Page.Locator(".component");
await Expect(locator).ToHaveJSPropertyAsync("loaded", true);
Аргументы
-
namestring Добавлено в: v1.18#Имя свойства.
-
value[object] Добавлено в: v1.18#Значение свойства.
-
optionsLocatorAssertionsToHaveJSPropertyOptions?(опционально)-
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);
Аргументы
-
roleenum 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.
-
optionsLocatorAssertionsToHaveRoleOptions?(опционально)-
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"});
Аргументы
-
expectedstring | Regex | IEnumerable<string> | IEnumerable<Regex> Добавлено в: v1.18#Ожидаемая строка или RegExp или список из них.
-
optionsLocatorAssertionsToHaveTextOptions?(опционально)-
IgnoreCasebool? (опционально) Добавлено в: v1.23#Выполнять ли сопоставление без учета регистра. Опция IgnoreCase имеет приоритет над соответствующим флагом регулярного выражения, если он указан.
-
Timeout[float]? (опционально) Добавлено в: v1.18#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000. -
UseInnerTextbool? (опционально) Добавлено в: 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]"));
Аргументы
-
valuestring | Regex Добавлено в: v1.18#Ожидаемое значение.
-
optionsLocatorAssertionsToHaveValueOptions?(опционально)-
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") });
Аргументы
-
valuesIEnumerable<string> | IEnumerable<Regex>#Ожидаемые в данный момент выбранные опции.
-
optionsLocatorAssertionsToHaveValuesOptions?(опционально)-
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?""
");
Аргументы
expectedstring#optionsLocatorAssertionsToMatchAriaSnapshotOptions?(опционально)-
Timeout[float]? (опционально)#Время для повторной попытки утверждения в миллисекундах. По умолчанию
5000.
-
Возвращает
Свойства
Not
Добавлено в: v1.20Заставляет проверку утверждения для противоположного условия. Например, этот код проверяет, что Локатор не содержит текст "error":
await Expect(locator).Not.ToContainTextAsync("error");
Использование
Expect(Locator).Not
Тип