如何在测试中创建两个拥有独立IndexedDB的Playwright上下文?
Playwright多浏览器上下文的IndexedDB隔离解决方案
Playwright的不同浏览器上下文确实拥有完全独立的IndexedDB实例,你遇到的“数据共享”现象,基本都是测试逻辑的疏漏,而非框架隔离机制失效。
常见问题原因
- 测试时未在对应上下文的页面中独立执行IndexedDB操作,比如误将同一页面的操作逻辑复用给了两个上下文
- 未等待IndexedDB读写操作完成就进行验证,导致数据状态未同步
正确的测试示例
以下代码可验证两个上下文的IndexedDB完全隔离:
// 第一个上下文:写入数据 const context1 = await browser.newContext(); const page1 = await context1.newPage(); await page1.goto('你的应用URL'); // 在page1的上下文中写入IndexedDB await page1.evaluate(async () => { // 这里替换成你应用实际的IndexedDB写入逻辑 const db = await openDB('myAppDB', 1); await db.put('userData', { id: 1, name: 'Context1 User' }); }); // 第二个上下文:验证隔离性 const context2 = await browser.newContext(); const page2 = await context2.newPage(); await page2.goto('你的应用URL'); // 在page2的上下文中读取数据 const result = await page2.evaluate(async () => { const db = await openDB('myAppDB', 1); return await db.get('userData', 1); }); // 验证结果:应为undefined(或应用初始值),而非Context1写入的数据 console.log(result); // 输出undefined // 清理资源 await context1.close(); await context2.close();
关键注意事项
- 每个上下文必须独立创建页面,且页面需单独加载应用,禁止复用页面实例
- 所有IndexedDB操作必须通过
page.evaluate()在对应页面的上下文中执行,避免跨上下文的变量污染 - 如果应用包含服务器同步逻辑,测试时建议禁用同步,确保验证的是本地IndexedDB的隔离状态
内容的提问来源于stack exchange,提问作者Lukas Bergstrom
相关产品推荐
相关产品推荐

