Skip to main content

Frame

在任何时候,页面都通过 page.mainFrame()frame.childFrames() 方法公开其当前的帧树。

[Frame] 对象的生命周期由页面对象上分发的三个事件控制:

转储帧树的示例:

const { firefox } = require('playwright');  // Or 'chromium' or 'webkit'.

(async () => {
const browser = await firefox.launch();
const page = await browser.newPage();
await page.goto('https://www.google.com/chrome/browser/canary.html');
dumpFrameTree(page.mainFrame(), '');
await browser.close();

function dumpFrameTree(frame, indent) {
console.log(indent + frame.url());
for (const child of frame.childFrames()) {
dumpFrameTree(child, indent + ' ');
}
}
})();

frame.$(selector[, options])

Added in: v1.9
  • selector <[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
  • returns: <[Promise]<[null]|[ElementHandle]>>#

返回指向帧元素的 ElementHandle。

caution

不鼓励使用 [ElementHandle],请改用 [Locator] 对象和 web-first 断言。

该方法在帧中查找与指定选择器匹配的元素。有关更多详细信息,请参阅 使用选择器。如果没有元素匹配选择器,则返回 null

frame.$$(selector)

Added in: v1.9
  • selector <[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器#
  • returns: <[Promise]<[Array]<[ElementHandle]>>>#

返回指向帧元素的 ElementHandle。

caution

不鼓励使用 [ElementHandle],请改用 [Locator] 对象。

该方法在帧中查找与指定选择器匹配的所有元素。有关更多详细信息,请参阅 使用选择器。如果没有元素匹配选择器,则返回空数组。

frame.$eval(selector, pageFunction[, arg, options])

Added in: v1.9
  • selector <[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器#
  • pageFunction <[function]([Element])> 在页面上下文中评估的函数。#
  • arg? <[EvaluationArgument]> 传递给 pageFunction 的可选参数。#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
  • returns: <[Promise]<[Serializable]>>#

返回 pageFunction 的返回值。

caution

此方法不等待元素通过 actionability 检查,因此可能导致不稳定的测试。请改用 locator.evaluate(pageFunction[, arg, options])、其他 [Locator] 辅助方法或 web-first 断言。

该方法在帧中查找与指定选择器匹配的元素,并将其作为第一个参数传递给 pageFunction。有关更多详细信息,请参阅 使用选择器。如果没有元素匹配选择器,该方法将抛出错误。

如果 pageFunction 返回 [Promise],则 frame.$eval(selector, pageFunction[, arg, options]) 将等待 promise 解析并返回其值。

示例:

const searchValue = await frame.$eval('#search', el => el.value);
const preloadHref = await frame.$eval('link[rel=preload]', el => el.href);
const html = await frame.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');

frame.$$eval(selector, pageFunction[, arg])

Added in: v1.9
  • selector <[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器#
  • pageFunction <[function]([Array]<[Element]>)> 在页面上下文中评估的函数。#
  • arg? <[EvaluationArgument]> 传递给 pageFunction 的可选参数。#
  • returns: <[Promise]<[Serializable]>>#

返回 pageFunction 的返回值。

note

在大多数情况下,locator.evaluateAll(pageFunction[, arg])、其他 [Locator] 辅助方法和 web-first 断言效果更好。

该方法在帧中查找与指定选择器匹配的所有元素,并将匹配元素的数组作为第一个参数传递给 pageFunction。有关更多详细信息,请参阅 使用选择器

如果 pageFunction 返回 [Promise],则 frame.$$eval(selector, pageFunction[, arg]) 将等待 promise 解析并返回其值。

示例:

const divsCounts = await frame.$$eval('div', (divs, min) => divs.length >= min, 10);

frame.addScriptTag([options])

Added in: v1.8
  • options? <[Object]>
    • content? <[string]> 要注入帧的原始 JavaScript 内容。#
    • path? <[string]> 要注入帧的 JavaScript 文件的路径。如果 path 是相对路径,则相对于当前工作目录进行解析。#
    • type? <[string]> 脚本类型。使用 'module' 以加载 Javascript ES6 模块。有关更多详细信息,请参阅 script#
    • url? <[string]> 要添加的脚本的 URL。#
  • returns: <[Promise]<[ElementHandle]>>#

当脚本的 onload 触发或脚本内容注入帧时,返回添加的标签。

将具有所需 url 或内容的 <script> 标签添加到页面中。

frame.addStyleTag([options])

Added in: v1.8
  • options? <[Object]>
    • content? <[string]> 要注入帧的原始 CSS 内容。#
    • path? <[string]> 要注入帧的 CSS 文件的路径。如果 path 是相对路径,则相对于当前工作目录进行解析。#
    • url? <[string]> <link> 标签的 URL。#
  • returns: <[Promise]<[ElementHandle]>>#

当样式表的 onload 触发或 CSS 内容注入帧时,返回添加的标签。

将具有所需 url 的 <link rel="stylesheet"> 标签或具有内容的 <style type="text/css"> 标签添加到页面中。

frame.check(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索元素的选​​择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 actionability 检查。默认为 false#
    • noWaitAfter? <[boolean]> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为 false#
    • position? <[Object]> 相对于元素填充框左上角的点。如果未指定,则使用元素的某个可见点。 Added in: v1.11#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 最长等待时间(以毫秒为单位),默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 actionability 检查并跳过操作。默认为 false。用于等待元素准备好进行操作而不执行操作。Added in: v1.11#
  • returns: <[Promise]<[void]>>#

此方法通过执行以下步骤来选中匹配 selector 的元素:

  1. 查找匹配 selector 的元素。如果没有,等待直到匹配的元素附加到 DOM。
  2. 确保匹配的元素是复选框或单选输入。如果不是,此方法将抛出错误。如果元素已选中,此方法将立即返回。
  3. 等待匹配元素上的 actionability 检查,除非设置了 force 选项。如果在检查期间元素分离,则重试整个操作。
  4. 如果需要,将元素滚动到视图中。
  5. 使用 page.mouse 单击元素的中心。
  6. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。
  7. 确保元素现在已选中。如果不是,此方法将抛出错误。

如果所有步骤在指定的 timeout 期间未完成,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。

frame.childFrames()

Added in: v1.8
  • returns: <[Array]<[Frame]>>#

frame.click(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索元素的选​​择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • button? <"left"|"right"|"middle"> 默认为 left#
    • clickCount? <[number]> 默认为 1。请参阅 [UIEvent.detail]#
    • delay? <[number]> mousedownmouseup 之间等待的时间(以毫秒为单位)。默认为 0。#
    • force? <[boolean]> 是否绕过 actionability 检查。默认为 false#
    • modifiers? <[Array]<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#
    • noWaitAfter? <[boolean]> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为 false#
    • position? <[Object]> 相对于元素填充框左上角的点。如果未指定,则使用元素的某个可见点。#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 最长等待时间(以毫秒为单位),默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 actionability 检查并跳过操作。默认为 false。用于等待元素准备好进行操作而不执行操作。Added in: v1.11#
  • returns: <[Promise]<[void]>>#

此方法通过执行以下步骤单击匹配 selector 的元素:

  1. 查找匹配 selector 的元素。如果没有,等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素上的 actionability 检查,除非设置了 force 选项。如果在检查期间元素分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.mouse 单击元素的中心,或指定的 position
  5. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。

如果所有步骤在指定的 timeout 期间未完成,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。

frame.content()

Added in: v1.8
  • returns: <[Promise]<[string]>>#

获取帧的完整 HTML 内容,包括 doctype。

frame.dblclick(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索元素的选​​择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • button? <"left"|"right"|"middle"> 默认为 left#
    • delay? <[number]> mousedownmouseup 之间等待的时间(以毫秒为单位)。默认为 0。#
    • force? <[boolean]> 是否绕过 actionability 检查。默认为 false#
    • modifiers? <[Array]<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#
    • noWaitAfter? <[boolean]> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为 false#
    • position? <[Object]> 相对于元素填充框左上角的点。如果未指定,则使用元素的某个可见点。#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 最长等待时间(以毫秒为单位),默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 actionability 检查并跳过操作。默认为 false。用于等待元素准备好进行操作而不执行操作。Added in: v1.11#
  • returns: <[Promise]<[void]>>#

此方法通过执行以下步骤双击匹配 selector 的元素:

  1. 查找匹配 selector 的元素。如果没有,等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素上的 actionability 检查,除非设置了 force 选项。如果在检查期间元素分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.mouse 双击元素的中心,或指定的 position
  5. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。注意,如果 dblclick() 的第一次单击触发了导航事件,此方法将抛出错误。

如果所有步骤在指定的 timeout 期间未完成,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。

note

frame.dblclick() 分发两个 click 事件和一个 dblclick 事件。

frame.dispatchEvent(selector, type[, eventInit, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • type <[string]> DOM 事件类型:"click""dragstart" 等。#
  • eventInit? <[EvaluationArgument]> 可选的事件特定初始化属性。#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[void]>>#

下面的代码片段在元素上分派 click 事件。无论元素的可见性状态如何,都会分派 click。这相当于调用 element.click()

await frame.dispatchEvent('button#submit', 'click');

在底层,它根据给定的 type 创建一个事件实例,使用 eventInit 属性对其进行初始化,并在元素上分派它。事件默认是 composedcancelable 和冒泡的。

由于 eventInit 是特定于事件的,请参阅事件文档以获取初始属性列表:

如果希望将活动对象传递给事件,也可以将 JSHandle 指定为属性值:

// Note you can only create DataTransfer in Chromium and Firefox
const dataTransfer = await frame.evaluateHandle(() => new DataTransfer());
await frame.dispatchEvent('#source', 'dragstart', { dataTransfer });

frame.dragAndDrop(source, target[, options])

Added in: v1.13
  • source <[string]> 要搜索的拖动元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • target <[string]> 要搜索的放置元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 可操作性 检查。默认为 false#
    • noWaitAfter? <[boolean]> 启动导航的操作正在等待这些导航发生并等待页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为 false#
    • sourcePosition? <[Object]> 点击相对于元素填充框左上角的源元素上的此点。如果未指定,则使用元素的某个可见点。Added in: v1.14#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • targetPosition? <[Object]> 放置在相对于元素填充框左上角的目标元素上的此点。如果未指定,则使用元素的某个可见点。Added in: v1.14#
      • x <[number]>
      • y <[number]>
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 可操作性 检查并跳过操作。默认为 false。用于等待元素准备好操作而不执行它。#
  • returns: <[Promise]<[void]>>#

frame.evaluate(pageFunction[, arg])

Added in: v1.8
  • pageFunction <[function]|[string]> 要在页面上下文中评估的函数。#
  • arg? <[EvaluationArgument]> 传递给 pageFunction 的可选参数。#
  • returns: <[Promise]<[Serializable]>>#

返回 pageFunction 的返回值。

如果传递给 frame.evaluate(pageFunction[, arg]) 的函数返回 [Promise],则 frame.evaluate(pageFunction[, arg]) 将等待 promise 解析并返回其值。

如果传递给 frame.evaluate(pageFunction[, arg]) 的函数返回非 [Serializable] 值,则 frame.evaluate(pageFunction[, arg]) 返回 undefined。Playwright 还支持传输一些 JSON 无法序列化的附加值:-0NaNInfinity-Infinity

const result = await frame.evaluate(([x, y]) => {
return Promise.resolve(x * y);
}, [7, 8]);
console.log(result); // prints "56"

也可以传递字符串而不是函数。

console.log(await frame.evaluate('1 + 2')); // prints "3"

[ElementHandle] 实例可以作为参数传递给 frame.evaluate(pageFunction[, arg])

const bodyHandle = await frame.evaluate('document.body');
const html = await frame.evaluate(([body, suffix]) => body.innerHTML + suffix, [bodyHandle, 'hello']);
await bodyHandle.dispose();

frame.evaluateHandle(pageFunction[, arg])

Added in: v1.8
  • pageFunction <[function]|[string]> 要在页面上下文中评估的函数。#
  • arg? <[EvaluationArgument]> 传递给 pageFunction 的可选参数。#
  • returns: <[Promise]<[JSHandle]>>#

pageFunction 的返回值作为 [JSHandle] 返回。

frame.evaluate(pageFunction[, arg])frame.evaluateHandle(pageFunction[, arg]) 之间的唯一区别是 frame.evaluateHandle(pageFunction[, arg]) 返回 [JSHandle]

如果传递给 frame.evaluateHandle(pageFunction[, arg]) 的函数返回 [Promise],则 frame.evaluateHandle(pageFunction[, arg]) 将等待 promise 解析并返回其值。

const aWindowHandle = await frame.evaluateHandle(() => Promise.resolve(window));
aWindowHandle; // Handle for the window object.

也可以传递字符串而不是函数。

const aHandle = await frame.evaluateHandle('document'); // Handle for the 'document'.

[JSHandle] 实例可以作为参数传递给 frame.evaluateHandle(pageFunction[, arg])

const aHandle = await frame.evaluateHandle(() => document.body);
const resultHandle = await frame.evaluateHandle(([body, suffix]) => body.innerHTML + suffix, [aHandle, 'hello']);
console.log(await resultHandle.jsonValue());
await resultHandle.dispose();

frame.fill(selector, value[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • value <[string]> 要填充到 <input><textarea>[contenteditable] 元素的值。#
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 可操作性 检查。默认为 false#
    • noWaitAfter? <[boolean]> 启动导航的操作正在等待这些导航发生并等待页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为 false#
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[void]>>#

此方法等待匹配 selector 的元素,等待 可操作性 检查,聚焦元素,填充它并在填充后触发 input 事件。请注意,您可以传递一个空字符串来清除输入字段。

如果目标元素不是 <input><textarea>[contenteditable] 元素,此方法将抛出错误。但是,如果元素位于具有关联 control<label> 元素内,则将填充该控件。

要发送细粒度的键盘事件,请使用 frame.type(selector, text[, options])

frame.focus(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[void]>>#

此方法获取带有 selector 的元素并聚焦它。如果没有匹配 selector 的元素,该方法将等待直到匹配的元素出现在 DOM 中。

frame.frameElement()

Added in: v1.8
  • returns: <[Promise]<[ElementHandle]>>#

返回对应于此帧的 frameiframe 元素句柄。

这是 elementHandle.contentFrame() 的逆操作。请注意,返回的句柄实际上属于父帧。

如果帧在 frameElement() 返回之前已分离,则此方法将抛出错误。

const frameElement = await frame.frameElement();
const contentFrame = await frameElement.contentFrame();
console.log(frame === contentFrame); // -> true

frame.frameLocator(selector)

Added in: v1.17
  • selector <[string]> 解析 DOM 元素时使用的选择器。有关更多详细信息,请参阅 使用选择器#
  • returns: <[FrameLocator]>#

处理 iframe 时,您可以创建一个帧定位器,该定位器将进入 iframe 并允许在该 iframe 中选择元素。以下代码片段在 id 为 my-frame 的 iframe 中定位文本为 "Submit" 的元素,如 <iframe id="my-frame">

const locator = frame.frameLocator('#my-iframe').getByText('Submit');
await locator.click();

frame.getAttribute(selector, name[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • name <[string]> 要获取值的属性名称。#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[null]|[string]>>#

返回元素属性值。

frame.getByAltText(text[, options])

Added in: v1.27
  • text <[string]|[RegExp]> 要定位元素的文本。#
  • options? <[Object]>
    • exact? <[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
  • returns: <[Locator]>#

允许通过其替代文本定位元素。例如,此方法将通过替代文本 "Castle" 找到图像:

<img alt='Castle'>

frame.getByLabel(text[, options])

Added in: v1.27
  • text <[string]|[RegExp]> 要定位元素的文本。#
  • options? <[Object]>
    • exact? <[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
  • returns: <[Locator]>#

允许通过关联标签的文本定位输入元素。例如,此方法将在以下 DOM 中通过标签文本 Password 找到输入:

<label for="password-input">Password:</label>
<input id="password-input">

frame.getByPlaceholder(text[, options])

Added in: v1.27
  • text <[string]|[RegExp]> 要定位元素的文本。#
  • options? <[Object]>
    • exact? <[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
  • returns: <[Locator]>#

允许通过占位符文本定位输入元素。例如,此方法将通过占位符 "Country" 找到输入:

<input placeholder="Country">

frame.getByRole(role[, options])

Added in: v1.27
  • 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 角色。#

  • options? <[Object]>

    • checked? <[boolean]> 通常由 aria-checked 或原生 <input type=checkbox> 控件设置的属性。checked 的可用值为 truefalse"mixed"#

      了解有关 aria-checked 的更多信息。

    • disabled? <[boolean]> 通常由 aria-disableddisabled 设置的布尔属性。#

      note

      与大多数其他属性不同,disabled 是通过 DOM 层次结构继承的。了解有关 aria-disabled 的更多信息。

    • expanded? <[boolean]> 通常由 aria-expanded 设置的布尔属性。#

      了解有关 aria-expanded 的更多信息。

    • includeHidden? <[boolean]> 一个布尔属性,控制是否匹配隐藏元素。默认情况下,只有非隐藏元素(如 ARIA 定义)才会被角色选择器匹配。#

      了解有关 aria-hidden 的更多信息。

    • level? <[number]> 通常出现在角色 headinglistitemrowtreeitem 中的数字属性,对于 <h1>-<h6> 元素具有默认值。#

      了解有关 aria-level 的更多信息。

    • name? <[string]|[RegExp]> 匹配 可访问名称 的字符串属性。#

      了解有关 可访问名称 的更多信息。

    • pressed? <[boolean]> 通常由 aria-pressed 设置的属性。pressed 的可用值为 truefalse"mixed"#

      了解有关 aria-pressed 的更多信息。

    • selected? <[boolean]> 通常由 aria-selected 设置的布尔属性。#

      了解有关 aria-selected 的更多信息。

  • returns: <[Locator]>#

允许通过其 ARIA 角色ARIA 属性可访问名称 定位元素。请注意,角色选择器 不替代 可访问性审核和一致性测试,而是提供有关 ARIA 准则的早期反馈。

请注意,许多 html 元素具有由角色选择器识别的隐式 定义角色。您可以在此处找到所有 支持的角色。ARIA 准则 不建议 通过将 role 和/或 aria-* 属性设置为默认值来重复隐式角色和属性。

frame.getByTestId(testId)

Added in: v1.27
  • testId <[string]> 要定位元素的 ID。#
  • returns: <[Locator]>#

通过测试 ID 定位元素。默认情况下,使用 data-testid 属性作为测试 ID。如有必要,请使用 selectors.setTestIdAttribute(attributeName) 配置不同的测试 ID 属性。

frame.getByText(text[, options])

Added in: v1.27
  • text <[string]|[RegExp]> 要定位元素的文本。#
  • options? <[Object]>
    • exact? <[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
  • returns: <[Locator]>#

允许定位包含给定文本的元素。考虑以下 DOM 结构:

<div>Hello <span>world</span></div>
<div>Hello</div>

您可以按文本子字符串、精确字符串或正则表达式进行定位:

// 匹配 <span>
page.getByText('world')

// 匹配第一个 <div>
page.getByText('Hello world')

// 匹配第二个 <div>
page.getByText('Hello', { exact: true })

// 匹配两个 <div>
page.getByText(/Hello/)

// 匹配第二个 <div>
page.getByText(/^hello$/i)

另请参阅 locator.filter([options]),它允许按其他条件(如可访问角色)进行匹配,然后按文本内容进行过滤。

note

按文本匹配始终规范化空格,即使是精确匹配也是如此。例如,它将多个空格转换为一个,将换行符转换为空格,并忽略前导和尾随空格。

note

类型为 buttonsubmit 的输入元素通过其 value 而不是文本内容进行匹配。例如,按文本 "Log in" 定位匹配 <input type=button value="Log in">

frame.getByTitle(text[, options])

Added in: v1.27
  • text <[string]|[RegExp]> 要定位元素的文本。#
  • options? <[Object]>
    • exact? <[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
  • returns: <[Locator]>#

允许通过其标题定位元素。例如,此方法将通过其标题 "Submit" 找到按钮:

<button title='Place the order'>Order Now</button>

frame.goto(url[, options])

Added in: v1.8
  • url <[string]> 帧导航到的 URL。url 应包含方案,例如 https://#
  • options? <[Object]>
  • returns: <[Promise]<[null]|[Response]>>#

返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。

该方法将抛出错误,如果:

  • 出现 SSL 错误(例如,如果是自签名证书)。
  • 目标 URL 无效。
  • 导航期间超出 timeout
  • 远程服务器不响应或无法访问。
  • 主资源加载失败。

当远程服务器返回任何有效的 HTTP 状态代码(包括 404 "Not Found" 和 500 "Internal Server Error")时,该方法不会抛出错误。可以通过调用 response.status() 检索此类响应的状态代码。

note

该方法要么抛出错误,要么返回主资源响应。唯一的例外是导航到 about:blank 或导航到具有不同哈希的相同 URL,这将成功并返回 null

note

无头模式不支持导航到 PDF 文档。请参阅 上游问题

frame.hover(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 可操作性 检查。默认为 false#
    • modifiers? <[Array]<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#
    • position? <[Object]> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 可操作性 检查并跳过操作。默认为 false。用于等待元素准备好操作而不执行它。Added in: v1.11#
  • returns: <[Promise]<[void]>>#

此方法通过执行以下步骤悬停在匹配 selector 的元素上:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素的 可操作性 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.mouse 悬停在元素的中心或指定的 position 上。
  5. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。

当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。

frame.innerHTML(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[string]>>#

返回 element.innerHTML

frame.innerText(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[string]>>#

返回 element.innerText

frame.inputValue(selector[, options])

Added in: v1.13
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[string]>>#

返回所选 <input><textarea><select> 元素的 input.value

对非输入元素抛出异常。但是,如果元素位于具有关联 control<label> 元素内,则返回控件的值。

frame.isChecked(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[boolean]>>#

返回元素是否已选中。如果元素不是复选框或单选输入,则抛出异常。

frame.isDetached()

Added in: v1.8
  • returns: <[boolean]>#

如果帧已分离,则返回 true,否则返回 false

frame.isDisabled(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[boolean]>>#

返回元素是否已禁用,与 enabled 相反。

frame.isEditable(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[boolean]>>#

返回元素是否 可编辑

frame.isEnabled(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[boolean]>>#

返回元素是否 已启用

frame.isHidden(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 已弃用 此选项被忽略。frame.isHidden(selector[, options]) 不等待元素变为隐藏并立即返回。#
  • returns: <[Promise]<[boolean]>>#

返回元素是否隐藏,与 visible 相反。不匹配任何元素的 selector 被视为隐藏。

frame.isVisible(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 已弃用 此选项被忽略。frame.isVisible(selector[, options]) 不等待元素变为可见并立即返回。#
  • returns: <[Promise]<[boolean]>>#

返回元素是否 可见。不匹配任何元素的 selector 被视为不可见。

frame.locator(selector[, options])

Added in: v1.14
  • selector <[string]> 解析 DOM 元素时使用的选择器。有关更多详细信息,请参阅 使用选择器#

  • options? <[Object]>

    • has? <[Locator]> 匹配包含匹配内部定位器的元素的元素。内部定位器针对外部定位器进行查询。例如,具有 text=Playwrightarticle 匹配 <article><div>Playwright</div></article>#

      请注意,外部和内部定位器必须属于同一帧。内部定位器不得包含 [FrameLocator]

    • hasText? <[string]|[RegExp]> 匹配内部某处包含指定文本的元素,可能在子元素或后代元素中。当传递 [string] 时,匹配不区分大小写并搜索子字符串。例如,"Playwright" 匹配 <article><div>Playwright</div></article>#

  • returns: <[Locator]>#

该方法返回一个元素定位器,可用于在此页面/帧上执行操作。定位器在执行操作之前立即解析为元素,因此对同一定位器的一系列操作实际上可能在不同的 DOM 元素上执行。如果这些操作之间的 DOM 结构发生了变化,就会发生这种情况。

了解有关定位器的更多信息

Learn more about locators.

frame.name()

Added in: v1.8
  • returns: <[string]>#

返回标记中指定的帧名称属性。

如果名称为空,则返回 id 属性。

note

此值在创建帧时计算一次,如果稍后更改属性,则不会更新。

frame.page()

Added in: v1.8
  • returns: <[Page]>#

返回包含此帧的页面。

frame.parentFrame()

Added in: v1.8
  • returns: <[null]|[Frame]>#

父帧(如果有)。分离的帧和主帧返回 null

frame.press(selector, key[, options])

Added in: v1.8
  • selector <[string]> 要查询的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参见 working with selectors#
  • key <[string]> 要按下的键名称或要生成文本的字符,例如 ArrowLefta#
  • options? <[Object]>
    • delay? <[number]>keydownkeyup 之间等待的时间(以毫秒为单位)。默认为 0。#
    • noWaitAfter? <[boolean]> 启动导航的操作会等待这些导航发生并等待页面开始加载。通过设置此标志可以选择不等待。仅在特殊情况下(如导航到无法访问的页面)才需要此选项。默认为 false#
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。 Added in: v1.14#
    • timeout? <[number]> 最大等待时间(以毫秒为单位),默认 30 秒,传 0 以禁用超时。你可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[void]>>#

key 可以指定预期的 keyboardEvent.key 值或要生成文本的单个字符。可以在 此处 找到 key 值的超集。键值示例如下:

F1 - F12, Digit0- Digit9, KeyA- KeyZ, Backquote, Minus, Equal, Backslash, Backspace, Tab, Delete, Escape, ArrowDown, End, Enter, Home, Insert, PageDown, PageUp, ArrowRight, ArrowUp 等。

以下修饰键快捷方式也受支持:Shift, Control, Alt, Meta, ShiftLeft

按住 Shift 会输入与 key 对应的大写文本。

如果 key 是单个字符,则大小写敏感,因此 aA 会生成不同的文本。

诸如 key: "Control+o"key: "Control+Shift+T" 的快捷方式也受支持。当与修饰键一起指定时,会先按下修饰键并保持按住,随后再按下其它键。

frame.selectOption(selector, values[, options])

Added in: v1.8
  • selector <[string]> 要查询的选择器。有关更多详细信息,请参见 working with selectors#
  • values <[null]|[string]|[ElementHandle]|[Array]<[string]>|[Object]|[Array]<[ElementHandle]>|[Array]<[Object]>> 要选中的选项。如果 <select> 元素具有 multiple 属性,则会选中所有匹配项,否则只选中第一个匹配传入选项的值。字符串值等同于 {value:'string'}。只要所有指定属性都匹配,即认为选项匹配。#
    • value? <[string]> 通过 option.value 匹配,可选。
    • label? <[string]> 通过 option.label 匹配,可选。
    • index? <[number]> 通过下标匹配,可选。
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 actionability 检查。默认为 falseAdded in: v1.13#
    • noWaitAfter? <[boolean]> 启动导航的操作会等待这些导航发生并等待页面开始加载。通过设置此标志可以选择不等待。仅在特殊情况下(如导航到无法访问的页面)才需要此选项。默认为 false#
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。 Added in: v1.14#
    • timeout? <[number]> 最大等待时间(以毫秒为单位),默认 30 秒,传 0 以禁用超时。你可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[Array]<[string]>>>#

该方法会等待匹配 selector 的元素,通过 actionability 检查,等待所有指定的选项出现在 <select> 元素中,并选中这些选项。

如果目标元素不是 <select> 元素,该方法会抛出错误。不过,如果该元素位于具有关联 control<label> 中,会改为使用该 control。

返回已成功选中的选项值数组。

一旦选中所有选项,会触发 changeinput 事件。

// single selection matching the value
frame.selectOption('select#colors', 'blue');

// single selection matching both the value and the label
frame.selectOption('select#colors', { label: 'Blue' });

// multiple selection
frame.selectOption('select#colors', 'red', 'green', 'blue');

frame.setChecked(selector, checked[, options])

Added in: v1.15
  • selector <[string]> 要查询的元素选择器。如果多个元素匹配该选择器,则使用第一个。有关更多信息,请参阅 working with selectors#
  • checked <[boolean]> 指定复选框是否选中。#
  • options? <[Object]>
  • force? <[boolean]> 是否绕过 actionability 检查。默认为 false#
  • noWaitAfter? <[boolean]> 发起导航的操作会等待这些导航完成并等待页面加载。通过设置此标志可以选择不等待,仅在导航到无法访问的页面等特殊场景中才需要。默认为 false#
  • position? <[Object]> 以元素内边距左上角为基准的点,若未指定则使用可见点。#
    • x <[number]>
    • y <[number]>
  • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素,否则抛出异常。#
  • timeout? <[number]> 最大等待时间(毫秒),默认 30 秒,传 0 可禁用超时。可通过 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法调整默认值。#
  • trial? <[boolean]> 设置后仅执行 actionability 检查并跳过操作。默认为 false,用于等待元素就绪而不执行操作。#
  • returns: <[Promise]<[void]>>#

该方法通过执行以下步骤来选中或取消选中匹配 selector 的元素:

  1. 查找匹配 selector 的元素。如果没有,则等待直到匹配元素附加到 DOM。
  2. 确保匹配元素是复选框或单选输入。如果不是,则抛出错误。
  3. 如果元素已经处于正确的选中状态,则立即返回。
  4. 对匹配元素执行 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则整个操作会重试。
  5. 如有必要,将元素滚动到视口中。
  6. 使用 page.mouse 点击元素的中心。
  7. 等待发起的导航成功或失败,除非设置了 noWaitAfter 选项。
  8. 确保元素现在已被选中或取消选中。如果不是,则抛出错误。

当所有步骤在指定的 timeout 时间内未完成时,该方法会抛出 [TimeoutError]。传入零超时可以禁用此行为。

frame.setContent(html[, options])

Added in: v1.8

frame.setInputFiles(selector, files[, options])

Added in:v1.8
  • selector <[string]> 用于搜索元素的选择器。如果有多个元素满足选择器,将使用第一个。详见选择器相关文档#
  • files <[string]|[Array]<[string]>|[Object]|[Array]<[Object]>>#
    • name <[string]> 文件名
    • mimeType <[string]> 文件类型
    • buffer <[Buffer]> 文件内容
  • options? <[Object]>
    • noWaitAfter? <[boolean]> 会触发导航的操作默认会等待导航发生并开始加载页面。设置此标志可选择不等待。仅在访问不可达页面等特殊场景下需要。默认值为 false#
    • strict? <[boolean]> 若为 true,要求选择器解析为单一元素。如果解析到多个元素,将抛出异常。新增于:v1.14#
    • timeout? <[number]> 最大执行时间(毫秒),默认 30 秒,传入 0 可禁用超时。可以通过 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 修改默认值。#
  • returns: <[Promise]<[void]>>#

将文件输入控件的值设置为指定的文件路径或文件对象。如果某些 filePaths 是相对路径,则会基于当前工作目录解析。传入空数组将清空已选择的文件。

该方法要求 selector 指向一个 input 元素。但如果该元素位于具有相关联 control<label> 内,则会改为操作该 control。

frame.tap(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 可操作性 检查。默认为 false#
    • modifiers? <[Array]<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#
    • noWaitAfter? <[boolean]> 启动导航的操作正在等待这些导航发生并等待页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为 false#
    • position? <[Object]> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 可操作性 检查并跳过操作。默认为 false。用于等待元素准备好操作而不执行它。Added in: v1.11#
  • returns: <[Promise]<[void]>>#

此方法通过执行以下步骤点击匹配 selector 的元素:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素的 可操作性 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.touchscreen 点击元素的中心或指定的 position
  5. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。

当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。

note

frame.tap() 需要在浏览器上下文中将 hasTouch 选项设置为 true。

frame.textContent(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[null]|[string]>>#

返回 element.textContent

frame.title()

Added in: v1.8
  • returns: <[Promise]<[string]>>#

返回页面标题。

frame.type(selector, text[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • text <[string]> 要键入到聚焦元素中的文本。#
  • options? <[Object]>
    • delay? <[number]> 按键之间的等待时间(以毫秒为单位)。默认为 0。#
    • noWaitAfter? <[boolean]> 启动导航的操作正在等待这些导航发生并等待页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为 false#
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
  • returns: <[Promise]<[void]>>#

发送每个字符的 keydownkeypress/inputkeyup 事件。frame.type 可用于发送细粒度的键盘事件。要填充表单字段中的值,请使用 frame.fill(selector, value[, options])

要按特殊键,如 ControlArrowDown,请使用 keyboard.press(key[, options])

await frame.type('#mytextarea', 'Hello'); // Types instantly
await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user

frame.uncheck(selector[, options])

Added in: v1.8
  • selector <[string]> 要搜索的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参阅 使用选择器#
  • options? <[Object]>
    • force? <[boolean]> 是否绕过 可操作性 检查。默认为 false#
    • noWaitAfter? <[boolean]> 启动导航的操作正在等待这些导航发生并等待页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为 false#
    • position? <[Object]> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。Added in: v1.11#
      • x <[number]>
      • y <[number]>
    • strict? <[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
    • timeout? <[number]> 以毫秒为单位的最大时间,默认为 30 秒,传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout)page.setDefaultTimeout(timeout) 方法更改默认值。#
    • trial? <[boolean]> 设置后,此方法仅执行 可操作性 检查并跳过操作。默认为 false。用于等待元素准备好操作而不执行它。Added in: v1.11#
  • returns: <[Promise]<[void]>>#

此方法通过执行以下步骤取消选中匹配 selector 的元素:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 确保匹配的元素是复选框或单选输入。如果不是,此方法将抛出错误。如果元素已取消选中,此方法立即返回。
  3. 等待匹配元素的 可操作性 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  4. 如果需要,将元素滚动到视图中。
  5. 使用 page.mouse 点击元素的中心。
  6. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。
  7. 确保元素现在已取消选中。如果不是,此方法将抛出错误。

当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。

frame.url()

Added in: v1.8
  • returns: <[string]>#

返回帧的 URL。

frame.waitForFunction(pageFunction[, arg, options])

Added in: v1.8
  • pageFunction <[function]|[string]> 要在页面上下文中评估的函数。#
  • arg? <[EvaluationArgument]> 传递给 pageFunction 的可选参数。#
  • options? <[Object]>
    • polling? <[number]|"raf"> 如果 polling'raf',则 pageFunctionrequestAnimationFrame 回调中不断执行。如果 polling 是一个数字,则它被视为执行函数的时间间隔(以毫秒为单位)。默认为 raf#
    • timeout? <[number]> 以毫秒为单位的最大等待时间。默认为 30000(30 秒)。传递 0 以禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 更改默认值。#
  • returns: <[Promise]<[JSHandle]>>#

pageFunction 返回真值时返回,返回该值。

frame.waitForFunction(pageFunction[, arg, options]) 可用于观察视口大小变化:

const { firefox } = require('playwright');  // Or 'chromium' or 'webkit'.

(async () => {
const browser = await firefox.launch();
const page = await browser.newPage();
const watchDog = page.mainFrame().waitForFunction('window.innerWidth < 100');
page.setViewportSize({width: 50, height: 50});
await watchDog;
await browser.close();
})();

将参数传递给 frame.waitForFunction 函数的谓词:

const selector = '.foo';
await frame.waitForFunction(selector => !!document.querySelector(selector), selector);

frame.waitForLoadState([state, options])

Added in: v1.8

等待达到指定的加载状态。

当 frame 达到指定的加载状态时返回,默认是 load。调用该方法时导航必须已经被提交。如果当前文档已经达到该状态,将立即 resolve。

await frame.click('button'); // 点击触发导航
await frame.waitForLoadState(); // 默认等待 'load' 状态

frame.waitForNavigation([options])

Added in: v1.8
  • options? <[Object]>
    • timeout? <[number]> 操作的最大执行时间(毫秒),默认为 30 秒,传入 0 可禁用超时。可通过 browserContext.setDefaultNavigationTimeout(timeout)browserContext.setDefaultTimeout(timeout)page.setDefaultNavigationTimeout(timeout)page.setDefaultTimeout(timeout) 修改默认值。#
    • url? <[string]|[RegExp]|[function]([URL]):[boolean]> 在等待导航时用于匹配的 glob 模式、正则表达式或基于 [URL] 的谓词函数。注意:如果传入的是不含通配符的字符串,则方法会等待导航到与该字符串完全相等的 URL。#
    • waitUntil? <"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为 load。可选事件如下:#
      • 'domcontentloaded' - 当触发 DOMContentLoaded 事件时,认为操作完成。
      • 'load' - 当触发 load 事件时,认为操作完成。
      • 'networkidle' - 当至少 500 毫秒内无网络连接时,认为操作完成。
      • 'commit' - 当接收到网络响应且文档开始加载时,认为操作完成。
  • returns: <[Promise]<[null]|[Response]>>#

等待 frame 导航并返回主资源的响应。如果导航涉及多次重定向,返回的是最后一次重定向的响应。如果是跳转到不同的锚点(anchor)或由于 History API 导致的导航,则返回 null

该方法会等待 frame 导航到一个新的 URL。当你执行的代码会间接触发导航时,它非常有用。例如:

const [response] = await Promise.all([
frame.waitForNavigation(), // 当导航结束后该 Promise 才会 resolve
frame.click('a.delayed-navigation'), // 点击该链接会间接触发导航
]);
note

使用 History API 更改 URL 被视为一次导航。

## frame.waitForSelector(selector[, options]) {#frame-wait-for-selector}

<font size="2" style={{position: "relative", top: "-20px"}}>Added in: v1.8</font>

- `selector`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-selector-option-selector"/> &#60;[string]&#62; 要查询的选择器。更多信息参见[选择器使用指南](../selectors.mdx)。<a href="#frame-wait-for-selector-option-selector" class="list-anchor">#</a>
- `options?` &#60;[Object]&#62;
- `state?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-selector-option-state"/> &#60;"attached"|"detached"|"visible"|"hidden"&#62; 默认为 `'visible'`。可选值如下:<a href="#frame-wait-for-selector-option-state" class="list-anchor">#</a>
* `'attached'` - 等待元素出现在 DOM 中。
* `'detached'` - 等待元素从 DOM 中消失。
* `'visible'` - 等待元素具有非空的边界盒且 `visibility` 不为 `hidden`。注意:无内容的元素或设置了 `display:none` 的元素边界盒为空,因此不会视为可见。
* `'hidden'` - 等待元素从 DOM 中移除,或具有空边界盒,或 `visibility:hidden`。此状态与 `'visible'` 相反。
- `strict?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-selector-option-strict"/> &#60;[boolean]&#62; 若为 true,则要求选择器仅匹配单一元素。如果匹配了多个元素,将抛出异常。<font size="2">新增于:v1.14</font><a href="#frame-wait-for-selector-option-strict" class="list-anchor">#</a>
- `timeout?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-selector-option-timeout"/> &#60;[number]&#62; 最大等待时间(毫秒),默认为 30 秒,传入 `0` 可禁用超时。默认值可由 [browserContext.setDefaultTimeout(timeout)](/api/class-browsercontext.mdx#browser-context-set-default-timeout) 或 [page.setDefaultTimeout(timeout)](/api/class-page.mdx#page-set-default-timeout) 修改。<a href="#frame-wait-for-selector-option-timeout" class="list-anchor">#</a>
- returns:<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-selector-return"/> &#60;[Promise]<[null]|[ElementHandle]>&#62;<a href="#frame-wait-for-selector-return" class="list-anchor">#</a>

当 selector 指定的元素满足 `state` 条件时返回。如果等待的是 `hidden` 或 `detached`,则返回 `null`。

:::note
Playwright 在执行操作前会自动等待元素就绪。使用 [Locator] 对象与 web-first 断言可以让代码无需显式地使用 wait-for-selector。
:::

等待 `selector` 满足 `state` 条件(出现/消失于 DOM,或变为可见/隐藏)。如果方法调用时元素已经满足条件,则立即返回。如果在 `timeout` 毫秒内未满足条件,则抛出异常。

该方法在导航过程中同样有效:

```js
const { chromium } = require('playwright'); // 或 'firefox' 或 'webkit'.

(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
for (let currentURL of ['https://google.com', 'https://bbc.com']) {
await page.goto(currentURL);
const element = await page.mainFrame().waitForSelector('img');
console.log('Loaded image: ' + await element.getAttribute('src'));
}
await browser.close();
})();
```

## frame.waitForTimeout(timeout) {#frame-wait-for-timeout}

<font size="2" style={{position: "relative", top: "-20px"}}>Added in: v1.8</font>

* `timeout`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-timeout-option-timeout"/> &#60;[number]&#62; 要等待的毫秒数<a href="#frame-wait-for-timeout-option-timeout" class="list-anchor">#</a>
* 返回:<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-timeout-return"/> &#60;[Promise]<[void]>&#62;<a href="#frame-wait-for-timeout-return" class="list-anchor">#</a>

按指定时间(毫秒)进行等待。

请注意,`frame.waitForTimeout()` 仅应用于调试。生产环境中的基于时间的测试会非常不稳定,应使用网络事件、选择器可见等信号替代。

## frame.waitForURL(url[, options]) {#frame-wait-for-url}

<font size="2" style={{position: "relative", top: "-20px"}}>Added in: v1.11</font>

- `url`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-url-option-url"/> &#60;[string]|[RegExp]|[function]\([URL]\):[boolean]&#62; 在等待导航时用于匹配的 glob 模式、正则表达式或基于 [URL] 的谓词函数。注意:如果传入的是不含通配符的字符串,则方法会等待导航到与该字符串完全相等的 URL。<a href="#frame-wait-for-url-option-url" class="list-anchor">#</a>
- `options?` &#60;[Object]&#62;
- `timeout?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-url-option-timeout"/> &#60;[number]&#62; 最大执行时间(毫秒),默认为 30 秒,传入 `0` 可禁用超时。默认值可通过 [browserContext.setDefaultNavigationTimeout(timeout)](/api/class-browsercontext.mdx#browser-context-set-default-navigation-timeout)、[browserContext.setDefaultTimeout(timeout)](/api/class-browsercontext.mdx#browser-context-set-default-timeout)、[page.setDefaultNavigationTimeout(timeout)](/api/class-page.mdx#page-set-default-navigation-timeout) 或 [page.setDefaultTimeout(timeout)](/api/class-page.mdx#page-set-default-timeout) 修改。<a href="#frame-wait-for-url-option-timeout" class="list-anchor">#</a>
- `waitUntil?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-url-option-wait-until"/> &#60;"load"|"domcontentloaded"|"networkidle"|"commit"&#62; 何时认为操作成功,默认为 `load`。可选事件如下:<a href="#frame-wait-for-url-option-wait-until" class="list-anchor">#</a>
* `'domcontentloaded'` - 当触发 `DOMContentLoaded` 事件时认为操作完成。
* `'load'` - 当触发 `load` 事件时认为操作完成。
* `'networkidle'` - 当至少 `500` 毫秒内无网络连接时认为操作完成。
* `'commit'` - 当收到网络响应且文档开始加载时认为操作完成。
- returns:<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-url-return"/> &#60;[Promise]<[void]>&#62;<a href="#frame-wait-for-url-return" class="list-anchor">#</a>

等待 frame 导航到指定 URL。

```js
await frame.click('a.delayed-navigation'); // 点击链接将间接触发导航
await frame.waitForURL('**/target.html');
```


[Accessibility]: /api/class-accessibility.mdx "Accessibility"
[Android]: /api/class-android.mdx "Android"
[AndroidDevice]: /api/class-androiddevice.mdx "AndroidDevice"
[AndroidInput]: /api/class-androidinput.mdx "AndroidInput"
[AndroidSocket]: /api/class-androidsocket.mdx "AndroidSocket"
[AndroidWebView]: /api/class-androidwebview.mdx "AndroidWebView"
[APIRequest]: /api/class-apirequest.mdx "APIRequest"
[APIRequestContext]: /api/class-apirequestcontext.mdx "APIRequestContext"
[APIResponse]: /api/class-apiresponse.mdx "APIResponse"
[APIResponseAssertions]: /test-assertions.mdx "APIResponseAssertions"
[Browser]: /api/class-browser.mdx "Browser"
[BrowserContext]: /api/class-browsercontext.mdx "BrowserContext"
[BrowserServer]: /api/class-browserserver.mdx "BrowserServer"
[BrowserType]: /api/class-browsertype.mdx "BrowserType"
[CDPSession]: /api/class-cdpsession.mdx "CDPSession"
[ConsoleMessage]: /api/class-consolemessage.mdx "ConsoleMessage"
[Coverage]: /api/class-coverage.mdx "Coverage"
[Dialog]: /api/class-dialog.mdx "Dialog"
[Download]: /api/class-download.mdx "Download"
[Electron]: /api/class-electron.mdx "Electron"
[ElectronApplication]: /api/class-electronapplication.mdx "ElectronApplication"
[ElementHandle]: /api/class-elementhandle.mdx "ElementHandle"
[FileChooser]: /api/class-filechooser.mdx "FileChooser"
[Frame]: /api/class-frame.mdx "Frame"
[FrameLocator]: /api/class-framelocator.mdx "FrameLocator"
[JSHandle]: /api/class-jshandle.mdx "JSHandle"
[Keyboard]: /api/class-keyboard.mdx "Keyboard"
[Locator]: /api/class-locator.mdx "Locator"
[LocatorAssertions]: /test-assertions.mdx "LocatorAssertions"
[Logger]: /api/class-logger.mdx "Logger"
[Mouse]: /api/class-mouse.mdx "Mouse"
[Page]: /api/class-page.mdx "Page"
[PageAssertions]: /test-assertions.mdx "PageAssertions"
[Playwright]: /api/class-playwright.mdx "Playwright"
[PlaywrightAssertions]: /test-assertions.mdx "PlaywrightAssertions"
[Request]: /api/class-request.mdx "Request"
[Response]: /api/class-response.mdx "Response"
[Route]: /api/class-route.mdx "Route"
[ScreenshotAssertions]: /test-assertions.mdx "ScreenshotAssertions"
[Selectors]: /api/class-selectors.mdx "Selectors"
[TimeoutError]: /api/class-timeouterror.mdx "TimeoutError"
[Touchscreen]: /api/class-touchscreen.mdx "Touchscreen"
[Tracing]: /api/class-tracing.mdx "Tracing"
[Video]: /api/class-video.mdx "Video"
[WebSocket]: /api/class-websocket.mdx "WebSocket"
[Worker]: /api/class-worker.mdx "Worker"
[Fixtures]: /api/class-fixtures.mdx "Fixtures"
[Test]: /api/class-test.mdx "Test"
[TestConfig]: /api/class-testconfig.mdx "TestConfig"
[TestError]: /api/class-testerror.mdx "TestError"
[TestInfo]: /api/class-testinfo.mdx "TestInfo"
[TestOptions]: /api/class-testoptions.mdx "TestOptions"
[TestProject]: /api/class-testproject.mdx "TestProject"
[WorkerInfo]: /api/class-workerinfo.mdx "WorkerInfo"
[Location]: /api/class-location.mdx "Location"
[Reporter]: /api/class-reporter.mdx "Reporter"
[Suite]: /api/class-suite.mdx "Suite"
[TestCase]: /api/class-testcase.mdx "TestCase"
[TestResult]: /api/class-testresult.mdx "TestResult"
[TestStep]: /api/class-teststep.mdx "TestStep"
[Element]: https://developer.mozilla.org/en-US/docs/Web/API/element "Element"
[EvaluationArgument]: /evaluating.mdx#evaluation-argument "EvaluationArgument"
[Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "Promise"
[iterator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols "Iterator"
[origin]: https://developer.mozilla.org/en-US/docs/Glossary/Origin "Origin"
[selector]: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors "selector"
[Serializable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description "Serializable"
[UIEvent.detail]: https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail "UIEvent.detail"
[UnixTime]: https://en.wikipedia.org/wiki/Unix_time "Unix Time"
[xpath]: https://developer.mozilla.org/en-US/docs/Web/XPath "xpath"

[Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array "Array"
[boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type "Boolean"
[Buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer "Buffer"
[ChildProcess]: https://nodejs.org/api/child_process.html "ChildProcess"
[Error]: https://nodejs.org/api/errors.html#errors_class_error "Error"
[EventEmitter]: https://nodejs.org/api/events.html#events_class_eventemitter "EventEmitter"
[function]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function "Function"
[Map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map "Map"
[null]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null "null"
[number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type "Number"
[Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object "Object"
[Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "Promise"
[Readable]: https://nodejs.org/api/stream.html#stream_class_stream_readable "Readable"
[RegExp]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp "RegExp"
[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "string"
[void]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined "void"
[URL]: https://nodejs.org/api/url.html "URL"

[all available image tags]: https://mcr.microsoft.com/en-us/product/playwright/about "all available image tags"
[Docker Hub]: https://hub.docker.com/_/microsoft-playwright "Docker Hub"
[Dockerfile.focal]: https://github.com/microsoft/playwright/blob/main/utils/docker/Dockerfile.focal "Dockerfile.focal"