深入理解Browser、Context、Page,可以让我们轻松掌握Playwright
的工作原理,并从容应对问题如:如何处理对话框?如何复用登录身份信息?录制调整视频大小或者存储目录?
概念
在Playwright
中,Browser
, Context
, 和 Page
是核心概念,它们共同定义了自动化测试的结构。
测试会在浏览器(Browser
)的上下文(BrowserContext
)中执行,每个上下文包含多个页面(Page
)。每个页面都代表了一个打开的浏览器标签页。这种层级结构允许你在同一个浏览器实例中同时执行多个测试用例,以提高效率。
Browser
• Browser 对应于一个完整的浏览器实例,比如 Chrome
、Firefox
或 WebKit
。
• Playwright
脚本通常从启动一个 Browser
实例开始,并在测试结束时关闭它。
• Browser
可以在无头(headless
)或有头(headful
)模式下启动。
const { chromium } = require('playwright');
// 无头模式启动浏览器
async function launchInHeadlessMode() {
const browser = await chromium.launch({ headless: true });
console.log('浏览器已在无头模式下启动');
// 执行其他操作...
await browser.close();
}
// 有头模式启动浏览器
async function launchInHeadfulMode() {
const browser = await chromium.launch({ headless: false });
console.log('浏览器已在有头模式下启动');
// 执行其他操作...
await browser.close();
}
// 分别调用无头模式和有头模式启动浏览器的函数
launchInHeadlessMode();
launchInHeadfulMode();
• 一个 Browser
实例可以包含多个BrowserContext
。 BrowserContext
代表了浏览器的一个隔离环境,其中包含了一组浏览器窗口(Page
)、cookies
、缓存、本地存储等。使用多个 BrowserContext
可以帮助模拟不同用户的会话,或者隔离测试环境以避免相互干扰。
BrowserContext
• BrowserContext
代表了一个浏览器的会话,它类似于一个全新的浏览器配置文件。
• Playwright
为每个测试用例创建一个 BrowserContext
,以确保测试之间的隔离。
• 每个 BrowserContext
拥有自己的 Cookie
、浏览器存储和浏览历史记录。
• 可以在同一个 Browser
实例中创建多个 BrowserContext
来模拟多用户会话。
const { chromium } = require('playwright');
async function main() {
// 启动一个浏览器实例
const browser = await chromium.launch();
// 创建第一个 BrowserContext
let context1 = await browser.newContext();
let page1 = await context1.newPage();
await page1.goto('https://example.com');
console.log('在第一个上下文中打开网页');
// 创建第二个 BrowserContext
let context2 = await browser.newContext();
let page2 = await context2.newPage();
await page2.goto('https://example.com');
console.log('在第二个上下文中打开网页');
// ... 在这里可以继续创建更多的 BrowserContext 和 Page,并进行相应的操作
// 关闭所有打开的 BrowserContext
await context1.close();
await context2.close();
// 关闭浏览器实例
await browser.close();
}
说明如下:
• 启动了一个 Browser
实例,然后创建了两个 BrowserContext
实例。
• 每个 BrowserContext
实例都打开了相同的网页,但由于它们是隔离的,因此它们各自的状态(例如 cookies
、localStorage
)不会相互影响。
• 关闭了这两个 BrowserContext
以及最初的 Browser
实例
Page
• Page
是在 BrowserContext
中打开的单个网页。
• 每个 Page
代表了用户与浏览器交互时看到的视图。
• Page
提供了丰富的 API
用于导航、操作元素、处理表单、弹出窗口等。
• 在同一个 BrowserContext
中可以打开多个 Page
实例。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
// 打开第一个页面
const page1 = await context.newPage();
await page1.goto('https://example.com');
console.log(await page1.title());
// 打开第二个页面
const page2 = await context.newPage();
await page2.goto('https://example.org');
console.log(await page2.title());
// 关闭浏览器
await browser.close();
})();
说明如下:
• 使用browser.newContext()
创建了一个新的浏览器上下文。
• 通过 context.newPage()
分别创建了两个新的页面实例,即 page1
和 page2
,每个页面可以独立进行导航和操作
![图片[1]-Playwright实战-深入理解Browser、Context、Page-365博客](https://qiniu.dianchuang365.cn/2025/02/20250204115550697.png)
Browser
|--- BrowserContext
|--- Page
|--- Page
|--- ...
典型场景
复用登录身份信息
• 使用同一 BrowserContext
打开多个 Page
可以共享相同的 Cookie
,从而复用登录状态。
• 使用 context
的 storageState
方法来实现
• 保存当前上下文的状态,包括登录信息,并在创建新页面时进行恢复
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
// 在第一个页面登录
const page1 = await context.newPage();
await page1.goto('https://example.com/login');
await page1.fill('input[name=username]', 'your_username');
await page1.fill('input[name=password]', 'your_password');
await page1.click('button[type=submit]');
// 保存上下文状态
const storageState = await context.storageState();
// 在新页面中恢复登录状态
const page2 = await context.newPage();
await page2.goto('https://example.com/dashboard', { waitUntil: 'domcontentloaded' });
// 具体的测试逻辑
await context.close();
await browser.close();
})();
操作对话框
当 Page
触发弹出对话框时,可以使用 Page
的相关 API
来定位和操作对话框元素。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
// 监听 'dialog' 事件
page.on('dialog', async (dialog) => {
console.log('Dialog message:', dialog.message());
// 模拟输入值并点击确定按钮
await dialog.type('Your input');
await dialog.accept();
});
// 触发一个包含 Prompt 对话框的操作,例如点击一个按钮
await page.goto('https://example.com');
await page.click('button');
// 关闭浏览器
await browser.close();
})();
说明如下:
• 使用page.on()
监听对话框事件
• 通过 dialog.type('Your input')
模拟输入文本,并使用 dialog.accept()
确认对话框
视频录制
通过 Browser
的 browserContext.newPage()
打开 Page
后,可以使用 Browser
的录制功能来保存整个浏览器会话的视频。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 }, // 设置视口大小为 1920x1080
recordVideo: { dir: './videos/' } // 设置视频存储路径为当前目录下的 videos 文件夹
});
const page = await context.newPage();
// 打开页面并进行一些操作
await page.goto('https://example.com');
// 进行其他操作...
// 关闭浏览器
await browser.close();
})();
说明如下:
• chromium.launch()
启动了 Chromium
浏览器实例
• 使用 browser.newContext()
创建了一个新的浏览器上下文,并设置了视口大小为 1920x1080
,同时开启了视频录制并设置了存储路径为当前目录下的 videos
文件夹。
• 使用 context.newPage()
创建了一个新的页面。
• 可以在页面上执行各种操作,最后关闭了浏览器。
小结
深入理解这些概念和它们的关系是理解和有效使用 Playwright
进行自动化测试的基础。通过合理地管理 Browser
,Context
,和 Page
,可以编写出高效、可维护且稳定的自动化测试脚本。
暂无评论内容