Skip to main content

事件

Playwright 允许监听网页上发生的各种类型的事件,例如网络请求、子页面的创建、专用工作线程等。有几种订阅此类事件的方法,例如等待事件或添加或删除事件监听器。

等待事件

大多数时候,脚本需要等待特定事件发生。以下是一些典型的事件等待模式。

使用 page.waitForRequest(urlOrPredicate[, options]) 等待具有指定 url 的请求:

// 请注意,Promise.all 防止了点击和等待请求之间的竞态条件。
const [request] = await Promise.all([
page.waitForRequest('**/*logo*.png'),
// 此操作触发请求
page.goto('https://wikipedia.org')
]);
console.log(request.url());

等待弹出窗口:

// 请注意,Promise.all 防止了点击和等待弹出窗口之间的竞态条件。
const [popup] = await Promise.all([
// 务必先调用 waitForEvent。
page.waitForEvent('popup'),
// 此操作触发弹出窗口
page.evaluate('window.open()')
]);
await popup.goto('https://wikipedia.org');

添加/删除事件监听器

有时,事件在随机时间发生,而不是等待它们,需要处理它们。Playwright 支持用于订阅和取消订阅事件的传统语言机制:

page.on('request', request => console.log(`Request sent: ${request.url()}`));
const listener = request => console.log(`Request finished: ${request.url()}`);
page.on('requestfinished', listener);
await page.goto('https://wikipedia.org');

page.off('requestfinished', listener);
await page.goto('https://www.openstreetmap.org/');

添加一次性监听器

如果某个事件需要处理一次,有一个方便的 API:

page.once('dialog', dialog => dialog.accept("2021"));
await page.evaluate("prompt('Enter a number:')");