我正在尝试在 Playwright Test 中加载 global.setup.js 中的本地存储。代码运行没有问题,但本地存储为空。如果我将代码放在 beforeEach 块中,这不是问题,但我宁愿将其放在全局设置中。有人知道为什么在global.setup.js中使用时本地存储是空的吗?
全局.setup.js
const { chromium } = require('@playwright/test');
const createOktaInjection = async(page) => {
const idToken = 'foobar';
const accessToken = 'foobar';
const mockToken = {
idToken: {
idToken,
},
accessToken: {
accessToken,
},
}
const pagePromise = page.addInitScript(params => {
window.localStorage.setItem(params.name, params.value);
},
{
name: 'okta-token-storage',
value: JSON.stringify(mockToken),
});
return pagePromise;
};
module.exports = async() => {
const browser = await chromium.launch();
const page = await browser.newPage();
return createOktaInjection(page);
};
playwright.config.js
export default defineConfig({
testDir: './tests',
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: !!process.env.CI,
/* Opt out of parallel tests on CI. */
workers: process.env.CI ? 1 : undefined,
reporter: 'html',
use: {
baseURL: 'http://127.0.0.1:8080',
//trace: 'retain-on-failure',
launchOptions: {
slowMo: slowMoTime || 900,
devtools: true,
},
},
projects: [
{
name: 'setup',
testMatch: /global.setup\.js/,
},
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup'],
},
],
主要问题是
localStorage
没有在 Playwright 中 Page
类的不同实例中保留。当您在 localStorage
中设置 global.setup.js
时,您正在为该特定 Page 实例设置它。但是当测试运行时,他们可能会使用完全不同的 Page
实例,该实例不会有 localStorage
数据。我无法确定这一点,但根据您所描述的一切,似乎很可能。
全局设置脚本通常用于启动/停止测试所需的服务(例如模拟 API 服务器),或设置全局测试配置,而不是与页面交互。
beforeEach
块为每个测试文件或您提到的每个测试设置本地存储。
我需要这个并创建了一个测试装置
export function enableIsE2eTestingInProgress(
baseToExtend: TestType<PlaywrightTestArgs & PlaywrightTestOptions, PlaywrightWorkerArgs & PlaywrightWorkerOptions>
) {
return baseToExtend.extend({
page: async ({ page }, use) => {
await page.addInitScript(params => {
window.localStorage.setItem("IS_E2E_TESTING_IN_PROGRESS", 'true');
});
await use(page);
},
});
}
使用带有
!environment.production
的测试服务来禁用“新遗迹”或单页应用程序的一部分非常有用。您不想在测试时更改应用程序的行为,但在某些情况下这样做是有意义的。