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

Playwright如何在测试函数外部访问TestInfo?

在Playwright测试函数外部访问TestInfo的方案

可以在测试函数外部(比如你的actionHelper.js)访问当前的TestInfo,但需要确保代码运行在Playwright的测试上下文内,以下是两种可行的实现方式:

方法一:直接使用test.info()获取TestInfo

Playwright提供了test.info()方法,用于在测试上下文内获取当前的TestInfo对象。你只需在actionHelper.js中导入test对象,然后在需要的地方调用该方法即可:

修改actionHelper.js:

const { expect, test } = require('@playwright/test');

async e_compareImages(selector, expectedImageFileName) {
    // 获取当前TestInfo
    const testInfo = test.info();
    // 直接访问snapshotDir
    console.log('Snapshot目录:', testInfo.snapshotDir);

    let locator = await this.page.locator(selector);
    const actualImage = await locator.screenshot({scale: 'device'});
    await expect(actualImage).toMatchSnapshot(expectedImageFileName);
}

注意:test.info()只能在Playwright测试的异步执行流程中调用(也就是被test函数内的代码触发调用),如果在测试上下文之外调用会报错。

方法二:通过自定义Fixture注入TestInfo到页面对象

如果你的e_compareImages是页面对象的方法,更清晰的方式是通过自定义Fixture将TestInfo注入到页面对象中,避免依赖全局的test.info():

  1. 定义自定义Fixture(比如fixtures.js):
const { test: base } = require('@playwright/test');
const LoginPage = require('./LoginPage'); // 导入你的页面对象类

exports.test = base.extend({
  loginPage: async ({ page, testInfo }, use) => {
    // 将testInfo传递给页面对象
    const loginPage = new LoginPage(page, testInfo);
    await use(loginPage);
  },
});
  1. 修改LoginPage类,保存传入的TestInfo:
class LoginPage {
  constructor(page, testInfo) {
    this.page = page;
    this.testInfo = testInfo; // 保存TestInfo
  }

  async verifyLogo() {
    await this.e_compareImages('#logo', 'login-logo.png');
  }

  async e_compareImages(selector, expectedImageFileName) {
    // 直接使用保存的testInfo
    console.log('Snapshot目录:', this.testInfo.snapshotDir);

    let locator = await this.page.locator(selector);
    const actualImage = await locator.screenshot({scale: 'device'});
    await expect(actualImage).toMatchSnapshot(expectedImageFileName);
  }
}

module.exports = LoginPage;
  1. 在测试文件中使用自定义Fixture:
const { test } = require('./fixtures'); // 导入自定义的test对象

test("Verify logo on Login page", async ({ loginPage }) => {
    await loginPage.verifyLogo();
});

关于toMatchSnapshot能访问TestInfo的原因

expect(actualImage).toMatchSnapshot()之所以能正确获取testInfo.snapshotDir,是因为Playwright的断言方法内部会自动在当前测试上下文调用test.info(),从而获取到对应的TestInfo对象和快照目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:10:29