使用browser.new_context() 创建context对象,context之间是相互隔离的,可以理解为轻量级的浏览器实例.
注:测试隔离是指每个测试与另一个测试完全隔离。每个测试都独立于任何其他测试运行。这意味着每个测试都有自己的本地存储、会话存储、cookie 等。Playwright 使用BrowserContext实现了这一点,这相当于隐身式配置文件。它们的创建速度快、成本低,并且完全隔离,即使在单个浏览器中运行也是如此。Playwright 为每个测试创建一个上下文,并在该上下文中提供一个默认页面。
如需要不同用户登录同一个网页,不需要创建多个浏览器实例,只需要创建多个context即可
通过context 上下文操作多个浏览器实例,它不会与其他浏览器上下文共享 cookies/缓存,适用于多用户同时登陆的场景
一个浏览器实例上打开2个标签页
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=2000)
context = browser.new_context() # 创建浏览器实例
page = context.new_page() # 打开标签页1
page.goto('https://www.baidu.com/')
page2 = context.new_page() # 打开标签页2
page2.goto('https://www.csdn.net/')
打开两个浏览器实例
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=2000)
context1 = browser.new_context() # 创建浏览器实例1
page = context1.new_page() # 打开实例1的标签页
page.goto('https://www.baidu.com/')
context2 = browser.new_context() # 创建浏览器实例2
page = context2.new_page() # 打开实例2的标签页
page.goto('https://www.csdn.net/')
处理新标签页
浏览器上下文中的事件page可用于获取在上下文中创建的新页面。这可用于处理通过target="_blank"链接打开的新页面。
打开百度页面的-新闻链接,会出现一个新标签页
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=2000)
context = browser.new_context() # 创建浏览器实例1
page = context.new_page() # 打开标签页
page.goto('https://www.baidu.com/')
print(page.title()) # 打印当前页面title
with context.expect_page() as new_page_info:
page.click('text=新闻') # 打开新选项卡
new_page = new_page_info.value
new_page.wait_for_load_state() # 等待页面加载到指定状态
print(new_page.title()) # 打印新页面title
处理弹出窗口
如果页面打开一个弹出窗口(例如通过链接打开的页面),您可以通过监听页面上的事件target="_blank"来获取对它的引用。popup除了browserContext.on(‘page’)事件之外还会发出此事件,但仅针对与此页面相关的弹出窗口。
```python
```python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=2000)
context = browser.new_context() # 创建浏览器实例1
page = context.new_page() # 打开标签页
page.goto('https://www.baidu.com/')
print(page.title()) # 打印当前页面title
with page.expect_popup() as popup_info:
page.locator('a').get_by_text('新闻').click()
popup = popup_info.value
popup.wait_for_load_state()
print(popup.title())