73 lines
3.3 KiB
JavaScript
73 lines
3.3 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { WebSocketServer } from "ws";
|
|
import { CdpSession, createBrowserSession } from "../dist/cdp.js";
|
|
import { eventJsonLine, resultJsonLine } from "../dist/event-json.js";
|
|
|
|
test("CLI clips trace events without clipping the final deliverable", () => {
|
|
const output = "x".repeat(40_000);
|
|
const event = JSON.parse(eventJsonLine({ output }));
|
|
const result = JSON.parse(resultJsonLine({ output }));
|
|
assert.match(event.output, /chars omitted/);
|
|
assert.equal(result.result.output, output);
|
|
});
|
|
|
|
test("CDP session attaches once and routes page calls through the active session", async () => {
|
|
const requests = [];
|
|
let websocketExtensions = "not-connected";
|
|
const server = new WebSocketServer({ port: 0 });
|
|
await new Promise((resolve) => server.once("listening", resolve));
|
|
server.on("connection", (socket, request) => {
|
|
websocketExtensions = request.headers["sec-websocket-extensions"] ?? "";
|
|
socket.on("message", (raw) => {
|
|
const request = JSON.parse(raw.toString());
|
|
requests.push(request);
|
|
if (request.method === "Runtime.throwForTest") {
|
|
socket.send(JSON.stringify({ id: request.id, error: { message: "test CDP error" } }));
|
|
return;
|
|
}
|
|
const result = request.method === "Target.getTargets"
|
|
? { targetInfos: [{ type: "page", targetId: "page-1", url: "about:blank" }] }
|
|
: request.method === "Target.attachToTarget"
|
|
? { sessionId: "session-1" }
|
|
: request.method === "Runtime.evaluate"
|
|
? { result: { value: "Example" } }
|
|
: {};
|
|
socket.send(JSON.stringify({ id: request.id, result }));
|
|
});
|
|
});
|
|
const address = server.address();
|
|
assert.ok(address && typeof address === "object");
|
|
const client = new CdpSession({ cdpUrl: `ws://127.0.0.1:${address.port}` });
|
|
await client.connect();
|
|
const session = createBrowserSession(client);
|
|
assert.equal(websocketExtensions, "");
|
|
const result = await session.Runtime.evaluate({ expression: "document.title", returnByValue: true });
|
|
assert.equal(result.result.value, "Example");
|
|
let observedUrl = "";
|
|
const unsubscribe = session.Network.requestWillBeSent((event) => {
|
|
observedUrl = event.request.url;
|
|
});
|
|
const socket = [...server.clients][0];
|
|
socket.send(JSON.stringify({
|
|
method: "Network.requestWillBeSent",
|
|
sessionId: "session-1",
|
|
params: { request: { url: "https://example.com/product" } },
|
|
}));
|
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
assert.equal(observedUrl, "https://example.com/product");
|
|
assert.equal(typeof unsubscribe, "function");
|
|
unsubscribe();
|
|
assert.equal(requests.some((request) => request.method === "Network.requestWillBeSent"), false);
|
|
const abandonedWait = session.waitFor("Page.eventThatNeverArrives", 5);
|
|
const abandonedCommand = session.Runtime.throwForTest({});
|
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
await assert.rejects(abandonedWait, /Timed out waiting/);
|
|
await assert.rejects(abandonedCommand, /test CDP error/);
|
|
const evaluation = requests.find((request) => request.method === "Runtime.evaluate");
|
|
assert.equal(evaluation.sessionId, "session-1");
|
|
assert.equal(requests.find((request) => request.method === "Target.getTargets").sessionId, undefined);
|
|
await client.close();
|
|
await new Promise((resolve) => server.close(resolve));
|
|
});
|