在剧作家全局设置中,本地存储未设置值

问题描述 投票:0回答:2

我正在尝试在 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'],
      },
    ],
e2e-testing playwright playwright-test
2个回答
1
投票

主要问题是

localStorage
没有在 Playwright 中
Page
类的不同实例中保留。当您在
localStorage
中设置
global.setup.js
时,您正在为该特定 Page 实例设置它。但是当测试运行时,他们可能会使用完全不同的
Page
实例,该实例不会有
localStorage
数据。我无法确定这一点,但根据您所描述的一切,似乎很可能。

全局设置脚本通常用于启动/停止测试所需的服务(例如模拟 API 服务器),或设置全局测试配置,而不是与页面交互。

但是,您可以使用

beforeEach
块为每个测试文件或您提到的每个测试设置本地存储。


0
投票

我需要这个并创建了一个测试装置

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
的测试服务来禁用“新遗迹”或单页应用程序的一部分非常有用。您不想在测试时更改应用程序的行为,但在某些情况下这样做是有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.