Frame
在任何时候,页面都通过 page.mainFrame() 和 frame.childFrames() 方法公开其当前的帧树。
[Frame] 对象的生命周期由页面对象上分发的三个事件控制:
- page.on('frameattached') - 当帧附加到页面时触发。一个帧只能附加到页面一次。
- page.on('framenavigated') - 当帧提交导航到不同的 URL 时触发。
- page.on('framedetached') - 当帧从页面分离时触发。一个帧只能从页面分离一次。
转储帧树的示例:
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])
- frame.$$(selector)
- frame.$$eval(selector, pageFunction[, arg])
- frame.$eval(selector, pageFunction[, arg, options])
- frame.addScriptTag([options])
- frame.addStyleTag([options])
- frame.check(selector[, options])
- frame.childFrames()
- frame.click(selector[, options])
- frame.content()
- frame.dblclick(selector[, options])
- frame.dispatchEvent(selector, type[, eventInit, options])
- frame.dragAndDrop(source, target[, options])
- frame.evaluate(pageFunction[, arg])
- frame.evaluateHandle(pageFunction[, arg])
- frame.fill(selector, value[, options])
- frame.focus(selector[, options])
- frame.frameElement()
- frame.frameLocator(selector)
- frame.getAttribute(selector, name[, options])
- frame.getByAltText(text[, options])
- frame.getByLabel(text[, options])
- frame.getByPlaceholder(text[, options])
- frame.getByRole(role[, options])
- frame.getByTestId(testId)
- frame.getByText(text[, options])
- frame.getByTitle(text[, options])
- frame.goto(url[, options])
- frame.hover(selector[, options])
- frame.innerHTML(selector[, options])
- frame.innerText(selector[, options])
- frame.inputValue(selector[, options])
- frame.isChecked(selector[, options])
- frame.isDetached()
- frame.isDisabled(selector[, options])
- frame.isEditable(selector[, options])
- frame.isEnabled(selector[, options])
- frame.isHidden(selector[, options])
- frame.isVisible(selector[, options])
- frame.locator(selector[, options])
- frame.name()
- frame.page()
- frame.parentFrame()
- frame.press(selector, key[, options])
- frame.selectOption(selector, values[, options])
- frame.setChecked(selector, checked[, options])
- frame.setContent(html[, options])
- frame.setInputFiles(selector, files[, options])
- frame.tap(selector[, options])
- frame.textContent(selector[, options])
- frame.title()
- frame.type(selector, text[, options])
- frame.uncheck(selector[, options])
- frame.url()
- frame.waitForFunction(pageFunction[, arg, options])
- frame.waitForLoadState([state, options])
- frame.waitForNavigation([options])
- frame.waitForSelector(selector[, options])
- frame.waitForTimeout(timeout)
- frame.waitForURL(url[, options])
frame.$(selector[, options])
Added in: v1.9selector<[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器。#options?<[Object]>strict?<[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
- returns: <[Promise]<[null]|[ElementHandle]>>#
返回指向帧元素的 ElementHandle。
不鼓励使用 [ElementHandle],请改用 [Locator] 对象和 web-first 断言。
该方法在帧中查找与指定选择器匹配的元素。有关更多详细信息,请参阅 使用选择器。如果没有元素匹配选择器,则返回 null。
frame.$$(selector)
Added in: v1.9返回指向帧元素的 ElementHandle。
不鼓励使用 [ElementHandle],请改用 [Locator] 对象。
该方法在帧中查找与指定选择器匹配的所有元素。有关更多详细信息,请参阅 使用选择器。如果没有元素匹配选择器,则返回空数组。
frame.$eval(selector, pageFunction[, arg, options])
Added in: v1.9selector<[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器。#pageFunction<[function]([Element])> 在页面上下文中评估的函数。#arg?<[EvaluationArgument]> 传递给pageFunction的可选参数。#options?<[Object]>strict?<[boolean]> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#
- returns: <[Promise]<[Serializable]>>#
返回 pageFunction 的返回值。
此方法不等待元素通过 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.9selector<[string]> 要查询的选择器。有关更多详细信息,请参阅 使用选择器。#pageFunction<[function]([Array]<[Element]>)> 在页面上下文中评估的函数。#arg?<[EvaluationArgument]> 传递给pageFunction的可选参数。#- returns: <[Promise]<[Serializable]>>#
返回 pageFunction 的返回值。
在大多数情况下,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.8options?<[Object]>- returns: <[Promise]<[ElementHandle]>>#
当脚本的 onload 触发或脚本内容注入帧时,返回添加的标签。
将具有所需 url 或内容的 <script> 标签添加到页面中。
frame.addStyleTag([options])
Added in: v1.8options?<[Object]>- returns: <[Promise]<[ElementHandle]>>#
当样式表的 onload 触发或 CSS 内容注入帧时,返回添加的标签。
将具有所需 url 的 <link rel="stylesheet"> 标签或具有内容的 <style type="text/css"> 标签添加到页面中。
frame.check(selector[, options])
Added in: v1.8selector<[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 的元素:
- 查找匹配
selector的元素。如果没有,等待直到匹配的元素附加到 DOM。 - 确保匹配的元素是复选框或单选输入。如果不是,此方法将抛出错误。如果元素已选中,此方法将立即返回。
- 等待匹配元素上的 actionability 检查,除非设置了
force选项。如果在检查期间元素分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 单击元素的中心。
- 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。 - 确保元素现在已选中。如果不是,此方法将抛出错误。
如果所有步骤在指定的 timeout 期间未完成,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。
frame.childFrames()
Added in: v1.8- returns: <[Array]<[Frame]>>#
frame.click(selector[, options])
Added in: v1.8selector<[string]> 要搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅 使用选择器。#options?<[Object]>button?<"left"|"right"|"middle"> 默认为left。#clickCount?<[number]> 默认为 1。请参阅 [UIEvent.detail]。#delay?<[number]>mousedown和mouseup之间等待的时间(以毫秒为单位)。默认为 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 的元素:
- 查找匹配
selector的元素。如果没有,等待直到匹配的元素附加到 DOM。 - 等待匹配元素上的 actionability 检查,除非设置了
force选项。如果在检查期间元素分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 单击元素的中心,或指定的
position。 - 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。
如果所有步骤在指定的 timeout 期间未完成,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。
frame.content()
Added in: v1.8- returns: <[Promise]<[string]>>#
获取帧的完整 HTML 内容,包括 doctype。
frame.dblclick(selector[, options])
Added in: v1.8selector<[string]> 要搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅 使用选择器。#options?<[Object]>button?<"left"|"right"|"middle"> 默认为left。#delay?<[number]>mousedown和mouseup之间等待的时间(以毫秒为单位)。默认为 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 的元素:
- 查找匹配
selector的元素。如果没有,等待直到匹配的元素附加到 DOM。 - 等待匹配元素上的 actionability 检查,除非设置了
force选项。如果在检查期间元素分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 双击元素的中心,或指定的
position。 - 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。注意,如果dblclick()的第一次单击触发了导航事件,此方法将抛出错误。
如果所有步骤在指定的 timeout 期间未完成,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。
frame.dblclick() 分发两个 click 事件和一个 dblclick 事件。
frame.dispatchEvent(selector, type[, eventInit, options])
Added in: v1.8selector<[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 属性对其进行初始化,并在元素上分派它。事件默认是 composed、cancelable 和冒泡的。
由于 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.13source<[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.8pageFunction<[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 无法序列化的附加值:-0、NaN、Infinity、-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.8pageFunction<[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.8selector<[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.8selector<[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]>>#
返回对应于此帧的 frame 或 iframe 元素句柄。
这是 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处理 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.8selector<[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.27text<[string]|[RegExp]> 要定位元素的文本。#options?<[Object]>exact?<[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
- returns: <[Locator]>#
允许通过其替代文本定位元素。例如,此方法将通过替代文本 "Castle" 找到图像:
<img alt='Castle'>
frame.getByLabel(text[, options])
Added in: v1.27text<[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.27text<[string]|[RegExp]> 要定位元素的文本。#options?<[Object]>exact?<[boolean]> 是否查找精确匹配:区分大小写且全字符串匹配。默认为 false。当按正则表达式定位时忽略。请注意,精确匹配仍然会修剪空格。#
- returns: <[Locator]>#
允许通过占位符文本定位输入元素。例如,此方法将通过占位符 "Country" 找到输入:
<input placeholder="Country">
frame.getByRole(role[, options])
Added in: v1.27role<"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 的可用值为true、false和"mixed"。#了解有关
aria-checked的更多信息。disabled?<[boolean]> 通常由aria-disabled或disabled设置的布尔属性。#note与大多数其他属性不同,
disabled是通过 DOM 层次结构继承的。了解有关aria-disabled的更多信息。expanded?<[boolean]> 通常由aria-expanded设置的布尔属性。#了解有关
aria-expanded的更多信息。includeHidden?<[boolean]> 一个布尔属性,控制是否匹配隐藏元素。默认情况下,只有非隐藏元素(如 ARIA 定义)才会被角色选择器匹配。#了解有关
aria-hidden的更多信息。level?<[number]> 通常出现在角色heading、listitem、row、treeitem中的数字属性,对于<h1>-<h6>元素具有默认值。#了解有关
aria-level的更多信息。name?<[string]|[RegExp]> 匹配 可访问名称 的字符串属性。#了解有关 可访问名称 的更多信息。
pressed?<[boolean]> 通常由aria-pressed设置的属性。pressed 的可用值为true、false和"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通过测试 ID 定位元素。默认情况下,使用 data-testid 属性作为测试 ID。如有必要,请使用 selectors.setTestIdAttribute(attributeName) 配置不同的测试 ID 属性。
frame.getByText(text[, options])
Added in: v1.27text<[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]),它允许按其他条件(如可访问角色)进行匹配,然后按文本内容进行过滤。
按文本匹配始终规范化空格,即使是精确匹配也是如此。例如,它将多个空格转换为一个,将换行符转换为空格,并忽略前导和尾随空格。
类型为 button 和 submit 的输入元素通过其 value 而不是文本内容进行匹配。例如,按文本 "Log in" 定位匹配 <input type=button value="Log in">。
frame.getByTitle(text[, options])
Added in: v1.27text<[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.8url<[string]> 帧导航到的 URL。url 应包含方案,例如https://。#options?<[Object]>referer?<[string]> Referer 标头值。如果提供,它将优先于 page.setExtraHTTPHeaders(headers) 设置的 referer 标头值。#timeout?<[number]> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。可以使用 browserContext.setDefaultNavigationTimeout(timeout)、browserContext.setDefaultTimeout(timeout)、page.setDefaultNavigationTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#waitUntil?<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 当DOMContentLoaded事件触发时认为操作已完成。'load'- 当load事件触发时认为操作已完成。'networkidle'- 当至少500毫秒没有网络连接时认为操作已完成。'commit'- 当收到网络响应且文档开始加载时认为操作已完成。
- returns: <[Promise]<[null]|[Response]>>#
返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。
该方法将抛出错误,如果:
- 出现 SSL 错误(例如,如果是自签名证书)。
- 目标 URL 无效。
- 导航期间超出
timeout。 - 远程服务器不响应或无法访问。
- 主资源加载失败。
当远程服务器返回任何有效的 HTTP 状态代码(包括 404 "Not Found" 和 500 "Internal Server Error")时,该方法不会抛出错误。可以通过调用 response.status() 检索此类响应的状态代码。
该方法要么抛出错误,要么返回主资源响应。唯一的例外是导航到 about:blank 或导航到具有不同哈希的相同 URL,这将成功并返回 null。
无头模式不支持导航到 PDF 文档。请参阅 上游问题。
frame.hover(selector[, options])
Added in: v1.8selector<[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 的元素上:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 等待匹配元素的 可操作性 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 悬停在元素的中心或指定的
position上。 - 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。
当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。
frame.innerHTML(selector[, options])
Added in: v1.8selector<[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.8selector<[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.13selector<[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.8selector<[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.8selector<[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.8selector<[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.8selector<[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.8selector<[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.8selector<[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.14options?<[Object]>has?<[Locator]> 匹配包含匹配内部定位器的元素的元素。内部定位器针对外部定位器进行查询。例如,具有text=Playwright的article匹配<article><div>Playwright</div></article>。#请注意,外部和内部定位器必须属于同一帧。内部定位器不得包含 [FrameLocator]。
hasText?<[string]|[RegExp]> 匹配内部某处包含指定文本的元素,可能在子元素或后代元素中。当传递 [string] 时,匹配不区分大小写并搜索子字符串。例如,"Playwright"匹配<article><div>Playwright</div></article>。#
returns: <[Locator]>#
该方法返回一个元素定位器,可用于在此页面/帧上执行操作。定位器在执行操作之前立即解析为元素,因此对同一定位器的一系列操作实际上可能在不同的 DOM 元素上执行。如果这些操作之间的 DOM 结构发生了变化,就会发生这种情况。
frame.name()
Added in: v1.8- returns: <[string]>#
返回标记中指定的帧名称属性。
如果名称为空,则返回 id 属性。
此值在创建帧时计算一次,如果稍后更改属性,则不会更新。
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.8selector<[string]> 要查询的元素选择器。如果有多个元素满足选择器,则使用第一个。有关更多详细信息,请参见 working with selectors。#key<[string]> 要按下的键名称或要生成文本的字符,例如ArrowLeft或a。#options?<[Object]>delay?<[number]> 在keydown和keyup之间等待的时间(以毫秒为单位)。默认为 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 是单个字符,则大小写敏感,因此 a 与 A 会生成不同的文本。
诸如 key: "Control+o" 或 key: "Control+Shift+T" 的快捷方式也受支持。当与修饰键一起指定时,会先按下修饰键并保持按住,随后再按下其它键。
frame.selectOption(selector, values[, options])
Added in: v1.8selector<[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 检查。默认为false。 Added 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。
返回已成功选中的选项值数组。
一旦选中所有选项,会触发 change 和 input 事件。
// 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.15selector<[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 的元素:
- 查找匹配
selector的元素。如果没有,则等待直到匹配元素附加到 DOM。 - 确保匹配元素是复选框或单选输入。如果不是,则抛出错误。
- 如果元素已经处于正确的选中状态,则立即返回。
- 对匹配元素执行 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则整个操作会重试。 - 如有必要,将元素滚动到视口中。
- 使用 page.mouse 点击元素的中心。
- 等待发起的导航成功或失败,除非设置了
noWaitAfter选项。 - 确保元素现在已被选中或取消选中。如果不是,则抛出错误。
当所有步骤在指定的 timeout 时间内未完成时,该方法会抛出 [TimeoutError]。传入零超时可以禁用此行为。
frame.setContent(html[, options])
Added in: v1.8html<[string]> 要赋予页面的 HTML 内容。#options?<[Object]>timeout?<[number]> 操作的最大时间(毫秒),默认 30 秒,传入0可禁用超时。可通过 browserContext.setDefaultNavigationTimeout(timeout)、browserContext.setDefaultTimeout(timeout)、page.setDefaultNavigationTimeout(timeout) 或 page.setDefaultTimeout(timeout) 修改默认值。#waitUntil?<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以为:#'domcontentloaded'- 当触发DOMContentLoaded事件时认为操作完成。'load'- 当触发load事件时认为操作完成。'networkidle'- 当至少500毫秒内无网络连接时认为操作完成。'commit'- 当收到网络响应且文档开始加载时认为操作完成。
- returns: <[Promise]<[void]>>#
frame.setInputFiles(selector, files[, options])
Added in:v1.8selector<[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.8selector<[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 的元素:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 等待匹配元素的 可操作性 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.touchscreen 点击元素的中心或指定的
position。 - 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。
当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。
frame.tap() 需要在浏览器上下文中将 hasTouch 选项设置为 true。
frame.textContent(selector[, options])
Added in: v1.8selector<[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.8selector<[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]>>#
发送每个字符的 keydown、keypress/input 和 keyup 事件。frame.type 可用于发送细粒度的键盘事件。要填充表单字段中的值,请使用 frame.fill(selector, value[, options])。
要按特殊键,如 Control 或 ArrowDown,请使用 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.8selector<[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 的元素:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 确保匹配的元素是复选框或单选输入。如果不是,此方法将抛出错误。如果元素已取消选中,此方法立即返回。
- 等待匹配元素的 可操作性 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 点击元素的中心。
- 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。 - 确保元素现在已取消选中。如果不是,此方法将抛出错误。
当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 [TimeoutError]。传递零超时将禁用此功能。
frame.url()
Added in: v1.8- returns: <[string]>#
返回帧的 URL。
frame.waitForFunction(pageFunction[, arg, options])
Added in: v1.8pageFunction<[function]|[string]> 要在页面上下文中评估的函数。#arg?<[EvaluationArgument]> 传递给pageFunction的可选参数。#options?<[Object]>polling?<[number]|"raf"> 如果polling是'raf',则pageFunction在requestAnimationFrame回调中不断执行。如果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.8state?<"load"|"domcontentloaded"|"networkidle"> 可选的加载状态,默认为load。如果当前文档在加载期间已达到该状态,则方法会立即 resolve。可选状态包括:#'load'- 等待触发load事件。'domcontentloaded'- 等待触发DOMContentLoaded事件。'networkidle'- 等待至少500ms 内无网络连接。
options?<[Object]>timeout?<[number]> 操作最大执行时间(毫秒),默认 30 秒,传入0可禁用超时。默认值可通过 browserContext.setDefaultNavigationTimeout(timeout)、browserContext.setDefaultTimeout(timeout)、page.setDefaultNavigationTimeout(timeout) 或 page.setDefaultTimeout(timeout) 修改。#
- returns: <[Promise]<[void]>>#
等待达到指定的加载状态。
当 frame 达到指定的加载状态时返回,默认是 load。调用该方法时导航必须已经被提交。如果当前文档已经达到该状态,将立即 resolve。
await frame.click('button'); // 点击触发导航
await frame.waitForLoadState(); // 默认等待 'load' 状态
frame.waitForNavigation([options])
Added in: v1.8options?<[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'), // 点击该链接会间接触发导航
]);
使用 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"/> <[string]> 要查询的选择器。更多信息参见[选择器使用指南](../selectors.mdx)。<a href="#frame-wait-for-selector-option-selector" class="list-anchor">#</a>
- `options?` <[Object]>
- `state?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-selector-option-state"/> <"attached"|"detached"|"visible"|"hidden"> 默认为 `'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"/> <[boolean]> 若为 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"/> <[number]> 最大等待时间(毫秒),默认为 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"/> <[Promise]<[null]|[ElementHandle]>><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"/> <[number]> 要等待的毫秒数<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"/> <[Promise]<[void]>><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"/> <[string]|[RegExp]|[function]\([URL]\):[boolean]> 在等待导航时用于匹配的 glob 模式、正则表达式或基于 [URL] 的谓词函数。注意:如果传入的是不含通配符的字符串,则方法会等待导航到与该字符串完全相等的 URL。<a href="#frame-wait-for-url-option-url" class="list-anchor">#</a>
- `options?` <[Object]>
- `timeout?`<a aria-hidden="true" tabindex="-1" class="list-anchor-link" id="frame-wait-for-url-option-timeout"/> <[number]> 最大执行时间(毫秒),默认为 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"/> <"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为 `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"/> <[Promise]<[void]>><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"