跳至主要内容

页面

页面

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

// Create a page.
var page = await context.NewPageAsync();

// Navigate explicitly, similar to entering a URL in the browser.
await page.GotoAsync("http://example.com");
// Fill an input.
await page.Locator("#search").FillAsync("query");

// Navigate implicitly by clicking a link.
await page.Locator("#submit").ClickAsync();
// Expect a new url.
Console.WriteLine(page.Url);

多页面

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

  • 每个页面的行为都像一个获得焦点且活跃的页面,无需将页面置于最前。
  • 上下文中的页面会遵循上下文级别的模拟设置,例如视口尺寸、自定义网络路由或浏览器区域设置。
// Create two pages
var pageOne = await context.NewPageAsync();
var pageTwo = await context.NewPageAsync();

// Get pages of a browser context
var allPages = context.Pages;

处理新页面

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

// Get page after a specific action (e.g. clicking a link)
var newPage = await context.RunAndWaitForPageAsync(async () =>
{
await page.GetByText("open new tab").ClickAsync();
});
// Interact with the new page normally
await newPage.GetByRole(AriaRole.Button).ClickAsync();
Console.WriteLine(await newPage.TitleAsync());

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

// Get all new pages (including popups) in the context
context.Page += async (_, page) => {
await page.WaitForLoadStateAsync();
Console.WriteLine(await page.TitleAsync());
};

处理弹窗

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

除了browserContext.on('page')事件外,还会发出此事件,但仅针对与此页面相关的弹出窗口。

// Get popup after a specific action (e.g., click)
var popup = await page.RunAndWaitForPopupAsync(async () =>
{
await page.GetByText("open the popup").ClickAsync();
});
// Interact with the popup normally
await popup.GetByRole(AriaRole.Button).ClickAsync();
Console.WriteLine(await popup.TitleAsync());

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

// Get all popups when they open
page.Popup += async (_, popup) => {
await popup.WaitForLoadStateAsync();
Console.WriteLine(await page.TitleAsync());
};