Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.qawolf.com/llms.txt

Use this file to discover all available pages before exploring further.

Use launch() with Chrome flags to load an extension into the browser before your flow runs. This lets you test extension popup UIs, content scripts, and extension behavior alongside your app.
Store your extension zip in team storage and reference it via process.env.TEAM_STORAGE_DIR. See Upload files for instructions. Replace <extension-id> with your extension’s ID, which you can find at chrome://extensions with Developer mode enabled.

Example

import { flow, launch } from "@qawolf/flows/web";

const extensionPath = `${process.env.TEAM_STORAGE_DIR}/my-extension.zip`;

const { context } = await launch({
  browser: "chromium",
  persistentContext: true,
  args: [
    `--disable-extensions-except=${extensionPath}`,
    `--load-extension=${extensionPath}`,
  ],
  permissions: ["clipboard-read", "clipboard-write"],
});

const extensionPage = await context.newPage();
await extensionPage.goto(`chrome-extension://<extension-id>/popup.html`);

When to use

  • Your app uses a Chrome extension and you need to test the full user flow with the extension installed.
  • You need to test the extension’s popup UI or options page directly
  • You need to verify that a content script modifies or interacts with a page correctly

Full sample test

import { flow, launch } from "@qawolf/flows/web";

const extensionPath = `${process.env.TEAM_STORAGE_DIR}/my-extension.zip`;

export default flow(
  "Test Chrome extension popup",
  "Web - Chrome",
  async ({ test }) => {
    await test("launch extension and verify popup renders", async () => {
      // Arrange
      const { context } = await launch({
        browser: "chrome",
        persistentContext: true,
        acceptDownloads: true,
        args: [
          `--allow-file-access-from-files`,
          `--disable-extensions-except=${extensionPath}`,
          `--load-extension=${extensionPath}`,
          `--no-sandbox`,
        ],
      });

      await expect
        .poll(
          () => context.pages(),
          { intervals: [1_000, 2_000, 10_000], timeout: 10_000 },
        )
        .toHaveLength(2);

      const extensionPage = context.pages().at(-1);

      // Act
      await extensionPage.locator("#open-popup").click();

      // Assert
      await expect(extensionPage.locator("#popup-content")).toBeVisible();
    });
  },
);
Last modified on May 20, 2026