/* eslint-env node */ "use strict"; // Node.js script to test basic CDP behaviors against Firefox and Chromium. // // Install chrome-remote-interface, the npm package for a CDP client in node: // // % npm install chrome-remote-interface // // Run Firefox or Chromium with server turned on: // // % ./mach run --remote-debugging-port 9222 // % firefox --remote-debugging-port 9222 // % chromium-browser --remote-debugging-port=9222 // // Then run this script: // // % node demo.js const CDP = require("chrome-remote-interface"); async function demo() { let client; try { client = await CDP(); const { Log, Page, Runtime } = client; // Bug 1553756, Firefox requires `contextId` argument to be passed to // Runtime.evaluate, so fetch the current context id it first. Runtime.enable(); const { context } = await Runtime.executionContextCreated(); const contextId = context.id; let { result } = await Runtime.evaluate({ expression: "this.obj = {foo:true}; this.obj", contextId, }); console.log("1", result); ({ result } = await Runtime.evaluate({ expression: "this.obj", contextId, })); console.log("2", result); ({ result } = await Runtime.evaluate({ expression: "this.obj.foo", contextId, })); console.log("3", result); // receive console.log messages and print them Log.enable(); Log.entryAdded(({ entry }) => { const { timestamp, level, text, args } = entry; const msg = text || args.join(" "); console.log(`${new Date(timestamp)}\t${level.toUpperCase()}\t${msg}`); }); // turn on navigation related events, such as DOMContentLoaded et al. await Page.enable(); const onLoad = Page.loadEventFired(); await Page.navigate({ url: "data:text/html,test-page", }); await onLoad; } catch (e) { console.error(e); } finally { if (client) { await client.close(); } } } demo();