Skip to main content
@qawolf/testkit has three public entry points.
ImportUse it for
@qawolf/testkitOTPs and runner-backed flow helpers
@qawolf/testkit/webhelpers that need a Playwright page
@qawolf/testkit/clientrunner or local harness setup

Top-Level Helpers

Use the top-level package in flow code.
import { otp, saveBaselineScreenshot, startOpenVpn } from "@qawolf/testkit";

const code = otp.fromUri(process.env["OTP_URI"]!);
await startOpenVpn({ configPath: "/tmp/client.ovpn" });
await saveBaselineScreenshot(page, "homepage");
The top-level package currently exposes:
  • otp.fromUri(...)
  • mountCifsShare(...)
  • startOpenVpn(...)
  • saveBaselineScreenshot(...)
  • configureTestkitClient(...)
  • getCurrentTestkitClient()
  • resetTestkitClient()

Web Helpers

Use @qawolf/testkit/web when the helper needs a Playwright page.
import { readQRCode } from "@qawolf/testkit/web";

const value = await readQRCode(page, ".qr-code");

Client Setup

Use @qawolf/testkit/client when you are configuring the runtime layer.
import { configureTestkitClient } from "@qawolf/testkit";
import { createTestkitClient } from "@qawolf/testkit/client";

configureTestkitClient(
  createTestkitClient({
    mountCifsShare: async ({ remotePath }) => remotePath,
    startOpenVpn: async ({ configPath }) => configPath,
    startWireGuard: async ({ configPath }) => configPath,
  }),
);
Most flow authors do not need to create the client. The runner usually does it. For exact exports and option shapes, see the Testkit API Reference.
Last modified on April 24, 2026