页面
页面
每个 BrowserContext 可以有多个页面。一个 Page 指的是浏览器上下文中的单个选项卡或弹出窗口。它应该用于导航到 URL 并与页面内容进行交互。
// Create a page.
Page page = context.newPage();
// Navigate explicitly, similar to entering a URL in the browser.
page.navigate("http://example.com");
// Fill an input.
page.locator("#search").fill("query");
// Navigate implicitly by clicking a link.
page.locator("#submit").click();
// Expect a new url.
System.out.println(page.url());
多个页面
每个浏览器上下文可以托管多个页面(选项卡)。
- 每个页面都表现得像一个聚焦的、活动的页面。不需要将页面置于最前面。
- 上下文内的页面遵循上下文级别的模拟,例如视口大小、自定义网络路由或浏览器语言环境。
// Create two pages
Page pageOne = context.newPage();
Page pageTwo = context.newPage();
// Get pages of a browser context
List<Page> allPages = context.pages();
处理新页面
浏览器上下文上的 page
事件可用于获取在上下文中创建的新页面。这可以用于处理通过 target="_blank"
链接打开的新页面。
// Get page after a specific action (e.g. clicking a link)
Page newPage = context.waitForPage(() -> {
page.getByText("open new tab").click(); // Opens a new tab
});
// Interact with the new page normally
newPage.getByRole(AriaRole.BUTTON).click();
System.out.println(newPage.title());
如果触发新页面的操作未知,则可以使用以下模式。
// Get all new pages (including popups) in the context
context.onPage(page -> {
page.waitForLoadState();
System.out.println(page.title());
});
处理弹出窗口
如果页面打开一个弹出窗口(例如,通过 target="_blank"
链接打开的页面),您可以通过侦听页面上的 popup
事件来获取对它的引用。
除了 browserContext.on('page')
事件之外,还会发出此事件,但仅适用于与此页面相关的弹出窗口。
// Get popup after a specific action (e.g., click)
Page popup = page.waitForPopup(() -> {
page.getByText("open the popup").click();
});
// Interact with the popup normally
popup.getByRole(AriaRole.BUTTON).click();
System.out.println(popup.title());
如果触发弹出窗口的操作未知,则可以使用以下模式。
// Get all popups when they open
page.onPopup(popup -> {
popup.waitForLoadState();
System.out.println(popup.title());
});