引言
使用Playwright编写的测试在称为浏览器上下文的独立干净环境中执行。这种隔离模型提高了测试的可重复性,并防止了测试失败的连锁反应。
什么是测试隔离?
测试隔离是指每个测试都完全独立于其他测试。每个测试都独立于任何其他测试运行。这意味着每个测试都有自己的本地存储、会话存储、cookie等。Playwright通过使用BrowserContext来实现这一点,BrowserContext相当于无痕浏览模式(隐身模式)的配置文件。它们创建速度快、成本低,并且在单个浏览器中运行时也完全隔离。Playwright为每个测试创建一个上下文,并在该上下文中提供一个默认的页面( Page)。
为什么测试隔离很重要?
- 无失败传递:如果一个测试失败,它不会影响其他测试。
- 易于调试错误或不稳定性,因为您可以根据需要多次仅运行单个测试。
- 并行运行、分片等时无需考虑顺序。
测试隔离的两种方式
在测试隔离方面,有两种不同的策略:从头开始或中间清理。在测试之间进行清理的问题是,很容易忘记清理,而且有些事情(如“已访问的链接”)是无法清理的。一个测试的状态可能会泄露到下一个测试中,这可能会导致测试失败并使调试变得更加困难,因为问题来自另一个测试。从头开始意味着一切都是新的,所以如果测试失败,您只需在该测试内部进行调试。】
Playwright如何实现测试隔离
Playwright使用浏览器上下文(Browser Contexts)来实现测试隔离。每个测试都有自己的浏览器上下文。每次运行测试时都会创建一个新的浏览器上下文。当使用Playwright作为测试运行器时,浏览器上下文会默认创建。否则,您可以手动创建浏览器上下文。
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
浏览器上下文还可以用于模拟涉及移动设备、权限、区域设置和颜色方案的多页面场景。更多详细信息,请查阅我们的模拟指南(Emulation guide)。
单个测试中的多个上下文
Playwright可以在单个测试场景中创建多个浏览器上下文。这在您需要测试多用户功能(如聊天)时非常有用。
from playwright.sync_api import sync_playwright, Playwright
def run(playwright: Playwright):
# 创建一个Chromium浏览器实例
chromium = playwright.chromium
browser = chromium.launch()
# 创建两个独立的浏览器上下文
user_context = browser.new_context()
admin_context = browser.new_context()
# 创建页面并独立地与上下文进行交互
# 在这里,您可以添加代码来模拟用户和管理员的行为
with sync_playwright() as playwright:
run(playwright)
sync_playwright()
函数用于同步地启动Playwright API,并作为上下文管理器传递Playwright
实例。然后,我们定义了run
函数,该函数接受Playwright
实例作为参数,并创建一个Chromium浏览器实例。随后,我们在这个浏览器实例中创建了两个独立的浏览器上下文,分别代表用户和管理员。接下来,您可以在这两个上下文中创建页面,并独立地与它们进行交互,以模拟不同的用户行为。