import { spawn } from "node:child_process";
import { chromium } from "@playwright/test";
const browserName = "chromium";
const child = spawn(
"pnpm",
["extension", "dev", "--no-browser", `--browser=${browserName}`],
{
stdio: "inherit",
env: process.env,
},
);
async function waitForReady() {
return await new Promise<any>((resolve, reject) => {
let stdout = "";
let stderr = "";
const wait = spawn(
"pnpm",
[
"extension",
"dev",
"--wait",
`--browser=${browserName}`,
"--wait-timeout=60000",
"--wait-format=json",
],
{ stdio: ["ignore", "pipe", "pipe"], env: process.env },
);
wait.stdout.on("data", (chunk) => (stdout += chunk.toString()));
wait.stderr.on("data", (chunk) => (stderr += chunk.toString()));
wait.on("error", reject);
wait.on("close", (code) => {
if ((code ?? 1) !== 0) {
reject(
new Error(stderr || `wait command failed with code ${String(code)}`),
);
return;
}
const payload = JSON.parse(stdout.trim());
resolve(payload.results[0]);
});
});
}
const ready = await waitForReady();
const context = await chromium.launchPersistentContext("", {
headless: false,
args: [
`--disable-extensions-except=${ready.distPath}`,
`--load-extension=${ready.distPath}`,
],
});
// run tests using context/pages...
await context.close();
child.kill("SIGTERM");