mirror of
https://github.com/Tencent/BrowserSkill.git
synced 2026-09-10 13:01:23 +08:00
Wait for DOM quiet after actions, match targets to VOM refs, and reduce drafts into deduped state-linked Trace v3 while keeping the v2 reducer. Co-authored-by: Cursor <cursoragent@cursor.com>
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
import type { CdpRunner } from "@/tools/shared";
|
|
import { waitForPageSettled } from "../page-settled";
|
|
|
|
function quietCdp(): { cdp: CdpRunner; send: ReturnType<typeof vi.fn> } {
|
|
const send = vi.fn(async () => ({
|
|
result: { value: { idleMs: 1_000, readyState: "complete" } },
|
|
}));
|
|
return {
|
|
cdp: { send: send as unknown as CdpRunner["send"] },
|
|
send,
|
|
};
|
|
}
|
|
|
|
describe("waitForPageSettled", () => {
|
|
afterEach(() => {
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("waits through the minimum observation floor before accepting a quiet page", async () => {
|
|
vi.useFakeTimers();
|
|
const { cdp, send } = quietCdp();
|
|
|
|
const settled = waitForPageSettled(cdp, 7);
|
|
await vi.advanceTimersByTimeAsync(180);
|
|
|
|
await expect(settled).resolves.toBe("quiet");
|
|
expect(send).toHaveBeenCalledTimes(3);
|
|
});
|
|
|
|
it("cancels before probing a superseded observation", async () => {
|
|
vi.useFakeTimers();
|
|
let cancelled = false;
|
|
const { cdp, send } = quietCdp();
|
|
|
|
const settled = waitForPageSettled(cdp, 7, { cancelled: () => cancelled });
|
|
cancelled = true;
|
|
await vi.advanceTimersByTimeAsync(60);
|
|
|
|
await expect(settled).resolves.toBe("cancelled");
|
|
expect(send).not.toHaveBeenCalled();
|
|
});
|
|
});
|