diff --git a/packages/browser/tests/basic.ts b/packages/browser/tests/basic.ts new file mode 100644 index 0000000..027c7dd --- /dev/null +++ b/packages/browser/tests/basic.ts @@ -0,0 +1,71 @@ +import { Camoufox } from "camoufox-js" + +// Prevent crash when Firefox page errors have no location (CF/captcha JS errors) +process.on("uncaughtException", (err) => { + if (err instanceof TypeError && err.message.includes("undefined is not an object")) return + console.error("[uncaught]", err.message) + process.exit(1) +}) + +async function main() { + const browser: any = await Camoufox({ + headless: true, + geoip: true, + humanize: true, + disable_coop: true, + block_webrtc: true, + iKnowWhatImDoing: true, + }) + const ctx = await browser.newContext({ viewport: null }) + const page = await ctx.newPage() + + console.log("[1] example.com...") + await page + .goto("https://example.com", { waitUntil: "networkidle", timeout: 15000 }) + .catch((e) => console.log("err:", e.message)) + console.log( + "[1] content:", + (await page.content().catch(() => "")).length, + "title:", + await page.title().catch(() => "?"), + ) + + const page2 = await ctx.newPage() + console.log("[2] nopecha.com...") + await page2 + .goto("https://nopecha.com", { waitUntil: "domcontentloaded", timeout: 15000 }) + .catch((e) => console.log("err:", e.message)) + await new Promise((r) => setTimeout(r, 3000)) + console.log( + "[2] content:", + (await page2.content().catch(() => "")).length, + "title:", + await page2.title().catch(() => "?"), + ) + + console.log("[3] nopecha.com/demo/cloudflare...") + await page2 + .goto("https://nopecha.com/demo/cloudflare", { waitUntil: "domcontentloaded", timeout: 30000 }) + .catch((e) => console.log("err:", e.message)) + for (let i = 0; i < 15; i++) { + await new Promise((r) => setTimeout(r, 2000)) + const html = await page2.content().catch(() => "") + const title = await page2.title().catch(() => "?") + const url = page2.url() + console.log(`[3.${i}] len=${html.length} title="${title}" url=${url.slice(0, 80)}`) + if (!/Just a moment/i.test(title) && html.length > 200) break + } + + const cookies = await ctx.cookies() + console.log( + "[3] cf_clearance:", + cookies.some((c: any) => c.name === "cf_clearance"), + ) + + await browser.close() +} + +main().catch((e) => { + console.error("FAIL:", e.message) + process.exit(1) +})