Page
- extends: EventEmitter
Page 提供与 Browser 中的单个选项卡或 Chromium 中的扩展背景页进行交互的方法。一个 Browser 实例可能有多个 Page 实例。
此示例创建一个页面,将其导航到 URL,然后保存屏幕截图:
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
(async () => {
const browser = await webkit.launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'screenshot.png'});
await browser.close();
})();
Page 类发出各种事件(如下所述),可以使用 Node 的任何原生 EventEmitter 方法(如 on、once 或 removeListener)进行处理。
此示例记录单个页面 load 事件的消息:
page.once('load', () => console.log('Page loaded!'));
要取消订阅事件,请使用 removeListener 方法:
function logRequest(interceptedRequest) {
console.log('A request was made:', interceptedRequest.url());
}
page.on('request', logRequest);
// Sometime later...
page.removeListener('request', logRequest);
- page.on('close')
- page.on('console')
- page.on('crash')
- page.on('dialog')
- page.on('domcontentloaded')
- page.on('download')
- page.on('filechooser')
- page.on('frameattached')
- page.on('framedetached')
- page.on('framenavigated')
- page.on('load')
- page.on('pageerror')
- page.on('popup')
- page.on('request')
- page.on('requestfailed')
- page.on('requestfinished')
- page.on('response')
- page.on('websocket')
- page.on('worker')
- page.$(selector[, options])
- page.$$(selector)
- page.$$eval(selector, pageFunction[, arg])
- page.$eval(selector, pageFunction[, arg, options])
- page.accessibility
- page.addInitScript(script[, arg])
- page.addScriptTag([options])
- page.addStyleTag([options])
- page.bringToFront()
- page.check(selector[, options])
- page.click(selector[, options])
- page.close([options])
- page.content()
- page.context()
- page.coverage
- page.dblclick(selector[, options])
- page.dispatchEvent(selector, type[, eventInit, options])
- page.dragAndDrop(source, target[, options])
- page.emulateMedia([options])
- page.evaluate(pageFunction[, arg])
- page.evaluateHandle(pageFunction[, arg])
- page.exposeBinding(name, callback[, options])
- page.exposeFunction(name, callback)
- page.fill(selector, value[, options])
- page.focus(selector[, options])
- page.frame(frameSelector)
- page.frameLocator(selector)
- page.frames()
- page.getAttribute(selector, name[, options])
- page.getByAltText(text[, options])
- page.getByLabel(text[, options])
- page.getByPlaceholder(text[, options])
- page.getByRole(role[, options])
- page.getByTestId(testId)
- page.getByText(text[, options])
- page.getByTitle(text[, options])
- page.goBack([options])
- page.goForward([options])
- page.goto(url[, options])
- page.hover(selector[, options])
- page.innerHTML(selector[, options])
- page.innerText(selector[, options])
- page.inputValue(selector[, options])
- page.isChecked(selector[, options])
- page.isClosed()
- page.isDisabled(selector[, options])
- page.isEditable(selector[, options])
- page.isEnabled(selector[, options])
- page.isHidden(selector[, options])
- page.isVisible(selector[, options])
- page.keyboard
- page.locator(selector[, options])
- page.mainFrame()
- page.mouse
- page.opener()
- page.pause()
- page.pdf([options])
- page.press(selector, key[, options])
- page.reload([options])
- page.request
- page.route(url, handler[, options])
- page.routeFromHAR(har[, options])
- page.screenshot([options])
- page.selectOption(selector, values[, options])
- page.setChecked(selector, checked[, options])
- page.setContent(html[, options])
- page.setDefaultNavigationTimeout(timeout)
- page.setDefaultTimeout(timeout)
- page.setExtraHTTPHeaders(headers)
- page.setInputFiles(selector, files[, options])
- page.setViewportSize(viewportSize)
- page.tap(selector[, options])
- page.textContent(selector[, options])
- page.title()
- page.touchscreen
- page.type(selector, text[, options])
- page.uncheck(selector[, options])
- page.unroute(url[, handler])
- page.url()
- page.video()
- page.viewportSize()
- page.waitForEvent(event[, optionsOrPredicate, options])
- page.waitForFunction(pageFunction[, arg, options])
- page.waitForLoadState([state, options])
- page.waitForNavigation([options])
- page.waitForRequest(urlOrPredicate[, options])
- page.waitForResponse(urlOrPredicate[, options])
- page.waitForSelector(selector[, options])
- page.waitForTimeout(timeout)
- page.waitForURL(url[, options])
- page.workers()
page.on('close')
Added in: v1.8- type: <Page>
当页面关闭时触发。
page.on('console')
Added in: v1.8- type: <ConsoleMessage>
当页面内的 JavaScript 调用控制台 API 方法之一(例如 console.log 或 console.dir)时触发。如果页面抛出错误或警告,也会触发。
传递给 console.log 的参数显示为事件处理程序的参数。
处理 console 事件的示例:
page.on('console', async msg => {
const values = [];
for (const arg of msg.args())
values.push(await arg.jsonValue());
console.log(...values);
});
await page.evaluate(() => console.log('hello', 5, {foo: 'bar'}));
page.on('crash')
Added in: v1.8- type: <Page>
当页面崩溃时触发。如果浏览器页面尝试分配过多内存,可能会崩溃。当页面崩溃时,正在进行和后续的操作将抛出异常。
处理崩溃的最常见方法是捕获异常:
try {
// Crash might happen during a click.
await page.click('button');
// Or while waiting for an event.
await page.waitForEvent('popup');
} catch (e) {
// When the page crashes, exception message contains 'crash'.
}
page.on('dialog')
Added in: v1.8- type: <Dialog>
当出现 JavaScript 对话框(如 alert、prompt、confirm 或 beforeunload)时触发。监听器 必须 执行 dialog.accept([promptText]) 或 dialog.dismiss() 对话框 - 否则页面将冻结等待对话框,并且单击等操作将永远无法完成。
page.on('dialog', dialog => {
dialog.accept();
});
当没有 page.on('dialog') 监听器时,所有对话框都会自动关闭。
page.on('domcontentloaded')
Added in: v1.9- type: <Page>
当分发 JavaScript DOMContentLoaded 事件时触发。
page.on('download')
Added in: v1.8- type: <Download>
当附件下载开始时触发。用户可以通过传递的 Download 实例访问下载内容的基本文件操作。
page.on('filechooser')
Added in: v1.9- type: <FileChooser>
当文件选择器应该出现时触发,例如在单击 <input type=file> 后。Playwright 可以通过使用 fileChooser.setFiles(files[, options]) 设置输入文件来响应该事件,之后可以上传这些文件。
page.on('filechooser', async (fileChooser) => {
await fileChooser.setFiles('/tmp/myfile.pdf');
});
page.on('frameattached')
Added in: v1.9- type: <Frame>
当框架被附加时触发。
page.on('framedetached')
Added in: v1.9- type: <Frame>
当框架被分离时触发。
page.on('framenavigated')
Added in: v1.9- type: <Frame>
当框架导航到新 url 时触发。
page.on('load')
Added in: v1.8- type: <Page>
当分发 JavaScript load 事件时触发。
page.on('pageerror')
Added in: v1.9- type: <Error>
当页面内发生未捕获的异常时触发。
// 将所有未捕获的错误记录到终端
page.on('pageerror', exception => {
console.log(`Uncaught exception: "${exception}"`);
});
// 导航到带有异常的页面。
await page.goto('data:text/html,<script>throw new Error("Test")</script>');
page.on('popup')
Added in: v1.8- type: <Page>
当页面打开新选项卡或窗口时触发。除了 browserContext.on('page') 之外,还会触发此事件,但仅针对与此页面相关的弹出窗口。
页面可用的最早时刻是它已导航到初始 url 时。例如,当使用 window.open('http://example.com') 打开弹出窗口时,此事件将在对 "http://example.com" 的网络请求完成并且其响应已开始在弹出窗口中加载时触发。
// 请注意,Promise.all 防止了在评估和等待弹出窗口之间的竞争条件。
const [popup] = await Promise.all([
// 首先调用 waitForEvent 很重要。
page.waitForEvent('popup'),
// 打开弹出窗口。
page.evaluate(() => window.open('https://example.com')),
]);
console.log(await popup.evaluate('location.href'));
使用 page.waitForLoadState([state, options]) 等待页面进入特定状态(大多数情况下不需要)。
page.on('request')
Added in: v1.8- type: <Request>
当页面发出请求时触发。request 对象是只读的。要拦截和修改请求,请参阅 page.route(url, handler[, options]) 或 browserContext.route(url, handler[, options])。
page.on('requestfailed')
Added in: v1.9- type: <Request>
当请求失败(例如超时)时触发。
page.on('requestfailed', request => {
console.log(request.url() + ' ' + request.failure().errorText);
});
HTTP 错误响应(如 404 或 503)从 HTTP 角度来看仍然是成功的响应,因此请求将以 page.on('requestfinished') 事件完成,而不是 page.on('requestfailed')。只有当客户端无法从服务器获取 HTTP 响应(例如由于网络错误 net::ERR_FAILED)时,请求才会被视为失败。
page.on('requestfinished')
Added in: v1.9- type: <Request>
当请求在下载响应体后成功完成时触发。对于成功的响应,事件序列为 request、response 和 requestfinished。
page.on('response')
Added in: v1.8- type: <Response>
当收到请求的 response 状态和标头时触发。对于成功的响应,事件序列为 request、response 和 requestfinished。
page.on('websocket')
Added in: v1.9- type: <WebSocket>
当发送 WebSocket 请求时触发。
page.on('worker')
Added in: v1.8- type: <Worker>
当页面生成专用 WebWorker 时触发。
page.$(selector[, options])
Added in: v1.9selector<string> 要查询的选择器。有关更多详细信息,请参阅使用选择器。#options?<Object>- returns: <Promise<null|ElementHandle>>#
不鼓励使用 ElementHandle,请改用 Locator 对象和 web-first 断言。
该方法在页面内查找与指定选择器匹配的元素。如果没有元素匹配选择器,则返回值解析为 null。要等待页面上的元素,请使用 locator.waitFor([options])。
主框架的 frame.$(selector[, options]) 的快捷方式。
page.$$(selector)
Added in: v1.9不鼓励使用 ElementHandle,请改用 Locator 对象和 web-first 断言。
该方法在页面内查找与指定选择器匹配的所有元素。如果没有元素匹配选择器,则返回值解析为 []。
主框架的 frame.$$(selector) 的快捷方式。
page.$eval(selector, pageFunction[, arg, options])
Added in: v1.9selector<string> 要查询的选择器。有关更多详细信息,请参阅使用选择器。#pageFunction<function(Element)> 要在页面上下文中评估的函数。#arg?<EvaluationArgument> 传递给pageFunction的可选参数。#options?<Object>- returns: <Promise<Serializable>>#
此方法不等待元素通过可操作性检查,因此可能导致不稳定的测试。请改用 locator.evaluate(pageFunction[, arg, options])、其他 Locator 辅助方法或 Web-first 断言。
该方法在页面内查找与指定选择器匹配的元素,并将其作为第一个参数传递给 pageFunction。如果没有元素匹配选择器,该方法将抛出错误。返回 pageFunction 的值。
如果 pageFunction 返回 Promise,则 page.$eval(selector, pageFunction[, arg, options]) 将等待 promise 解析并返回其值。
Examples:
const searchValue = await page.$eval('#search', el => el.value);
const preloadHref = await page.$eval('link[rel=preload]', el => el.href);
const html = await page.$eval('.main-container', (e, suffix) => e.outerHTML + suffix, 'hello');
// 在 TypeScript 中,此示例需要在 el 上显式类型注释 (HTMLLinkElement):
const preloadHrefTS = await page.$eval('link[rel=preload]', (el: HTMLLinkElement) => el.href);
主框架的 frame.$eval(selector, pageFunction[, arg, options]) 的快捷方式。
page.$$eval(selector, pageFunction[, arg])
Added in: v1.9selector<string> 要查询的选择器。有关更多详细信息,请参阅使用选择器。#pageFunction<function(Array<Element>)> 要在页面上下文中评估的函数。#arg?<EvaluationArgument> 传递给pageFunction的可选参数。#- returns: <Promise<Serializable>>#
在大多数情况下,locator.evaluateAll(pageFunction[, arg])、其他 Locator 辅助方法和 Web-first 断言效果更好。
该方法在页面内查找与指定选择器匹配的所有元素,并将匹配元素的数组作为第一个参数传递给 pageFunction。返回 pageFunction 调用的结果。
如果 pageFunction 返回 Promise,则 page.$$eval(selector, pageFunction[, arg]) 将等待 promise 解析并返回其值。
Examples:
const divCounts = await page.$$eval('div', (divs, min) => divs.length >= min, 10);
page.addInitScript(script[, arg])
Added in: v1.8script<function|string|Object> 要在页面中评估的脚本。#arg?<Serializable> 传递给script的可选参数(仅在传递函数时支持)。#- returns: <Promise<void>>#
添加一个将在以下场景之一中评估的脚本:
- 每当页面导航时。
- 每当子框架被附加或导航时。在这种情况下,脚本在主要附加框架的上下文中评估。
脚本在文档创建后但在运行任何脚本之前进行评估。这对于修改 JavaScript 环境(例如为 Math.random 设定种子)很有用。
在页面加载之前覆盖 Math.random 的示例:
// preload.js
Math.random = () => 42;
// 在您的 playwright 脚本中,假设 preload.js 文件位于同一目录中
await page.addInitScript({ path: './preload.js' });
通过 browserContext.addInitScript(script[, arg]) 和 page.addInitScript(script[, arg]) 安装的多个脚本的评估顺序未定义。
page.addScriptTag([options])
Added in: v1.8options?<Object>- returns: <Promise<ElementHandle>>#
将具有所需 url 或内容的 <script> 标记添加到页面中。当脚本的 onload 触发或脚本内容注入框架时,返回添加的标记。
主框架的 frame.addScriptTag([options]) 的快捷方式。
page.addStyleTag([options])
Added in: v1.8options?<Object>- returns: <Promise<ElementHandle>>#
将具有所需 url 的 <link rel="stylesheet"> 标记或具有内容的 <style type="text/css"> 标记添加到页面中。当样式表的 onload 触发或 CSS 内容注入框架时,返回添加的标记。
主框架的 frame.addStyleTag([options]) 的快捷方式。
page.bringToFront()
Added in: v1.8将页面置于最前面(激活选项卡)。
page.check(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>force?<boolean> 是否绕过 可操作性 检查。默认为false。#noWaitAfter?<boolean> 启动导航的操作正在等待这些导航发生并且页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#position?<Object> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。Added in: v1.11#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.check(selector[, options]) 的快捷方式。
page.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> 是否绕过 可操作性 检查。默认为false。#modifiers?<Array<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#noWaitAfter?<boolean> 启动导航的操作正在等待这些导航发生并且页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#position?<Object> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#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 匹配的元素:
- Find an element matching
selector. If there is none, wait until a matching element is attached to the DOM. - Wait for actionability checks on the matched element, unless
forceoption is set. If the element is detached during the checks, the whole action is retried. - Scroll the element into view if needed.
- 使用 page.mouse 单击元素的中心或指定的
position。 - Wait for initiated navigations to either succeed or fail, unless
noWaitAfteroption is set.
When all steps combined have not finished during the specified timeout, this method throws a TimeoutError. Passing zero timeout disables this.
主框架的 frame.click(selector[, options]) 的快捷方式。
page.close([options])
Added in: v1.8options?<Object>runBeforeUnload?<boolean> 默认为false。是否运行 before unload 页面处理程序。#
- returns: <Promise<void>>#
如果 runBeforeUnload 为 false,则不运行任何 unload 处理程序并等待页面关闭。如果 runBeforeUnload 为 true,该方法将运行 unload 处理程序,但不会等待页面关闭。
默认情况下,page.close() 不运行 beforeunload 处理程序。
如果 runBeforeUnload 传递为 true,可能会调用 beforeunload 对话框,应通过 page.on('dialog') 事件手动处理。
page.content()
Added in: v1.8获取页面的完整 HTML 内容,包括 doctype。
page.context()
Added in: v1.8- returns: <BrowserContext>#
获取页面所属的浏览器上下文。
page.dblclick(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>button?<"left"|"right"|"middle"> 默认为left。#delay?<number>mousedown和mouseup之间等待的时间(以毫秒为单位)。默认为 0。#force?<boolean> 是否绕过 可操作性 检查。默认为false。#modifiers?<Array<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#noWaitAfter?<boolean> 启动导航的操作正在等待这些导航发生并且页面开始加载。您可以通过设置此标志来选择不等待。您仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#position?<Object> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#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选项。请注意,如果dblclick()的第一次点击触发了导航事件,此方法将抛出异常。
当所有步骤组合在指定的 timeout 期间未完成时,此方法将抛出 TimeoutError。传递零超时将禁用此功能。
page.dblclick() 分发两个 click 事件和一个 dblclick 事件。
主框架的 frame.dblclick(selector[, options]) 的快捷方式。
page.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 page.dispatchEvent('button#submit', 'click');
在底层,它根据给定的 type 创建事件实例,使用 eventInit 属性对其进行初始化,并在元素上分发它。默认情况下,事件是 composed、cancelable 和冒泡的。
由于 eventInit 是特定于事件的,请参阅事件文档以获取初始属性列表:
如果要将活动对象传递给事件,还可以将 JSHandle 指定为属性值:
// 注意:您只能在 Chromium 和 Firefox 中创建 DataTransfer
const dataTransfer = await page.evaluateHandle(() => new DataTransfer());
await page.dispatchEvent('#source', 'dragstart', { dataTransfer });
page.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#strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#targetPosition?<Object> 相对于元素填充框左上角放置在目标元素上。如果未指定,则使用元素的某个可见点。Added in: v1.14#timeout?<number> 最长时间(以毫秒为单位),默认为 30 秒,传递0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#trial?<boolean> 设置后,此方法仅执行 可操作性 检查并跳过操作。默认为false。用于等待元素准备好进行操作而不执行操作。#
- returns: <Promise<void>>#
此方法将源元素拖动到目标元素。它将首先移动到源元素,执行 mousedown,然后移动到目标元素并执行 mouseup。
await page.dragAndDrop('#source', '#target');
// 或者指定相对于元素左上角的精确位置:
await page.dragAndDrop('#source', '#target', {
sourcePosition: { x: 34, y: 7 },
targetPosition: { x: 10, y: 20 },
});
page.emulateMedia([options])
Added in: v1.8options?<Object>colorScheme?<null|"light"|"dark"|"no-preference"> 模拟'prefers-colors-scheme'媒体特性,支持的值为'light'、'dark'、'no-preference'。传递null可禁用配色方案模拟。Added in: v1.9#forcedColors?<null|"active"|"none"> 模拟'forced-colors'媒体特性,支持的值为'active'和'none'。传递null可禁用强制颜色模拟。Added in: v1.15#media?<null|"screen"|"print"> 更改页面的 CSS 媒体类型。唯一允许的值是'screen'、'print'和null。传递null可禁用 CSS 媒体模拟。Added in: v1.9#reducedMotion?<null|"reduce"|"no-preference"> 模拟'prefers-reduced-motion'媒体特性,支持的值为'reduce'、'no-preference'。传递null可禁用减少运动模拟。Added in: v1.12#
- returns: <Promise<void>>#
此方法通过 media 参数更改 CSS 媒体类型,和/或使用 colorScheme 参数更改 'prefers-colors-scheme' 媒体特性。
await page.evaluate(() => matchMedia('screen').matches);
// → true
await page.evaluate(() => matchMedia('print').matches);
// → false
await page.emulateMedia({ media: 'print' });
await page.evaluate(() => matchMedia('screen').matches);
// → false
await page.evaluate(() => matchMedia('print').matches);
// → true
await page.emulateMedia({});
await page.evaluate(() => matchMedia('screen').matches);
// → true
await page.evaluate(() => matchMedia('print').matches);
// → false
await page.emulateMedia({ colorScheme: 'dark' });
await page.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches);
// → true
await page.evaluate(() => matchMedia('(prefers-color-scheme: light)').matches);
// → false
await page.evaluate(() => matchMedia('(prefers-color-scheme: no-preference)').matches);
// → false
page.evaluate(pageFunction[, arg])
Added in: v1.8pageFunction<function|string> 要在页面上下文中评估的函数。#arg?<EvaluationArgument> 传递给pageFunction的可选参数。#- returns: <Promise<Serializable>>#
返回 pageFunction 调用的值。
如果传递给 page.evaluate(pageFunction[, arg]) 的函数返回 Promise,则 page.evaluate(pageFunction[, arg]) 将等待 promise 解析并返回其值。
如果传递给 page.evaluate(pageFunction[, arg]) 的函数返回非 Serializable 值,则 page.evaluate(pageFunction[, arg]) 解析为 undefined。Playwright 还支持传输一些无法通过 JSON 序列化的附加值:-0、NaN、Infinity、-Infinity。
将参数传递给 pageFunction:
const result = await page.evaluate(([x, y]) => {
return Promise.resolve(x * y);
}, [7, 8]);
console.log(result); // prints "56"
也可以传递字符串而不是函数:
console.log(await page.evaluate('1 + 2')); // prints "3"
const x = 10;
console.log(await page.evaluate(`1 + ${x}`)); // prints "11"
ElementHandle 实例可以作为参数传递给 page.evaluate(pageFunction[, arg]):
const bodyHandle = await page.evaluate('document.body');
const html = await page.evaluate(([body, suffix]) => body.innerHTML + suffix, [bodyHandle, 'hello']);
await bodyHandle.dispose();
主框架的 frame.evaluate(pageFunction[, arg]) 的快捷方式。
page.evaluateHandle(pageFunction[, arg])
Added in: v1.8pageFunction<function|string> 要在页面上下文中评估的函数。#arg?<EvaluationArgument> 传递给pageFunction的可选参数。#- returns: <Promise<JSHandle>>#
将 pageFunction 调用的值作为 JSHandle 返回。
page.evaluate(pageFunction[, arg]) 和 page.evaluateHandle(pageFunction[, arg]) 之间的唯一区别是 page.evaluateHandle(pageFunction[, arg]) 返回 JSHandle。
如果传递给 page.evaluateHandle(pageFunction[, arg]) 的函数返回 Promise,则 page.evaluateHandle(pageFunction[, arg]) 将等待 promise 解析并返回其值。
const aWindowHandle = await page.evaluateHandle(() => Promise.resolve(window));
aWindowHandle; // Handle for the window object.
也可以传递字符串而不是函数:
const aHandle = await page.evaluateHandle('document'); // Handle for the 'document'
JSHandle 实例可以作为参数传递给 page.evaluateHandle(pageFunction[, arg]):
const aHandle = await page.evaluateHandle(() => document.body);
const resultHandle = await page.evaluateHandle(body => body.innerHTML, aHandle);
console.log(await resultHandle.jsonValue());
await resultHandle.dispose();
page.exposeBinding(name, callback[, options])
Added in: v1.8name<string> 窗口对象上的函数名称。#callback<function> 将在 Playwright 的上下文中调用的回调函数。#options?<Object>- returns: <Promise<void>>#
此方法在此页面的每个框架的 window 对象上添加一个名为 name 的函数。当调用时,该函数执行 callback 并返回一个 Promise,该 Promise 解析为 callback 的返回值。如果 callback 返回 Promise,它将被等待。
callback 函数的第一个参数包含有关调用者的信息:{ browserContext: BrowserContext, page: Page, frame: Frame }。
有关上下文范围的版本,请参阅 browserContext.exposeBinding(name, callback[, options])。
通过 page.exposeBinding(name, callback[, options]) 安装的函数在导航后仍然存在。
将页面 URL 暴露给页面中所有框架的示例:
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
(async () => {
const browser = await webkit.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
await page.exposeBinding('pageURL', ({ page }) => page.url());
await page.setContent(`
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
`);
await page.click('button');
})();
传递元素句柄的示例:
await page.exposeBinding('clicked', async (source, element) => {
console.log(await element.textContent());
}, { handle: true });
await page.setContent(`
<script>
document.addEventListener('click', event => window.clicked(event.target));
</script>
<div>Click me</div>
<div>Or click me</div>
`);
page.exposeFunction(name, callback)
Added in: v1.8此方法在此页面的每个框架的 window 对象上添加一个名为 name 的函数。当调用时,该函数执行 callback 并返回一个 Promise,该 Promise 解析为 callback 的返回值。
如果 callback 返回 Promise,它将被等待。
有关上下文范围的暴露函数,请参阅 browserContext.exposeFunction(name, callback)。
通过 page.exposeFunction(name, callback) 安装的函数在导航后仍然存在。
向页面添加 sha256 函数的示例:
const { webkit } = require('playwright'); // Or 'chromium' or 'firefox'.
const crypto = require('crypto');
(async () => {
const browser = await webkit.launch({ headless: false });
const page = await browser.newPage();
await page.exposeFunction('sha256', text => crypto.createHash('sha256').update(text).digest('hex'));
await page.setContent(`
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
`);
await page.click('button');
})();
page.fill(selector, value[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#value<string> 要为<input>、<textarea>或[contenteditable]元素填充的值。#options?<Object>force?<boolean> 是否绕过 可操作性 检查。默认为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<void>>#
此方法等待匹配 selector 的元素,等待 可操作性 检查,聚焦元素,填充它并在填充后触发 input 事件。请注意,您可以传递空字符串以清除输入字段。
如果目标元素不是 <input>、<textarea> 或 [contenteditable] 元素,此方法将抛出错误。但是,如果元素位于具有关联 control 的 <label> 元素内,则将填充该控件。
要发送细粒度的键盘事件,请使用 page.type(selector, text[, options])。
主框架的 frame.fill(selector, value[, options]) 的快捷方式。
page.focus(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#timeout?<number> 最长时间(以毫秒为单位),默认为 30 秒,传递0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) or page.setDefaultTimeout(timeout) 方法更改默认值。#
- returns: <Promise<void>>#
此方法获取具有 selector 的元素并聚焦它。如果没有匹配 selector 的元素,该方法将等待直到匹配的元素出现在 DOM 中。
主框架的 frame.focus(selector[, options]) 的快捷方式。
page.frame(frameSelector)
Added in: v1.8返回匹配指定条件的框架。必须指定 name 或 url。
const frame = page.frame('frame-name');
const frame = page.frame({ url: /.*domain.*/ });
page.frameLocator(selector)
Added in: v1.17selector<string> 解析 DOM 元素时使用的选择器。有关更多详细信息,请参阅使用选择器。#- returns: <FrameLocator>#
当使用 iframe 时,您可以创建一个框架定位器,该定位器将进入 iframe 并允许在该 iframe 中选择元素。以下代码片段在 id 为 my-frame 的 iframe 中定位文本为 "Submit" 的元素,如 <iframe id="my-frame">:
const locator = page.frameLocator('#my-iframe').getByText('Submit');
await locator.click();
page.frames()
Added in: v1.8附加到页面的所有框架的数组。
page.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>>#
返回元素属性值。
page.getByAltText(text[, options])
Added in: v1.27允许通过 alt 文本定位元素。例如,此方法将通过 alt 文本 "Castle" 找到图像:
<img alt='Castle'>
page.getByLabel(text[, options])
Added in: v1.27允许通过关联标签的文本定位输入元素。例如,此方法将在以下 DOM 中通过标签文本 Password 找到输入:
<label for="password-input">Password:</label>
<input id="password-input">
page.getByPlaceholder(text[, options])
Added in: v1.27允许通过占位符文本定位输入元素。例如,此方法将通过占位符 "Country" 找到输入:
<input placeholder="Country">
page.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的更多信息。
允许通过 ARIA 角色、ARIA 属性 和 可访问名称 定位元素。请注意,角色选择器不能替代可访问性审计和一致性测试,而是提供有关 ARIA 准则的早期反馈。
请注意,许多 html 元素具有隐式 定义的角色,该角色由角色选择器识别。您可以在此处找到所有 支持的角色。ARIA 准则不建议通过将 role 和/或 aria-* 属性设置为默认值来重复隐式角色和属性。
page.getByTestId(testId)
Added in: v1.27通过测试 id 定位元素。默认情况下,data-testid 属性用作测试 id。如有必要,请使用 selectors.setTestIdAttribute(attributeName) 配置不同的测试 id 属性。
page.getByText(text[, options])
Added in: v1.27允许定位包含给定文本的元素。考虑以下 DOM 结构:
<div>Hello <span>world</span></div>
<div>Hello</div>
您可以通过文本子字符串、精确字符串或正则表达式进行定位:
// Matches <span>
page.getByText('world')
// Matches first <div>
page.getByText('Hello world')
// Matches second <div>
page.getByText('Hello', { exact: true })
// Matches both <div>s
page.getByText(/Hello/)
// Matches second <div>
page.getByText(/^hello$/i)
另请参阅 locator.filter([options]),它允许按其他条件(如可访问角色)进行匹配,然后按文本内容进行过滤。
按文本匹配始终规范化空格,即使是精确匹配也是如此。例如,它将多个空格转换为一个,将换行符转换为空格,并忽略前导和尾随空格。
类型为 button 和 submit 的输入元素通过其 value 而不是文本内容进行匹配。例如,按文本 "Log in" 定位匹配 <input type=button value="Log in">。
page.getByTitle(text[, options])
Added in: v1.27允许通过标题定位元素。例如,此方法将通过标题 "Submit" 找到按钮:
<button title='Place the order'>Order Now</button>
page.goBack([options])
Added in: v1.8options?<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<null|Response>>#
返回主要资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。如果无法后退,则返回 null。
导航到历史记录中的上一页。
page.goForward([options])
Added in: v1.8options?<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<null|Response>>#
返回主要资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。如果无法前进,则返回 null。
导航到历史记录中的下一页。
page.goto(url[, options])
Added in: v1.8url<string> 页面导航到的 URL。url 应包含方案,例如https://。当通过上下文选项提供baseURL且传递的 URL 是路径时,它将通过new URL()构造函数合并。#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.goto(url[, options]) 的快捷方式
page.hover(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>force?<boolean> 是否绕过 可操作性 检查。默认为false。#modifiers?<Array<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#position?<Object> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#strict?<boolean> 若设为true,则要求选择器必须唯一匹配一个元素。若匹配多个元素,方法将抛出异常。新增于:v1.14#timeout?<number> 最大等待时间(单位:毫秒),默认为 30 秒。传入0可禁用超时。该默认值可通过 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法修改。#trial?<boolean> 若设为true,该方法仅执行 可操作性 检查,但不会实际执行悬停操作。默认为false。适用于仅需等待元素准备好、而不立即交互的场景。新增于:v1.11#
- 返回值: <Promise<void>>#
该方法通过以下步骤对匹配 selector 的元素执行悬停操作:
- 查找匹配
selector的元素。若当前无匹配元素,则等待其被挂载到 DOM 中。 - 对匹配的元素执行 可操作性 检查(除非设置了
force: true)。若检查过程中元素被移除,则整个操作会自动重试。 - 如有必要,将元素滚动到视口内。
- 使用 page.mouse 将鼠标悬停在元素中心(或指定的
position位置)。 - 等待由该操作触发的页面导航完成(成功或失败),除非设置了
noWaitAfter: true。
若上述所有步骤在指定的 timeout 时间内未完成,该方法将抛出 TimeoutError 异常。传入 timeout: 0 可禁用超时。
💡 此方法是主框架(main frame)上 frame.hover(selector[, options]) 的快捷方式。
page.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。
page.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。
page.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> 元素内,则返回该控件的值。
page.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>>#
返回元素是否被选中。如果元素不是复选框或单选输入,则抛出错误。
page.isClosed()
Added in: v1.8指示页面是否已关闭。
page.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 相反。
page.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>>#
返回元素是否 可编辑。
page.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>>#
返回元素是否 启用。
page.isHidden(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#timeout?<number> 已弃用 此选项被忽略。page.isHidden(selector[, options]) 不等待元素变为隐藏并立即返回。#
- returns: <Promise<boolean>>#
返回元素是否隐藏,与 visible 相反。不匹配任何元素的 selector 被视为隐藏。
page.isVisible(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#timeout?<number> 已弃用 此选项被忽略。page.isVisible(selector[, options]) 不等待元素变为可见并立即返回。#
- returns: <Promise<boolean>>#
返回元素是否 可见。不匹配任何元素的 selector 被视为不可见。
page.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>。#
此方法返回一个元素定位器,可用于在此页面/框架上执行操作。定位器在执行操作之前立即解析为元素,因此对同一定位器的一系列操作实际上可以在不同的 DOM 元素上执行。如果这些操作之间的 DOM 结构发生了变化,就会发生这种情况。
page.mainFrame()
Added in: v1.8页面的主框架。页面保证有一个在导航期间持续存在的主框架。
page.opener()
Added in: v1.8返回弹出页面的开启者,对于其他页面返回 null。如果开启者已关闭,则返回 null。
page.pause()
Added in: v1.9暂停脚本执行。Playwright 将停止执行脚本,并等待用户按下页面覆盖层中的“恢复”按钮或在 DevTools 控制台中调用 playwright.resume()。
用户可以在暂停时检查选择器或执行手动步骤。恢复将从暂停的位置继续运行原始脚本。
此方法要求 Playwright 以有头模式启动,即在 browserType.launch([options]) 中将 headless 值设置为 falsy。
page.pdf([options])
Added in: v1.8options?<Object>displayHeaderFooter?<boolean> 显示页眉和页脚。默认为false。#footerTemplate?<string> 打印页脚的 HTML 模板。应使用与headerTemplate相同的格式。#format?<string> 纸张格式。如果设置,则优先于width或height选项。默认为 'Letter'。#headerTemplate?<string> 打印页眉的 HTML 模板。应为有效的 HTML 标记,使用以下类将打印值注入其中:#'date'格式化的打印日期'title'文档标题'url'文档位置'pageNumber'当前页码'totalPages'文档中的总页数
height?<string|number> 纸张高度,接受带单位标签的值。#landscape?<boolean> 纸张方向。默认为false。#margin?<Object> 纸张边距,默认为无。#pageRanges?<string> 要打印的纸张范围,例如 '1-5, 8, 11-13'。默认为空字符串,表示打印所有页面。#path?<string> 保存 PDF 的文件路径。如果path是相对路径,则相对于当前工作目录解析。如果未提供路径,PDF 将不会保存到磁盘。#preferCSSPageSize?<boolean> 使页面中声明的任何 CSS@page大小优先于width和height或format选项中声明的内容。默认为false,将缩放内容以适应纸张大小。#printBackground?<boolean> 打印背景图形。默认为false。#scale?<number> 网页渲染的缩放比例。默认为1。缩放量必须在 0.1 到 2 之间。#width?<string|number> 纸张宽度,接受带单位标签的值。#
- returns: <Promise<Buffer>>#
返回 PDF 缓冲区。
生成 PDF 目前仅在 Chromium 无头模式下支持。
page.pdf() 使用 print CSS 媒体生成页面的 PDF。要使用 screen 媒体生成 PDF,请在调用 page.pdf() 之前调用 page.emulateMedia([options]):
默认情况下,page.pdf() 生成的 PDF 会修改颜色以便打印。使用 -webkit-print-color-adjust 属性可强制渲染精确的颜色。
// 生成具有 'screen' 媒体类型的 PDF。
await page.emulateMedia({media: 'screen'});
await page.pdf({path: 'page.pdf'});
width、height 和 margin 选项接受带单位标签的值。未标记的值被视为像素。
一些示例:
page.pdf({width: 100})- 以 100 像素的宽度打印page.pdf({width: '100px'})- 以 100 像素的宽度打印page.pdf({width: '10cm'})- 以 10 厘米的宽度打印。
所有可能的单位是:
px- 像素in- 英寸cm- 厘米mm- 毫米
format 选项为:
Letter: 8.5in x 11inLegal: 8.5in x 14inTabloid: 11in x 17inLedger: 17in x 11inA0: 33.1in x 46.8inA1: 23.4in x 33.1inA2: 16.54in x 23.4inA3: 11.7in x 16.54inA4: 8.27in x 11.7inA5: 5.83in x 8.27inA6: 4.13in x 5.83in
headerTemplate 和 footerTemplate 标记具有以下限制: > 1. 模板内的脚本标签不会被执行。> 2. 页面样式在模板内不可见。
page.press(selector, key[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#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>>#
聚焦元素,然后使用 keyboard.down(key) 和 keyboard.up(key)。
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"。当使用修饰键指定时,会按下并保持修饰键,同时按下后续键。
const page = await browser.newPage();
await page.goto('https://keycode.info');
await page.press('body', 'A');
await page.screenshot({ path: 'A.png' });
await page.press('body', 'ArrowLeft');
await page.screenshot({ path: 'ArrowLeft.png' });
await page.press('body', 'Shift+O');
await page.screenshot({ path: 'O.png' });
await browser.close();
page.reload([options])
Added in: v1.8options?<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<null|Response>>#
此方法重新加载当前页面,就像用户触发浏览器刷新一样。返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。
page.route(url, handler[, options])
Added in: v1.8url<string|RegExp|function(URL):boolean> 用于路由匹配的 glob 模式、正则表达式模式或接收 URL 的谓词。当通过上下文选项提供了baseURL且传递的 URL 是路径时,它将通过new URL()构造函数合并。#handler<function(Route, Request)> 用于路由请求的处理函数。#options?<Object>- returns: <Promise<void>>#
路由提供了修改页面发出的网络请求的能力。
一旦启用路由,每个匹配 url 模式的请求都将停滞,除非它被继续、完成或中止。
如果响应是重定向,处理程序将仅为第一个 url 调用。
page.route(url, handler[, options]) 不会拦截被 Service Worker 拦截的请求。请参阅此问题。我们建议在使用请求拦截时通过将 Browser.newContext.serviceWorkers 设置为 'block' 来禁用 Service Worker。
一个简单的处理程序示例,中止所有图像请求:
const page = await browser.newPage();
await page.route('**/*.{png,jpg,jpeg}', route => route.abort());
await page.goto('https://example.com');
await browser.close();
或使用正则表达式模式的相同代码片段:
const page = await browser.newPage();
await page.route(/(\.png$)|(\.jpg$)/, route => route.abort());
await page.goto('https://example.com');
await browser.close();
可以检查请求以决定路由操作。例如,模拟包含某些 post 数据的所有请求,并保留所有其他请求:
await page.route('/api/**', route => {
if (route.request().postData().includes('my-string'))
route.fulfill({ body: 'mocked-data' });
else
route.continue();
});
当请求匹配两个处理程序时,页面路由优先于浏览器上下文路由(使用 browserContext.route(url, handler[, options]) 设置)。
要删除带有其处理程序的路由,您可以使用 page.unroute(url[, handler])。
启用路由会禁用 http 缓存。
page.routeFromHAR(har[, options])
Added in: v1.23如果指定,页面中发出的网络请求将从 HAR 文件提供服务。阅读有关从 HAR 重放的更多信息。
Playwright 不会从 HAR 文件提供被 Service Worker 拦截的请求。请参阅此问题。我们建议在使用请求拦截时通过将 Browser.newContext.serviceWorkers 设置为 'block' 来禁用 Service Worker。
page.screenshot([options])
Added in: v1.8options?<Object>animations?<"disabled"|"allow"> 当设置为"disabled"时,停止 CSS 动画、CSS 过渡和 Web 动画。动画根据其持续时间获得不同的处理:#- 有限动画会快进到完成,因此它们将触发
transitionend事件。 - 无限动画被取消到初始状态,然后在截图后重放。
默认为
"allow",保持动画不变。- 有限动画会快进到完成,因此它们将触发
caret?<"hide"|"initial"> 当设置为"hide"时,截图将隐藏文本光标。当设置为"initial"时,文本光标行为将不会被更改。默认为"hide"。#fullPage?<boolean> 当为 true 时,截取完整的可滚动页面,而不是当前可见的视口。默认为false。#mask?<Array<Locator>> 指定在截图时应遮罩的定位器。遮罩的元素将被粉红色框#FF00FF覆盖,完全覆盖其边界框。#omitBackground?<boolean> 隐藏默认的白色背景并允许捕获透明截图。不适用于jpeg图像。默认为false。#path?<string> 保存图像的文件路径。截图类型将从文件扩展名推断。如果path是相对路径,则相对于当前工作目录解析。如果未提供路径,图像将不会保存到磁盘。#scale?<"css"|"device"> 当设置为"css"时,截图将在页面上每个 css 像素有一个像素。对于高 dpi 设备,这将使截图保持较小。使用"device"选项将在每个设备像素产生一个像素,因此高 dpi 设备的截图将是两倍大甚至更大。#默认为
"device"。timeout?<number> 最大时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#type?<"png"|"jpeg"> 指定截图类型,默认为png。#
返回包含捕获的截图的缓冲区。
page.selectOption(selector, values[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#values<null|string|ElementHandle|Array<string>|Object|Array<ElementHandle>|Array<Object>> 要选择的选项。如果<select>具有multiple属性,则选择所有匹配的选项,否则仅选择与传递的选项之一匹配的第一个选项。字符串值等同于{value:'string'}。如果所有指定的属性都匹配,则认为选项匹配。#options?<Object>force?<boolean> 是否绕过可操作性检查。默认为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 的元素,等待可操作性检查,等待直到所有指定的选项都存在于 <select> 元素中并选择这些选项。
如果目标元素不是 <select> 元素,此方法会抛出错误。但是,如果元素位于具有关联control的 <label> 元素内,则将使用该控件。
返回已成功选择的选项值数组。
一旦选择了所有提供的选项,就会触发 change 和 input 事件。
// 匹配值的单个选择
page.selectOption('select#colors', 'blue');
// 匹配标签的单个选择
page.selectOption('select#colors', { label: 'Blue' });
// 多个选择
page.selectOption('select#colors', ['red', 'green', 'blue']);
主框架的 frame.selectOption(selector, values[, options]) 的快捷方式。
page.setChecked(selector, checked[, options])
Added in: v1.15selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#checked<boolean> 是否选中或取消选中复选框。#options?<Object>force?<boolean> 是否绕过可操作性检查。默认为false。#noWaitAfter?<boolean> 启动导航的操作会等待这些导航发生并等待页面开始加载。您可以通过设置此标志选择不等待。您只需要在特殊情况下使用此选项,例如导航到无法访问的页面。默认为false。#position?<Object> 相对于元素内边距框左上角使用的点。如果未指定,则使用元素的某个可见点。#strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。#timeout?<number> 最大时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#trial?<boolean> 当设置时,此方法仅执行可操作性检查并跳过操作。默认为false。适用于等待元素准备好操作而不执行它。#
- returns: <Promise<void>>#
此方法通过执行以下步骤来选中或取消选中匹配 selector 的元素:
- 查找匹配
selector的元素。如果没有,则等待直到匹配的元素被附加到 DOM。 - 确保匹配的元素是复选框或单选按钮输入。如果不是,此方法会抛出异常。
- 如果元素已经具有正确的选中状态,此方法立即返回。
- 对匹配的元素等待可操作性检查,除非设置了
force选项。如果元素在检查期间被分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 在元素中心点击。
- 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。 - 确保元素现在已选中或未选中。如果不是,此方法会抛出异常。
当所有步骤组合在指定的 timeout 期间内未完成时,此方法会抛出 TimeoutError。传入零超时可禁用此功能。
主框架的 frame.setChecked(selector, checked[, options]) 的快捷方式。
page.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>>#
page.setDefaultNavigationTimeout(timeout)
Added in: v1.8此设置将更改以下方法和相关快捷方式的默认最大导航时间:
- page.goBack([options])
- page.goForward([options])
- page.goto(url[, options])
- page.reload([options])
- page.setContent(html[, options])
- page.waitForNavigation([options])
- page.waitForURL(url[, options])
page.setDefaultTimeout(timeout)
Added in: v1.8此设置将更改所有接受 timeout 选项的方法的默认最大时间。
page.setExtraHTTPHeaders(headers)
Added in: v1.8额外的 HTTP 标头将与页面启动的每个请求一起发送。
page.setExtraHTTPHeaders(headers) 不保证出站请求中标头的顺序。
page.setInputFiles(selector, files[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#files<string|Array<string>|Object|Array<Object>>#options?<Object>noWaitAfter?<boolean> 启动导航的操作会等待这些导航发生并等待页面开始加载。您可以通过设置此标志选择不等待。您只需要在特殊情况下使用此选项,例如导航到无法访问的页面。默认为false。#strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#timeout?<number> 最大时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#
- returns: <Promise<void>>#
将文件输入的值设置为这些文件路径或文件。如果某些 filePaths 是相对路径,则相对于当前工作目录解析。对于空数组,清除选定的文件。
此方法期望 selector 指向 input 元素。但是,如果元素位于具有关联 control 的 <label> 元素内,则以该控件为目标。
page.setViewportSize(viewportSize)
Added in: v1.8在单个浏览器中有多个页面的情况下,每个页面都可以有自己的视口大小。但是,browser.newContext([options]) 允许一次为上下文中的所有页面设置视口大小(等等)。
page.setViewportSize(viewportSize) 将调整页面大小。很多网站不希望手机改变大小,因此您应该在导航到页面之前设置视口大小。page.setViewportSize(viewportSize) 还将重置 screen 大小,如果您需要更好地控制这些属性,请使用带有 screen 和 viewport 参数的 browser.newContext([options])。
const page = await browser.newPage();
await page.setViewportSize({
width: 640,
height: 480,
});
await page.goto('https://example.com');
page.tap(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>force?<boolean> 是否绕过可操作性检查。默认为false。#modifiers?<Array<"Alt"|"Control"|"Meta"|"Shift">> 要按下的修饰键。确保在操作期间仅按下这些修饰键,然后恢复当前的修饰键。如果未指定,则使用当前按下的修饰键。#noWaitAfter?<boolean> 启动导航的操作会等待这些导航发生并等待页面开始加载。您可以通过设置此标志选择不等待。您只需要在特殊情况下使用此选项,例如导航到无法访问的页面。默认为false。#position?<Object> 相对于元素内边距框左上角使用的点。如果未指定,则使用元素的某个可见点。#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。传入零超时可禁用此功能。
page.tap(selector[, options]) 要求浏览器上下文的 hasTouch 选项设置为 true。
主框架的 frame.tap(selector[, options]) 的快捷方式。
page.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。
page.title()
Added in: v1.8返回页面的标题。主框架的 frame.title() 的快捷方式。
page.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 事件。page.type 可用于发送精细的键盘事件。要填写表单字段中的值,请使用 page.fill(selector, value[, options])。
要按下特殊键,如 Control 或 ArrowDown,请使用 keyboard.press(key[, options])。
await page.type('#mytextarea', 'Hello'); // 立即输入
await page.type('#mytextarea', 'World', {delay: 100}); // 输入更慢,像用户一样
主框架的 frame.type(selector, text[, options]) 的快捷方式。
page.uncheck(selector[, options])
Added in: v1.8selector<string> 用于搜索元素的选择器。如果有多个元素满足选择器,则将使用第一个。有关更多详细信息,请参阅使用选择器。#options?<Object>force?<boolean> 是否绕过可操作性检查。默认为false。#noWaitAfter?<boolean> 启动导航的操作会等待这些导航发生并等待页面开始加载。您可以通过设置此标志选择不等待。您只需要在特殊情况下使用此选项,例如导航到无法访问的页面。默认为false。#position?<Object> 相对于元素内边距框左上角使用的点。如果未指定,则使用元素的某个可见点。Added in: v1.11#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.uncheck(selector[, options]) 的快捷方式。
page.unroute(url[, handler])
Added in: v1.8url<string|RegExp|function(URL):boolean> 用于路由匹配的 glob 模式、正则表达式模式或接收 URL 的谓词。#handler?<function(Route, Request)> 用于路由请求的可选处理函数。#- returns: <Promise<void>>#
删除使用 page.route(url, handler[, options]) 创建的路由。当未指定 handler 时,删除 url 的所有路由。
page.url()
Added in: v1.8主框架的 frame.url() 的快捷方式。
page.video()
Added in: v1.8与此页面关联的视频对象。
page.viewportSize()
Added in: v1.8page.waitForEvent(event[, optionsOrPredicate, options])
Added in: v1.8event<string> 事件名称,通常传递给*.on(event)的同一个。#optionsOrPredicate?<function|Object> 接收事件的谓词或选项对象。可选。#predicate<function> 接收事件数据并在应该解析等待时解析为真值。timeout?<number> 最大等待时间(毫秒)。默认为30000(30 秒)。传入0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 更改默认值。
options?<Object>- returns: <Promise<Object>>#
等待事件触发并将其值传递给谓词函数。当谓词返回真值时返回。如果在事件触发之前页面关闭,将抛出错误。返回事件数据值。
// 注意 Promise.all 防止点击和等待事件之间的竞争条件。
// 在点击之间等待事件之间的竞争条件。
const [frame, _] = await Promise.all([
// 在点击之前调用 waitForEvent 以设置等待很重要。
page.waitForEvent('framenavigated'),
// 触发导航。
page.getByRole('button').click(),
]);
page.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 返回真值时返回。它解析为真值的 JSHandle。
page.waitForFunction(pageFunction[, arg, options]) 可用于观察视口大小变化:
const { webkit } = require('playwright'); // 或 'chromium' 或 'firefox'。
(async () => {
const browser = await webkit.launch();
const page = await browser.newPage();
const watchDog = page.waitForFunction(() => window.innerWidth < 100);
await page.setViewportSize({width: 50, height: 50});
await watchDog;
await browser.close();
})();
要将参数传递给 page.waitForFunction(pageFunction[, arg, options]) 函数的谓词:
const selector = '.foo';
await page.waitForFunction(selector => !!document.querySelector(selector), selector);
主框架的 frame.waitForFunction(pageFunction[, arg, options]) 的快捷方式。
page.waitForLoadState([state, options])
Added in: v1.8state?<"load"|"domcontentloaded"|"networkidle"> 要等待的可选加载状态,默认为load。如果在加载当前文档时已经达到该状态,该方法将立即解析。可以是以下之一:#'load'- 等待load事件触发。'domcontentloaded'- 等待DOMContentLoaded事件触发。'networkidle'- 等待直到至少500毫秒内没有网络连接。
options?<Object>timeout?<number> 最大操作时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 browserContext.setDefaultNavigationTimeout(timeout)、browserContext.setDefaultTimeout(timeout)、page.setDefaultNavigationTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#
- returns: <Promise<void>>#
当达到所需的加载状态时返回。
当页面达到所需的加载状态时解析,默认为 load。调用此方法时必须已提交导航。如果当前文档已经达到所需状态,则立即解析。
await page.getByRole('button').click(); // 点击触发导航。
await page.waitForLoadState(); // Promise 在 'load' 事件后解析。
const [popup] = await Promise.all([
// 在点击之前调用 waitForEvent 以设置等待很重要。
page.waitForEvent('popup'),
// 点击触发弹窗。
page.getByRole('button').click(),
])
await popup.waitForLoadState('domcontentloaded'); // Promise 在 'domcontentloaded' 事件后解析。
console.log(await popup.title()); // 弹窗已准备好使用。
主框架的 frame.waitForLoadState([state, options]) 的快捷方式。
page.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>>#
等待主框架导航并返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。在导航到不同锚点或由于使用 History API 导航的情况下,导航将使用 null 解析。
当页面导航到新 URL 或重新加载时解析。当您运行将间接导致页面导航的代码时,这很有用。例如,点击目标具有从 setTimeout 触发导航的 onclick 处理程序。考虑以下示例:
// 注意 Promise.all 防止点击和等待导航之间的竞争条件。
const [response] = await Promise.all([
// 在点击之前调用 waitForNavigation 以设置等待很重要。
page.waitForNavigation(),
// 点击链接将间接导致导航。
page.locator('a.delayed-navigation').click(),
]);
使用 History API 更改 URL 被认为是导航。
主框架的 frame.waitForNavigation([options]) 的快捷方式。
page.waitForRequest(urlOrPredicate[, options])
Added in: v1.8urlOrPredicate<string|RegExp|function(Request):boolean|Promise<boolean>> 请求 URL 字符串、正则表达式或接收 Request 对象的谓词。#options?<Object>timeout?<number> 最大等待时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 page.setDefaultTimeout(timeout) 方法更改默认值。#
- returns: <Promise<Request>>#
等待匹配的请求并返回它。有关事件的更多详细信息,请参阅等待事件。
// 注意 Promise.all 防止点击和等待请求之间的竞争条件。
const [request] = await Promise.all([
// 等待具有指定 url 的下一个请求
page.waitForRequest('https://example.com/resource'),
// 触发请求
page.click('button.triggers-request'),
]);
// 使用谓词的替代方法。
const [request] = await Promise.all([
// 等待符合某些条件的下一个请求
page.waitForRequest(request => request.url() === 'https://example.com' && request.method() === 'GET'),
// 触发请求
page.click('button.triggers-request'),
]);
page.waitForResponse(urlOrPredicate[, options])
Added in: v1.8urlOrPredicate<string|RegExp|function(Response):boolean|Promise<boolean>> 请求 URL 字符串、正则表达式或接收 Response 对象的谓词。当通过上下文选项提供了baseURL且传递的 URL 是路径时,它将通过new URL()构造函数合并。#options?<Object>timeout?<number> 最大等待时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#
- returns: <Promise<Response>>#
返回匹配的响应。有关事件的更多详细信息,请参阅等待事件。
// 注意 Promise.all 防止点击和等待响应之间的竞争条件。
const [response] = await Promise.all([
// 等待具有指定 url 的下一个响应
page.waitForResponse('https://example.com/resource'),
// 触发响应
page.click('button.triggers-response'),
]);
// 使用谓词的替代方法。
const [response] = await Promise.all([
// 等待符合某些条件的下一个响应
page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200),
// 触发响应
page.click('button.triggers-response'),
]);
page.waitForSelector(selector[, options])
Added in: v1.8selector<string> 要查询的选择器。有关更多详细信息,请参阅使用选择器。#options?<Object>state?<"attached"|"detached"|"visible"|"hidden"> 默认为'visible'。可以是以下之一:#'attached'- 等待元素存在于 DOM 中。'detached'- 等待元素不存在于 DOM 中。'visible'- 等待元素具有非空边界框且没有visibility:hidden。请注意,没有任何内容或具有display:none的元素具有空边界框,不被认为可见。'hidden'- 等待元素从 DOM 分离,或具有空边界框或visibility:hidden。这与'visible'选项相反。
strict?<boolean> 当为 true 时,调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用将抛出异常。Added in: v1.14#timeout?<number> 最大时间(毫秒),默认为 30 秒,传入0可禁用超时。可以使用 browserContext.setDefaultTimeout(timeout) 或 page.setDefaultTimeout(timeout) 方法更改默认值。#
- returns: <Promise<null|ElementHandle>>#
当选择器指定的元素满足 state 选项时返回。如果等待 hidden 或 detached,则返回 null。
Playwright 在执行操作之前会自动等待元素准备就绪。使用 Locator 对象和 Web-first 断言可以使代码无需等待选择器。
等待 selector 满足 state 选项(从 dom 中出现/消失,或变为可见/隐藏)。如果在调用方法时 selector 已经满足条件,该方法将立即返回。如果选择器在 timeout 毫秒内不满足条件,函数将抛出异常。
此方法在导航之间有效:
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.waitForSelector('img');
console.log('Loaded image: ' + await element.getAttribute('src'));
}
await browser.close();
})();
page.waitForTimeout(timeout)
Added in: v1.8等待指定的 timeout(以毫秒为单位)。
请注意,page.waitForTimeout() 仅应用于调试。在生产中使用计时器的测试往往会变得不稳定。请改用网络事件、选择器变为可见等信号。
// wait for 1 second
await page.waitForTimeout(1000);
主框架的 frame.waitForTimeout(timeout) 的快捷方式。
page.waitForURL(url[, options])
Added in: v1.11url<string|RegExp|function(URL):boolean> 在等待导航时匹配的 glob 模式、正则表达式模式或接收 URL 的谓词。请注意,如果参数是不包含通配符的字符串,该方法将等待导航到与字符串完全相等的 URL。#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>>#
等待主框架导航到给定的 URL。
await page.click('a.delayed-navigation'); // 点击链接将间接导致导航
await page.waitForURL('**/target.html');
主框架的 frame.waitForURL(url[, options]) 的快捷方式。
page.workers()
Added in: v1.8此方法返回与页面关联的所有专用 WebWorkers。
这不包含 ServiceWorkers
page.accessibility
Added in: v1.8- type: <Accessibility>
已弃用 此属性已弃用。如果您需要测试页面可访问性,请使用其他库,例如 Axe。请参阅我们的 Node.js 指南 以了解与 Axe 的集成。
page.coverage
Added in: v1.8- type: <Coverage>
目前仅适用于 Chromium。
特定于浏览器的 Coverage 实现。有关更多详细信息,请参阅 Coverage。
page.keyboard
Added in: v1.8- type: <Keyboard>
page.mouse
Added in: v1.8- type: <Mouse>
page.request
Added in: v1.16- type: <APIRequestContext>
与此页面关联的 API 测试助手。此方法返回与页面上下文上的 browserContext.request 相同的实例。有关更多详细信息,请参阅 browserContext.request。
page.touchscreen
Added in: v1.8- type: <Touchscreen>