FrameLocator
FrameLocator представляет собой представление iframe на странице. Он содержит логику, необходимую для получения iframe и поиска элементов в этом iframe. FrameLocator можно создать с помощью метода locator.contentFrame(), page.frameLocator() или locator.frameLocator().
const locator = page.locator('#my-frame').contentFrame().getByText('Submit');
await locator.click(); Строгий режим
Локаторы фреймов работают в строгом режиме. Это означает, что любая операция с локатором фрейма завершится ошибкой, если указанному селектору соответствует более одного элемента.
// Throws if there are several frames in DOM:
await page.locator('.result-frame').contentFrame().getByRole('button').click();
// Works because we explicitly tell locator to pick the first frame:
await page.locator('.result-frame').contentFrame().first().getByRole('button').click(); Любой фрейм
Вызов page.frameLocator() или frame.frameLocator() без селектора создаёт локатор фрейма, который начинает поиск в любом фрейме поддерева, поэтому сначала искать iframe не нужно.
// Finds the button in any frame on the page:
await page.frameLocator().getByRole('button').click();
// Finds the iframe with id "my-frame" anywhere on the page, and clicks the button inside it:
await page.frameLocator().locator('#my-frame').contentFrame().getByRole('button').click(); Это влияет только на начало поиска: остальная часть локатора разрешается внутри одного фрейма, как и для любого другого локатора. Согласно приведённым выше правилам строгого режима, если элементы найдены в нескольких фреймах, будет выдана ошибка.
Такой локатор фрейма не указывает на определённый iframe, поэтому для него не поддерживаются методы frameLocator.owner(), frameLocator.first(), frameLocator.last() и frameLocator.nth().
Преобразование Locator в FrameLocator
Если у вас есть объект Locator, указывающий на iframe, его можно преобразовать в FrameLocator с помощью locator.contentFrame().
Преобразование FrameLocator в Locator
Если у вас есть объект FrameLocator, его можно преобразовать в Locator, указывающий на тот же iframe, с помощью frameLocator.owner().
Методы
frameLocator
При работе с iframe можно создать локатор фрейма, который перейдёт внутрь iframe и позволит выбирать элементы в нём.
Использование
frameLocator.frameLocator(selector);
Аргументы
-
selectorstringСелектор, используемый при поиске элемента DOM.
Возвращает
getByAltText
Позволяет находить элементы по тексту атрибута alt.
Использование
Например, этот метод найдёт изображение по тексту alt «Логотип Playwright»:
<img alt='Playwright logo'>
await page.getByAltText('Playwright logo').click(); Аргументы
-
Текст, по которому нужно найти элемент.
-
optionsObject (необязательно)-
exactboolean (необязательно)Искать ли точное совпадение: с учётом регистра и совпадающее со всей строкой. По умолчанию — false. Не учитывается при поиске по регулярному выражению. Обратите внимание: при точном совпадении пробелы всё равно обрезаются.
-
Возвращает
getByLabel
Позволяет находить элементы ввода по тексту связанного элемента <label> или aria-labelledby либо по атрибуту aria-label.
Использование
Например, этот метод найдёт поля ввода по меткам «Имя пользователя» и «Пароль» в следующей структуре DOM:
<input aria-label="Username"> <label for="password-input">Password:</label> <input id="password-input">
await page.getByLabel('Username').fill('john');
await page.getByLabel('Password').fill('secret'); Аргументы
-
Текст, по которому нужно найти элемент.
-
optionsObject (необязательно)-
exactboolean (необязательно)Искать ли точное совпадение: с учётом регистра и совпадающее со всей строкой. По умолчанию — false. Не учитывается при поиске по регулярному выражению. Обратите внимание: при точном совпадении пробелы всё равно обрезаются.
-
Возвращает
getByPlaceholder
Позволяет находить элементы ввода по тексту подсказки.
Использование
Например, рассмотрим следующую структуру DOM.
<input type="email" placeholder="name@example.com" />
Найдя элемент ввода по тексту подсказки, можно заполнить его:
await page
.getByPlaceholder('name@example.com')
.fill('playwright@microsoft.com'); Аргументы
-
Текст, по которому нужно найти элемент.
-
optionsObject (необязательно)-
exactboolean (необязательно)Искать ли точное совпадение: с учётом регистра и совпадающее со всей строкой. По умолчанию — false. Не учитывается при поиске по регулярному выражению. Обратите внимание: при точном совпадении пробелы всё равно обрезаются.
-
Возвращает
getByRole
Позволяет находить элементы по их роли ARIA, атрибутам ARIA и доступному имени.
Использование
Рассмотрим следующую структуру DOM.
<h3>Sign up</h3> <label> <input type="checkbox" /> Subscribe </label> <br/> <button>Submit</button>
Каждый элемент можно найти по его неявной роли:
await expect(page.getByRole('heading', { name: 'Sign up' })).toBeVisible();
await page.getByRole('checkbox', { name: 'Subscribe' }).check();
await page.getByRole('button', { name: /submit/i }).click(); Аргументы
-
role"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.
-
optionsObject (необязательно)-
checkedboolean (необязательно)Атрибут, который обычно задаётся элементами
aria-checkedили встроенными элементами управления<input type=checkbox>.Подробнее об атрибуте
aria-checked. -
descriptionstring | RegExp (необязательно)Параметр для сопоставления с доступным описанием. По умолчанию сопоставление не учитывает регистр и выполняется по подстроке; используйте параметр exact, чтобы изменить это поведение.
Подробнее о доступном описании.
-
disabledboolean (необязательно)Атрибут, который обычно задаётся элементом
aria-disabledилиdisabled.примечаниеВ отличие от большинства других атрибутов,
disabledнаследуется по иерархии DOM. Подробнее об атрибутеaria-disabled. -
exactboolean (необязательно)Определяет, должны ли имя и описание совпадать точно: с учётом регистра и со всей строкой. По умолчанию — false. Не учитывается, если значение является регулярным выражением. Обратите внимание: при точном совпадении пробелы всё равно обрезаются.
-
expandedboolean (необязательно)Атрибут, который обычно задаётся элементом
aria-expanded.Подробнее об атрибуте
aria-expanded. -
includeHiddenboolean (необязательно)Параметр, определяющий, будут ли находиться скрытые элементы. По умолчанию селектор ролей находит только видимые элементы — согласно определению ARIA.
Подробнее об атрибуте
aria-hidden. -
levelnumber (необязательно)Числовой атрибут, обычно присутствующий у ролей
heading,listitem,row,treeitem, со значениями по умолчанию для элементов<h1>-<h6>.Подробнее об атрибуте
aria-level. -
namestring | RegExp (необязательно)Параметр для сопоставления с доступным именем. По умолчанию сопоставление не учитывает регистр и выполняется по подстроке; используйте параметр exact, чтобы изменить это поведение.
Подробнее о доступном имени.
-
pressedboolean (необязательно)Атрибут, который обычно задаётся элементом
aria-pressed.Подробнее об атрибуте
aria-pressed. -
selectedboolean (необязательно)Атрибут, который обычно задаётся элементом
aria-selected.Подробнее об атрибуте
aria-selected.
-
Возвращает
Подробности
Селектор ролей не заменяет проверки доступности и тесты на соответствие стандартам, а лишь позволяет заранее получить обратную связь о соблюдении рекомендаций ARIA.
У многих элементов HTML есть неявная роль, распознаваемая селектором ролей. Список всех поддерживаемых ролей можно найти здесь. Рекомендации ARIA не рекомендуют дублировать неявные роли и атрибуты, задавая атрибутам role и/или aria-* значения по умолчанию.
getByTestId
Находит элемент по идентификатору теста.
Использование
Рассмотрим следующую структуру DOM.
<button data-testid="directions">Itinéraire</button>
Элемент можно найти по его идентификатору теста:
await page.getByTestId('directions').click(); Аргументы
Возвращает
Подробности
По умолчанию в качестве идентификатора теста используется атрибут data-testid. При необходимости используйте selectors.setTestIdAttribute(), чтобы настроить другой атрибут для идентификатора теста.
// Set custom test id attribute from @playwright/test config:
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
testIdAttribute: 'data-pw'
},
}); getByText
Позволяет находить элементы, содержащие заданный текст.
См. также locator.filter(), который позволяет сначала найти элементы по другому критерию, например по доступной роли, а затем отфильтровать их по текстовому содержимому.
Использование
Рассмотрим следующую структуру DOM:
<div>Hello <span>world</span></div> <div>Hello</div>
Поиск можно выполнить по части текста, точной строке или регулярному выражению:
// Matches <span>
page.getByText('world');
// Matches first <div>
page.getByText('Hello world');
// Matches second <div>
page.getByText('Hello', { exact: true });
// Matches both <div>s
page.getByText(/Hello/);
// Matches second <div>
page.getByText(/^hello$/i); Аргументы
-
Текст, по которому нужно найти элемент.
-
optionsObject (необязательно)-
exactboolean (необязательно)Искать ли точное совпадение: с учётом регистра и совпадающее со всей строкой. По умолчанию — false. Не учитывается при поиске по регулярному выражению. Обратите внимание: при точном совпадении пробелы всё равно обрезаются.
-
Возвращает
Подробности
При поиске по тексту пробелы всегда нормализуются, даже при точном совпадении. Например, несколько пробелов заменяются одним, переносы строк — пробелами, а пробелы в начале и конце строки игнорируются.
Элементы ввода типа button и submit находятся по их value, а не по текстовому содержимому. Например, поиск по тексту "Log in" находит <input type=button value="Log in">.
getByTitle
Позволяет находить элементы по атрибуту title.
Использование
Рассмотрим следующую структуру DOM.
<span title='Issues count'>25 issues</span>
После поиска по тексту атрибута title можно проверить количество проблем:
await expect(page.getByTitle('Issues count')).toHaveText('25 issues'); Аргументы
-
Текст, по которому нужно найти элемент.
-
optionsObject (необязательно)-
exactboolean (необязательно)Искать ли точное совпадение: с учётом регистра и совпадающее со всей строкой. По умолчанию — false. Не учитывается при поиске по регулярному выражению. Обратите внимание: при точном совпадении пробелы всё равно обрезаются.
-
Возвращает
locator
Метод находит элемент, соответствующий указанному селектору, в поддереве локатора. Он также принимает параметры фильтрации, аналогичные методу locator.filter().
Использование
frameLocator.locator(selectorOrLocator); frameLocator.locator(selectorOrLocator, options);
Аргументы
-
selectorOrLocatorstring | LocatorСелектор или локатор, используемый при поиске элемента DOM.
-
optionsObject (необязательно)-
hasLocator (необязательно)Ограничивает результаты метода элементами, содержащими элементы, соответствующие этому относительному локатору. Например,
article, содержащийtext=Playwright, соответствует<article><div>Playwright</div></article>.Внутренний локатор должен быть относительным к внешнему локатору; поиск выполняется начиная с совпадения внешнего локатора, а не с корня документа. Например, можно найти
content, содержащийdiv, в<article><content><div>Playwright</div></content></article>. Однако поискcontent, содержащегоarticle div, завершится неудачей, поскольку внутренний локатор должен быть относительным и не должен использовать элементы за пределамиcontent.Обратите внимание, что внешний и внутренний локаторы должны принадлежать одному фрейму. Внутренний локатор не должен содержать FrameLocator.
-
hasNotLocator (необязательно)Находит элементы, не содержащие элемент, соответствующий внутреннему локатору. Внутренний локатор проверяется относительно внешнего. Например,
article, не содержащийdiv, соответствует<article><span>Playwright</span></article>.Обратите внимание, что внешний и внутренний локаторы должны принадлежать одному фрейму. Внутренний локатор не должен содержать FrameLocator.
-
hasNotTextstring | RegExp (необязательно)Находит элементы, не содержащие указанный текст где-либо внутри, в том числе в дочернем или вложенном элементе. Если передана строка string, поиск подстроки не учитывает регистр.
-
hasTextstring | RegExp (необязательно)Находит элементы, содержащие указанный текст где-либо внутри, в том числе в дочернем или вложенном элементе. Если передана строка string, поиск подстроки не учитывает регистр. Например,
"Playwright"соответствует<article><div>Playwright</div></article>.
-
Возвращает
owner
Возвращает объект Locator, указывающий на тот же iframe, что и этот локатор фрейма.
Полезен, если вы получили объект FrameLocator в другом месте, а позже хотите взаимодействовать с элементом iframe.
Для обратного преобразования используйте locator.contentFrame().
Использование
const frameLocator = page.locator('iframe[name="embedded"]').contentFrame();
// ...
const locator = frameLocator.owner();
await expect(locator).toBeVisible(); Возвращает
Устаревшие методы
first
УстарелоВместо этого используйте locator.first(), а затем locator.contentFrame().
Возвращает локатор первого подходящего фрейма.
Использование
frameLocator.first();
Возвращает
last
УстарелоВместо этого используйте locator.last(), а затем locator.contentFrame().
Возвращает локатор последнего подходящего фрейма.
Использование
frameLocator.last();
Возвращает
nth
УстарелоВместо этого используйте locator.nth(), а затем locator.contentFrame().
Возвращает локатор n-го подходящего фрейма. Индексация начинается с нуля: nth(0) выбирает первый фрейм.
Использование
frameLocator.nth(index);
Аргументы
-
indexnumber
Возвращает
© 2026 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/api/class-framelocator