// qkf/selenium/driverFactory.js const { Builder } = require("selenium-webdriver"); function envBool(v, def = false) { if (v == null) return def; return String(v).toLowerCase() === "true" || String(v) === "1"; } /** * Driver factory: * - Local: uses selenium-webdriver Builder().forBrowser() * - Remote: if SELENIUM_REMOTE_URL is set, uses .usingServer(url) * * Env: * - QKF_BROWSER=chrome|firefox|MicrosoftEdge * - QKF_HEADLESS=true|false * - SELENIUM_REMOTE_URL=http://localhost:4444/wd/hub (optional) */ async function createDriver() { const browser = process.env.QKF_BROWSER || "chrome"; const headless = envBool(process.env.QKF_HEADLESS, false); const remoteUrl = process.env.SELENIUM_REMOTE_URL || ""; const builder = new Builder().forBrowser(browser); if (remoteUrl) builder.usingServer(remoteUrl); // Headless options (best-effort; safe if missing) try { if (browser.toLowerCase() === "chrome") { const chrome = require("selenium-webdriver/chrome"); const opts = new chrome.Options(); if (headless) opts.addArguments("--headless=new"); opts.addArguments("--window-size=1440,900"); builder.setChromeOptions(opts); } else if (browser.toLowerCase() === "firefox") { const firefox = require("selenium-webdriver/firefox"); const opts = new firefox.Options(); if (headless) opts.addArguments("-headless"); builder.setFirefoxOptions(opts); } else if (browser.toLowerCase().includes("edge")) { const edge = require("selenium-webdriver/edge"); const opts = new edge.Options(); if (headless) opts.addArguments("--headless=new"); opts.addArguments("--window-size=1440,900"); builder.setEdgeOptions(opts); } } catch { // If browser-specific options modules aren't available, continue without them. } const driver = await builder.build(); // Default timeouts (adjust as needed) await driver.manage().setTimeouts({ implicit: 0, pageLoad: 60000, script: 30000 }); return driver; } module.exports = { createDriver };