FrameLocator
FrameLocator представляет собой представление iframe
на странице. Он захватывает логику, достаточную для получения iframe
и поиска элементов в этом iframe. FrameLocator может быть создан с помощью методов Locator.ContentFrame, Page.FrameLocator() или Locator.FrameLocator().
var locator = page.Locator("#my-frame").ContentFrame.GetByText("Submit");
await locator.ClickAsync();
Строгость
Локаторы фреймов являются строгими. Это означает, что все операции с локаторами фреймов будут вызывать ошибку, если более одного элемента соответствует заданному селектору.
// Вызывает ошибку, если в DOM несколько фреймов:
await page.Locator(".result-frame").ContentFrame.GetByRole(AriaRole.Button).ClickAsync();
// Работает, потому что мы явно указываем локатору выбрать первый фрейм:
await page.Locator(".result-frame").First.ContentFrame.getByRole(AriaRole.Button).ClickAsync();
Преобразование Locator в FrameLocator
Если у вас есть объект Locator, указывающий на iframe
, его можно преобразовать в FrameLocator с помощью Locator.ContentFrame.
Преобразование FrameLocator в Locator
Если у вас есть объект FrameLocator, его можно преобразовать в Locator, указывающий на тот же iframe
, с помощью FrameLocator.Owner.
Методы
FrameLocator
Добавлено в: v1.17При работе с iframes вы можете создать локатор фрейма, который войдет в iframe и позволит выбирать элементы в этом iframe.
Использование
FrameLocator.FrameLocator(selector);
Аргументы
Возвращает
GetByAltText
Добавлено в: v1.27Позволяет находить элементы по их alt-тексту.
Использование
Например, этот метод найдет изображение по alt-тексту "Playwright logo":
<img alt='Playwright logo'>
await page.GetByAltText("Playwright logo").ClickAsync();
Аргументы
-
Текст для поиска элемента.
-
options
FrameLocatorGetByAltTextOptions?
(опционально)
Возвращает
GetByLabel
Добавлено в: v1.27Позволяет находить элементы ввода по тексту связанного элемента <label>
или элемента с aria-labelledby
, или по атрибуту aria-label
.
Использование
Например, этот метод найдет поля ввода по меткам "Username" и "Password" в следующем DOM:
<input aria-label="Username">
<label for="password-input">Password:</label>
<input id="password-input">
await page.GetByLabel("Username").FillAsync("john");
await page.GetByLabel("Password").FillAsync("secret");
Аргументы
-
Текст для поиска элемента.
-
options
FrameLocatorGetByLabelOptions?
(опционально)
Возвращает
GetByPlaceholder
Добавлено в: v1.27Позволяет находить элементы ввода по тексту-заполнителю.
Использование
Например, рассмотрим следующую структуру DOM.
<input type="email" placeholder="name@example.com" />
Вы можете заполнить поле ввода, найдя его по тексту-заполнителю:
await page
.GetByPlaceholder("name@example.com")
.FillAsync("playwright@microsoft.com");
Аргументы
-
Текст для поиска элемента.
-
options
FrameLocatorGetByPlaceholderOptions?
(опционально)
Возвращает
GetByRole
Добавлено в: v1.27Позволяет находить элементы по их ARIA роли, ARIA атрибутам и доступному имени.
Использование
Рассмотрим следующую структуру DOM.
<h3>Sign up</h3>
<label>
<input type="checkbox" /> Subscribe
</label>
<br/>
<button>Submit</button>
Вы можете найти каждый элемент по его неявной роли:
await Expect(Page
.GetByRole(AriaRole.Heading, new() { Name = "Sign up" }))
.ToBeVisibleAsync();
await page
.GetByRole(AriaRole.Checkbox, new() { Name = "Subscribe" })
.CheckAsync();
await page
.GetByRole(AriaRole.Button, new() {
NameRegex = new Regex("submit", RegexOptions.IgnoreCase)
})
.ClickAsync();
Аргументы
-
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
FrameLocatorGetByRoleOptions?
(опционально)-
Атрибут, который обычно устанавливается с помощью
aria-checked
или нативных<input type=checkbox>
контролов.Узнайте больше о
aria-checked
. -
Атрибут, который обычно устанавливается с помощью
aria-disabled
илиdisabled
.примечаниеВ отличие от большинства других атрибутов,
disabled
наследуется через иерархию DOM. Узнайте больше оaria-disabled
. -
Exact
bool? (опционально) Добавлено в: v1.28#Совпадает ли Name|NameRegex точно: с учетом регистра и всей строки. По умолчанию false. Игнорируется, когда Name|NameRegex является регулярным выражением. Обратите внимание, что точное совпадение все равно обрезает пробелы.
-
Атрибут, который обычно устанавливается с помощью
aria-expanded
.Узнайте больше о
aria-expanded
. -
IncludeHidden
bool? (опционально)#Опция, которая контролирует, соответствуют ли скрытые элементы. По умолчанию, только не скрытые элементы, как определено ARIA, соответствуют селектору роли.
Узнайте больше о
aria-hidden
. -
Числовой атрибут, который обычно присутствует для ролей
heading
,listitem
,row
,treeitem
, с значениями по умолчанию для элементов<h1>-<h6>
.Узнайте больше о
aria-level
. -
Name|NameRegex
string? | Regex? (опционально)#Опция для соответствия доступному имени. По умолчанию, соответствие не учитывает регистр и ищет подстроку, используйте Exact для управления этим поведением.
Узнайте больше о доступном имени.
-
Атрибут, который обычно устанавливается с помощью
aria-pressed
.Узнайте больше о
aria-pressed
. -
Атрибут, который обычно устанавливается с помощью
aria-selected
.Узнайте больше о
aria-selected
.
-
Возвращает
Детали
Селектор роли не заменяет аудиты доступности и тесты на соответствие, но дает раннюю обратную связь о рекомендациях ARIA.
Многие HTML-элементы имеют неявно определенную роль, которая распознается селектором роли. Вы можете найти все поддерживаемые роли здесь. Рекомендации ARIA не рекомендуют дублировать неявные роли и атрибуты, устанавливая role
и/или aria-*
атрибуты на значения по умолчанию.
GetByTestId
Добавлено в: v1.27Находит элемент по тестовому идентификатору.
Использование
Рассмотрим следующую структуру DOM.
<button data-testid="directions">Itinéraire</button>
Вы можете найти элемент по его тестовому идентификатору:
await page.GetByTestId("directions").ClickAsync();
Аргументы
Возвращает
Детали
По умолчанию атрибут data-testid
используется как тестовый идентификатор. Используйте Selectors.SetTestIdAttribute(), чтобы настроить другой атрибут тестового идентификатора, если это необходимо.
GetByText
Добавлено в: v1.27Позволяет находить элементы, содержащие заданный текст.
Смотрите также Locator.Filter(), который позволяет сопоставлять по другим критериям, таким как доступная роль, а затем фильтровать по текстовому содержимому.
Использование
Рассмотрим следующую структуру DOM:
<div>Hello <span>world</span></div>
<div>Hello</div>
Вы можете найти по подстроке текста, точной строке или регулярному выражению:
// Соответствует <span>
page.GetByText("world");
// Соответствует первому <div>
page.GetByText("Hello world");
// Соответствует второму <div>
page.GetByText("Hello", new() { Exact = true });
// Соответствует обоим <div>
page.GetByText(new Regex("Hello"));
// Соответствует второму <div>
page.GetByText(new Regex("^hello$", RegexOptions.IgnoreCase));
Аргументы
-
Текст для поиска элемента.
-
options
FrameLocatorGetByTextOptions?
(опционально)
Возвращает
Детали
Сопоставление по тексту всегда нормализует пробелы, даже при точном совпадении. Например, оно превращает несколько пробелов в один, превращает разрывы строк в пробелы и игнорирует начальные и конечные пробелы.
Элементы ввода типа button
и submit
сопоставляются по их value
, а не по текстовому содержимому. Например, поиск по тексту "Log in"
соответствует <input type=button value="Log in">
.
GetByTitle
Добавлено в: v1.27Позволяет находить элементы по их атрибуту title.
Использование
Рассмотрим следующую структуру DOM.
<span title='Issues count'>25 issues</span>
Вы можете проверить количество проблем, найдя его по тексту заголовка:
await Expect(Page.GetByTitle("Issues count")).toHaveText("25 issues");
Аргументы
-
Текст для поиска элемента.
-
options
FrameLocatorGetByTitleOptions?
(опционально)
Возвращает
Locator
Добавлено в: v1.17Метод находит элемент, соответствующий указанному селектору в поддереве локатора. Он также принимает параметры фильтрации, аналогичные методу Locator.Filter().
Использование
FrameLocator.Locator(selectorOrLocator, options);
Аргументы
-
selectorOrLocator
string | Locator#Селектор или локатор для использования при разрешении элемента DOM.
-
options
FrameLocatorLocatorOptions?
(опционально)-
Сужает результаты метода до тех, которые содержат элементы, соответствующие этому относительному локатору. Например,
article
, который имеетtext=Playwright
, соответствует<article><div>Playwright</div></article>
.Внутренний локатор должен быть относительным к внешнему локатору и запрашивается, начиная с совпадения внешнего локатора, а не с корня документа. Например, вы можете найти
content
, который имеетdiv
в<article><content><div>Playwright</div></content></article>
. Однако поискcontent
, который имеетarticle div
, не удастся, потому что внутренний локатор должен быть относительным и не должен использовать элементы за пределамиcontent
.Обратите внимание, что внешние и внутренние локаторы должны принадлежать одному и тому же фрейму. Внутренний локатор не должен содержать FrameLocators.
-
HasNot
Locator? (опционально) Добавлено в: v1.33#Соответствует элементам, которые не содержат элемента, соответствующего внутреннему локатору. Внутренний локатор запрашивается относительно внешнего. Например,
article
, который не имеетdiv
, соответствует<article><span>Playwright</span></article>
.Обратите внимание, что внешние и внутренние локаторы должны принадлежать одному и тому же фрейму. Внутренний локатор не должен содержать FrameLocators.
-
HasNotText|HasNotTextRegex
string? | Regex? (опционально) Добавлено в: v1.33#Соответствует элементам, которые не содержат указанный текст где-либо внутри, возможно, в дочернем или потомке. При передаче string соответствие не учитывает регистр и ищет подстроку.
-
HasText|HasTextRegex
string? | Regex? (опционально)#Соответствует элементам, содержащим указанный текст где-либо внутри, возможно, в дочернем или потомке. При передаче string соответствие не учитывает регистр и ищет подстроку. Например,
"Playwright"
соответствует<article><div>Playwright</div></article>
.
-
Возвращает
Owner
Добавлено в: v1.43Возвращает объект Locator, указывающий на тот же iframe
, что и этот локатор фрейма.
Полезно, когда у вас есть объект FrameLocator, полученный где-то, и позже вы хотите взаимодействовать с элементом iframe
.
Для обратной операции используйте Locator.ContentFrame.
Использование
var frameLocator = Page.Locator("iframe[name=\"embedded\"]").ContentFrame;
// ...
var locator = frameLocator.Owner;
await Expect(locator).ToBeVisibleAsync();
Возвращает
Устаревшие
First
Добавлено в: v1.17Используйте Locator.First, а затем Locator.ContentFrame вместо этого.
Возвращает локатор к первому совпадающему фрейму.
Использование
FrameLocator.First
Возвращает
Last
Добавлено в: v1.17Используйте Locator.Last, а затем Locator.ContentFrame вместо этого.
Возвращает локатор к последнему совпадающему фрейму.
Использование
FrameLocator.Last
Возвращает
Nth
Добавлено в: v1.17Используйте Locator.Nth(), а затем Locator.ContentFrame вместо этого.
Возвращает локатор к n-му совпадающему фрейму. Нумерация начинается с нуля, nth(0)
выбирает первый фрейм.
Использование
FrameLocator.Nth(index);
Аргументы
Возвращает