页面
页面
每个 BrowserContext 可以拥有多个页面。Page 指的是浏览器上下文中的单个标签页或弹窗。它用于跳转到指定的 URL 并与页面内容进行交互。
- 同步
- 异步
page = context.new_page()
# 显式跳转页面,类似于在浏览器中输入 URL。
page.goto('http://example.com')
# 填充输入框。
page.locator('#search').fill('query')
# 通过点击链接隐式跳转页面。
page.locator('#submit').click()
# 期望跳转到新的 url。
print(page.url)
page = await context.new_page()
# 显式跳转页面,类似于在浏览器中输入 URL。
await page.goto('http://example.com')
# 填充输入框。
await page.locator('#search').fill('query')
# 通过点击链接隐式跳转页面。
await page.locator('#submit').click()
# 期望跳转到新的 url。
print(page.url)
多页面
每个浏览器上下文可以包含多个页面(标签页)。
- 每个页面都表现为聚焦的活动页面,无需将页面置于前台。
- 上下文中的页面会继承上下文级别的模拟设置,如视口大小、自定义网络路由或浏览器语言环境。
- 同步
- 异步
# 创建两个页面
page_one = context.new_page()
page_two = context.new_page()
# 获取浏览器上下文中的所有页面
all_pages = context.pages
# 创建两个页面
page_one = await context.new_page()
page_two = await context.new_page()
# 获取浏览器上下文中的所有页面
all_pages = context.pages
处理新页面
可以通过浏览器上下文的 page
事件获取在该上下文中新创建的页面。这通常用于处理由 target="_blank"
链接打开的新页面。
- 同步
- 异步
# 在特定操作后获取新页面(例如点击链接)
with context.expect_page() as new_page_info:
page.get_by_text("open new tab").click() # 打开新标签页
new_page = new_page_info.value
# 正常与新页面交互
new_page.get_by_role("button").click()
print(new_page.title())
# 在特定操作后获取新页面(例如点击链接)
async with context.expect_page() as new_page_info:
await page.get_by_text("open new tab").click() # 打开新标签页
new_page = await new_page_info.value
# 正常与新页面交互
await new_page.get_by_role("button").click()
print(await new_page.title())
如果触发新页面的操作未知,可以使用如下模式。
- 同步
- 异步
# 获取上下文中所有新页面(包括弹窗)
def handle_page(page):
page.wait_for_load_state()
print(page.title())
context.on("page", handle_page)
# 获取上下文中所有新页面(包括弹窗)
async def handle_page(page):
await page.wait_for_load_state()
print(await page.title())
context.on("page", handle_page)
处理弹窗
如果页面打开了一个弹窗(例如通过 target="_blank"
链接打开的页面),可以通过监听页面的 popup
事件获取弹窗的引用。
该事件除了会在 browserContext.on('page')
上触发外,还会在与当前页面相关的弹窗上单独触发。
- 同步
- 异步
# 在特定操作后获取弹窗(例如点击)
with page.expect_popup() as popup_info:
page.get_by_text("open the popup").click()
popup = popup_info.value
# 正常与弹窗交互
popup.get_by_role("button").click()
print(popup.title())
# 在特定操作后获取弹窗(例如点击)
async with page.expect_popup() as popup_info:
await page.get_by_text("open the popup").click()
popup = await popup_info.value
# 正常与弹窗交互
await popup.get_by_role("button").click()
print(await popup.title())
如果触发弹窗的操作未知,可以使用如下模式。
- 同步
- 异步
# 打开弹窗时获取所有弹窗
def handle_popup(popup):
popup.wait_for_load_state()
print(popup.title())
page.on("popup", handle_popup)
# 打开弹窗时获取所有弹窗
async def handle_popup(popup):
await popup.wait_for_load_state()
print(await popup.title())
page.on("popup", handle_popup)