Skip to main content

页面 (Pages)

Pages

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

page = context.new_page()

# Navigate explicitly, similar to entering a URL in the browser.
page.goto('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.
print(page.url)

Multiple pages

每个浏览器上下文可以托管多个页面(选项卡)。

  • 每个页面的行为都像一个聚焦的活动页面。不需要将页面置于前台。
  • 上下文中的页面遵循上下文级别的模拟,例如视口大小、自定义网络路由或浏览器区域设置。
# create two pages
page_one = context.new_page()
page_two = context.new_page()

# get pages of a browser context
all_pages = context.pages

Handling new pages

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

# Get page after a specific action (e.g. clicking a link)
with context.expect_page() as new_page_info:
page.locator('a[target="_blank"]').click() # Opens a new tab
new_page = new_page_info.value

new_page.wait_for_load_state()
print(new_page.title())

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

# Get all new pages (including popups) in the context
def handle_page(page):
page.wait_for_load_state()
print(page.title())

context.on("page", handle_page)

Handling popups

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

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

# Get popup after a specific action (e.g., click)
with page.expect_popup() as popup_info:
page.locator("#open").click()
popup = popup_info.value

popup.wait_for_load_state()
print(popup.title())

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

# Get all popups when they open
def handle_popup(popup):
popup.wait_for_load_state()
print(popup.title())

page.on("popup", handle_popup)