You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright复用登录状态时storageState.json为空问题求助

问题排查与解决

核心问题:登录未完成就保存状态

你的全局配置文件存在语法错误,导致代码未等待登录流程完成就执行了状态保存操作,最终生成空的storageState.json:

await expect(page.locator('[data-testid="welcome"]')).toBeVisible

这里的toBeVisible是Playwright断言方法,必须加括号调用(.toBeVisible()),否则不会触发等待逻辑——代码会直接跳过断言往下执行,此时登录请求可能还未完成,Cookie等登录状态还未写入上下文,自然无法生成有效状态文件。

分步修复方案

  1. 修正断言语法
    将错误的断言语句改为:

    await expect(page.locator('[data-testid="welcome"]')).toBeVisible();
    

    这会强制代码等待欢迎元素出现,确保登录流程完全结束。

  2. 添加资源关闭操作
    保存状态后需关闭浏览器,确保状态数据被正确写入文件:

    await page.context().storageState({ path: 'storageState.json'});
    // 新增关闭浏览器操作
    await browser.close();
    
  3. 使用绝对路径避免文件位置异常
    相对路径可能导致状态文件生成在非预期目录,建议用Node.js的path模块生成绝对路径:

    import { chromium, expect } from "@playwright/test";
    import path from "path";
    
    async function globalConfig() {
        const browser = await chromium.launch();
        const page = await browser.newPage();
        await page.goto('https://qacart-todo.herokuapp.com/login');
        await page.locator("#login").fill("hatem@example.com");
        await page.locator('//input[@data-testid="password"]').fill("123456");
        await page.locator('button:has-text("login")').click();
        await expect(page.locator('[data-testid="welcome"]')).toBeVisible();
        // 使用绝对路径指定状态文件位置
        await page.context().storageState({ 
            path: path.resolve(__dirname, '../storageState.json') 
        });
        await browser.close();
    }
    
    export default globalConfig;
    
  4. 启用测试用例的状态复用
    你的测试用例注释了状态复用配置,同时保留了重复登录的beforeEach,需调整如下:

    import { test, expect } from '@playwright/test';
    import path from "path";
    
    test.describe("todo page test cases", ()=> {
      // 启用状态复用
      test.use({
        storageState: path.resolve(__dirname, '../storageState.json') 
      })
      
      // 修改beforeEach,直接跳转到主页无需重复登录
      test.beforeEach(async({page})=> {
          await page.goto('https://qacart-todo.herokuapp.com/');
      })
    
      test("mark a todo as completed", async({page}) => {
          await page.locator('[data-testid="add"]').click()
          await page.locator('[data-testid="new-todo"]').fill('My First Automation To DO')
          await page.locator('[data-testid="submit-newTask"]').click()
          await page.locator('[data-testid="complete-task"]').nth(0).click()
          await expect(page.locator('[data-testid="todo-item"]').nth(0)).toHaveCSS('background-color', 'rgb(33, 76, 97)')
        })
        test("welcome message displayed", async({page}) => {
          await expect(page.locator('[data-testid="welcome"]')).toBeVisible()      
          })
    })
    

额外检查项

  • 确认playwright.config.ts中globalSetup的文件路径与实际文件位置匹配
  • 运行测试前可单独执行全局配置文件,验证是否生成了非空的storageState.json

内容的提问来源于stack exchange,提问作者Yehia Gamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:25:50