跳到主要内容

页面

页面

每个 BrowserContext 可以包含多个页面。Page 代表浏览器上下文中的一个标签页或弹出窗口。它用于导航到 URL 并与页面内容交互。

// 创建一个页面
const page = await context.newPage();

// 显式导航,类似于在浏览器中输入URL
await page.goto('http://example.com');
// 填写输入框
await page.locator('#search').fill('query');

// 通过点击链接隐式导航
await page.locator('#submit').click();
// 获取新URL
console.log(page.url());

多页面

每个浏览器上下文可以托管多个页面(标签页)。

  • 每个页面都表现得像获得焦点的活动页面,无需手动将其置顶
  • 上下文中的页面会继承上下文级别的模拟设置,如视口大小、自定义网络路由或浏览器语言
// 创建两个页面
const pageOne = await context.newPage();
const pageTwo = await context.newPage();

// 获取浏览器上下文中的所有页面
const allPages = context.pages();

处理新页面

浏览器上下文的 page 事件可用于获取在上下文中创建的新页面。这可用于处理通过 target="_blank" 链接打开的新页面。

// 在点击前开始等待新页面。注意这里没有await
const pagePromise = context.waitForEvent('page');
await page.getByText('打开新标签页').click();
const newPage = await pagePromise;
// 正常与新页面交互
await newPage.getByRole('button').click();
console.log(await newPage.title());

如果触发新页面的操作未知,可以使用以下模式。

// 获取上下文中所有新页面(包括弹窗)
context.on('page', async page => {
await page.waitForLoadState();
console.log(await page.title());
});

处理弹出窗口

如果页面打开了弹出窗口(例如通过 target="_blank" 链接打开的页面),您可以通过监听页面的 popup 事件来获取其引用。

该事件会在 browserContext.on('page') 事件之外额外触发,但仅针对与该页面相关的弹出窗口。

// 在点击前开始等待弹出窗口。注意这里没有使用 await。
const popupPromise = page.waitForEvent('popup');
await page.getByText('打开弹出窗口').click();
const popup = await popupPromise;
// 正常与新的弹出窗口交互
await popup.getByRole('button').click();
console.log(await popup.title());

如果触发弹出窗口的操作未知,可以使用以下模式。

// 当弹出窗口打开时获取所有弹出窗口
page.on('popup', async popup => {
await popup.waitForLoadState();
console.log(await popup.title());
});