65 lines
2.2 KiB
JavaScript
65 lines
2.2 KiB
JavaScript
// 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 };
|