Search code examples
node.jsjestjsplaywright

Playwright - How to access TestInfo outside of test function?


In Playwright, is there any way to access current TestInfo outside of a test function?

I have some tests that need access to the current testInfo.snapshotDir. However, the 'e_compareImages' function that needs the testInfo is nested several layers deep. It is not practical to pass the testInfo from the test function all the way to the function that needs that info.

I know e_compareImages() already has some access to the current testInfo because the function calls toMatchSnapshot() (from Jest's expect library), and the function pulls the correct file from the current testInfo.snapshotDir

Is there any way for functions in the actionHelper file to access current testInfo outside of an expect assertion?

I've posted what I believe are the relevant portions of the files below.

// LoginPage.test.js File

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

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

// actionHelper.js File

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

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

I've tried importing Playwright's globals.js library and using its currentTestInfo(), but I have been unable to get it to work.

Is there another library or a way to extend an existing library that would do what I need?

Please let me know if you need any additional information.


Solution

  • I found what I was looking for. You can use the below code to require the globals library

    var _globals = require("../node_modules/@playwright/test/lib/globals");
    

    Then you can use this function to get the current testInfo object directly (without having to pass the object through however many intermediary functions)

    // Get the current test's testInfo object
    async getCurrentTestInfo() {
        const curTestInfo = await (0, _globals.currentTestInfo)();
        return await curTestInfo
    }