module.exports.getDriver = function(arg) { var options = new firefox.Options(); var profile = new firefox.Profile(); if (arg.userAgent) { profile.setPreference('general.useragent.override', arg.userAgent); } // try to remove the caching between runs profile.setPreference('browser.cache.disk.enable', false); profile.setPreference('browser.cache.memory.enable', false); profile.setPreference('browser.cache.offline.enable', false); profile.setPreference('network.http.use-cache', false); profile.setPreference('dom.enable_resource_timing', true); options.setProfile(profile); var cap = options.toCapabilities(); var proxyUrl = externalProxy.getProxyUrl(); if (proxyUrl) { cap.setProxy(proxy.manual({ http: proxyUrl, https: proxyUrl })); } return arg.seleniumServer ? new webdriver.Builder().usingServer(arg.seleniumServer).withCapabilities(cap).build() : new webdriver.Builder().withCapabilities(cap).build(); };
function start() { let options = new firefox.Options(); options.setProfile(firefoxProfile()) options.setBinary(firefoxBinary()); const driver = new firefox.Driver(options); return driver; }
getDriver: function () { var options = new firefox.Options(), profile = new firefox.Profile(); profile.setPreference('focusmanager.testmode', true); options.setProfile(profile); return new webdriver.Builder() .forBrowser('firefox') .usingServer('http://edx.devstack.firefox:4444/wd/hub') .setFirefoxOptions(options) .build(); }
/** * @param {string} browser * @return {!WebDriver} */ function getWebDriver(browser) { if (process.env['SAUCE_USERNAME']) { return getRemoteWebDriver(browser); } var caps = /** @type {!WebDriverCapabilities} */ ( new webdriver.Capabilities()); caps.set('browserName', browser); caps.set('loggingPrefs', { 'browser': 'ALL' }); var builder = /** @type {!WebDriverBuilder} */ (new webdriver.Builder()); builder.disableEnvironmentOverrides(); if (browser == 'chrome') { var chromeOptions = /** @type {!ChromeOptions} */ ( new chromeMod.Options()); chromeOptions.addArguments([ '--user-data-dir=/tmp/selenium_chrome_' + new Date().getTime(), '--no-first-run' ]); return builder.withCapabilities(caps). setChromeOptions(chromeOptions). build(); } else if (browser == 'firefox') { var firefoxOptions = /** @type {!FirefoxOptions} */ ( new firefoxMod.Options()); firefoxOptions.setProfile(new firefoxMod.Profile()); return builder.withCapabilities(caps). setFirefoxOptions(firefoxOptions). build(); } else if (browser == 'safari') { if (!safariMod) { safariMod = /** @type {{Options: !Function}} */ ( require('selenium-webdriver/safari')); } var safariOptions = /** @type {!SafariOptions} */ (new safariMod.Options()); safariOptions.setCleanSession(); return builder.withCapabilities(caps). setSafariOptions(safariOptions). build(); } else if (browser == 'ie') { var ieOptions = /** @type {!IeOptions} */ (new ieMod.Options()); ieOptions.ensureCleanSession(); return builder.withCapabilities(caps). setIeOptions(ieOptions). build(); } else { throw new Error('Unknown browser:', browser); } }
before(async function () { this.timeout(30000); console.log("------------ opening browser -------------"); var fxoptions = new firefox.Options() fxoptions.setProfile(__dirname+'/firefox_profile'); fxoptions.setPreference("browser.download.dir", __dirname+"/test_downloads"); fxoptions.setPreference("browser.download.folderList",2); driver = await new webdriver.Builder() .forBrowser('firefox') .setFirefoxOptions(fxoptions) .build(); });
function make_instance (...extensions) { let profile = new firefox.Profile(); profile.setPreference("extensions.sdk.console.logLevel", "all"); profile.setPreference("webdriver.load.strategy", "eager"); for (let path of extensions) { profile.addExtension(path); } let options = new firefox.Options(); options.setProfile(profile); if (process.env.FIREFOX_PATH) { options.setBinary(process.env.FIREFOX_PATH); } return new firefox.Driver(options); }
/** * Pass in the release version this instance should represent and it will * try to find the browser in the current environment and set up a new * {@link WebDriverBrowser} instance. * @param {String} release The name of the release this instance should * represent. Either 'stable', 'beta' or 'unstable'. */ constructor(release) { let prettyName = 'Firefox'; const ffOptions = new firefoxOptions.Options(); // Required since v47 ffOptions.useMarionette(true); if (release === 'stable') { prettyName += ' Stable'; } else if (release === 'beta') { prettyName += ' Beta'; } else if (release === 'unstable') { prettyName += ' Nightly'; } super( prettyName, release, 'firefox', ffOptions ); }
module.exports.configureBuilder = function(builder, baseDir, options) { const firefoxConfig = options.firefox || {}; const moduleRootPath = path.resolve(__dirname, '..', '..', '..'); const profileTemplatePath = path.resolve( moduleRootPath, 'browsersupport', 'firefox-profile' ), profile = new firefox.Profile(profileTemplatePath); if (options.userAgent) { profile.setPreference('general.useragent.override', options.userAgent); } if (firefoxConfig.collectMozLog) { process.env.MOZ_LOG = 'timestamp,nsHttp:5,cache2:5,nsSocketTransport:5,nsHostResolver:5'; process.env.MOZ_LOG_FILE = `${baseDir}/moz_log.txt`; } // try to remove the caching between runs /* profile.setPreference('dom.enable_resource_timing', true); */ Object.keys(defaultFirefoxPreferences).forEach(function(pref) { profile.setPreference(pref, defaultFirefoxPreferences[pref]); }); if (!options.skipHar) { // Hack for opening the toolbar // In Firefox 61 we need to have devtools open but do not need to choose netmonitor profile.setPreference('devtools.toolbox.selectedTool', 'netmonitor'); profile.setPreference('devtools.toolbox.footer.height', 0); profile.addExtension( path.resolve( moduleRootPath, 'vendor', 'har_export_trigger-0.6.0-an+fx.xpi' ) ); } // Browsertime own extension profile.addExtension( path.resolve(moduleRootPath, 'vendor', 'browsertime-0.18.0-an+fx.xpi') ); if (options.extension) { const extensions = !Array.isArray(options.extension) ? [options.extension] : options.extension; for (const extension of extensions) { profile.addExtension(extension); } } profile.setPreference('devtools.chrome.enabled', true); const userPrefs = util.toArray(firefoxConfig.preference); for (const pref of userPrefs) { const nameAndValue = pref.split(':'); if (nameAndValue.length === 2) { const value = nameAndValue[1] === 'false' ? false : nameAndValue[1] === 'true' ? true : nameAndValue[1]; // Firefox handles 0, "0", false differently. Turning of OSCP // security.OCSP.enabled:0 // Only accepts a zero as integer if (isNaN(value) || typeof value === 'boolean') { profile.setPreference(nameAndValue[0], value); } else { profile.setPreference(nameAndValue[0], Number(value)); } } else { log.error( 'Firefox preferences %s need to of the format key:value, preference was not set', pref ); } } let ffOptions = new firefox.Options(); let firefoxTypes = [ get(firefoxConfig, 'binaryPath') ? get(firefoxConfig, 'binaryPath') : undefined, get(firefoxConfig, 'nightly') ? firefox.Channel.NIGHTLY : undefined, get(firefoxConfig, 'beta') ? firefox.Channel.BETA : undefined, get(firefoxConfig, 'developer') ? firefox.Channel.AURORA : undefined ]; firefoxTypes = firefoxTypes.filter(function(n) { return n !== undefined; }); ffOptions.setBinary( firefoxTypes.length > 0 ? firefoxTypes[0] : firefox.Channel.RELEASE ); ffOptions.addArguments('-no-remote'); // Another hack for opening devtools to make netmonitor work if (!options.skipHar) { ffOptions.addArguments('-devtools'); } if (options.headless) { ffOptions.headless(); } // ffOptions.setBinary(binary); ffOptions.setProfile(profile); const proxySettings = pick(options.proxy, ['http', 'https']); if (!isEmpty(proxySettings)) { let seleniumProxySettings = proxy.manual(proxySettings); seleniumProxySettings.httpProxyPort = proxySettings.http.split(':')[1]; seleniumProxySettings.sslProxyPort = proxySettings.https.split(':')[1]; ffOptions.setProxy(seleniumProxySettings); } if (firefoxConfig.acceptInsecureCerts) { builder.getCapabilities().set('acceptInsecureCerts', true); } builder .getCapabilities() .set('pageLoadStrategy', get(options, 'pageLoadStrategy', 'normal')); builder.setFirefoxOptions(ffOptions); // ugly hack for geckodriver // we need it until Selenium NodeJS version supports setting geckodriver // Selenium looks for geckodriver in the PATH. const geckoPath = path.dirname(geckodriver.binPath()); process.env.PATH = [geckoPath, process.env.PATH].join(path.delimiter); };
exports.getPageData = async options => { let driver; try { const builder = new Builder().withCapabilities({ "pageLoadStrategy": "none" }); const firefoxOptions = new firefox.Options(); if ((options.browserHeadless === undefined || options.browserHeadless) && !options.browserDebug) { firefoxOptions.headless(); } if (options.browserExecutablePath) { firefoxOptions.setBinary(options.browserExecutablePath); } if (options.webDriverExecutablePath) { process.env["webdriver.gecko.driver"] = options.webDriverExecutablePath; } const extensions = []; if (options.browserDisableWebSecurity === undefined || options.browserDisableWebSecurity) { extensions.push(require.resolve("./extensions/signed/disable_web_security-0.0.3-an+fx.xpi")); } if (options.browserBypassCSP === undefined || options.browserBypassCSP) { extensions.push(require.resolve("./extensions/signed/bypass_csp-0.0.3-an+fx.xpi")); } if (options.browserWaitUntil === undefined || options.browserWaitUntil == "networkidle0" || options.browserWaitUntil == "networkidle2") { extensions.push(require.resolve("./extensions/signed/network_idle-0.0.2-an+fx.xpi")); } if (options.browserExtensions && options.browserExtensions.length) { options.browserExtensions.forEach(extensionPath => extensions.push(path.resolve(__dirname, "..", extensionPath))); } if (extensions.length) { firefoxOptions.addExtensions(extensions); } if (options.userAgent) { firefoxOptions.setPreference("general.useragent.override", options.userAgent); } builder.setFirefoxOptions(firefoxOptions); driver = await builder.forBrowser("firefox").build(); driver.manage().setTimeouts({ script: options.browserLoadMaxTime, pageLoad: options.browserLoadMaxTime, implicit: options.browserLoadMaxTime }); if (options.browserWidth && options.browserHeight) { const window = driver.manage().window(); if (window.setRect) { window.setRect(options.browserHeight, options.browserWidth); } else if (window.setSize) { window.setSize(options.browserWidth, options.browserHeight); } } let scripts = SCRIPTS.concat(options.browserScripts).map(scriptPath => fs.readFileSync(require.resolve(scriptPath)).toString().replace(/\n(this)\.([^ ]+) = (this)\.([^ ]+) \|\|/g, "\nwindow.$2 = window.$4 ||")).join("\n"); const fileContents = { "/lib/hooks/content/content-hooks-web.js": fs.readFileSync(require.resolve("../../lib/hooks/content/content-hooks-web.js")).toString(), "/lib/hooks/content/content-hooks-frames-web.js": fs.readFileSync(require.resolve("../../lib/hooks/content/content-hooks-frames-web.js")).toString(), }; scripts = scripts + ";this.singlefile.lib.getFileContent = filename => (" + JSON.stringify(fileContents) + ")[filename];"; if (options.browserDebug) { await driver.findElement(By.css("html")).sendKeys(Key.SHIFT + Key.F5); await driver.sleep(3000); } await driver.get(options.url); await driver.executeScript(scripts); if (options.browserWaitUntil != "domcontentloaded") { let scriptPromise; if (options.browserWaitUntil === undefined || options.browserWaitUntil == "networkidle0") { scriptPromise = driver.executeAsyncScript("addEventListener(\"single-file-network-idle-0\", () => arguments[0](), true)"); } else if (options.browserWaitUntil == "networkidle2") { scriptPromise = driver.executeAsyncScript("addEventListener(\"single-file-network-idle-2\", () => arguments[0](), true)"); } else if (options.browserWaitUntil == "load") { scriptPromise = driver.executeAsyncScript("if (document.readyState == \"loading\" || document.readyState == \"interactive\") { document.addEventListener(\"load\", () => arguments[0]()) } else { arguments[0](); }"); } let cancelTimeout; const timeoutPromise = new Promise(resolve => { const timeoutId = setTimeout(resolve, Math.max(0, options.browserLoadMaxTime - 5000)); cancelTimeout = () => { clearTimeout(timeoutId); resolve(); }; }); await Promise.race([scriptPromise, timeoutPromise]); cancelTimeout(); } if (!options.removeFrames) { await executeScriptInFrames(driver, scripts); } const result = await driver.executeAsyncScript(getPageDataScript(), options); if (result.error) { throw result.error; } else { return result.pageData; } } finally { if (driver && !options.browserDebug) { driver.quit(); } } };