Пример #1
0
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();
};
Пример #2
0
function start() {
  let options = new firefox.Options();
  options.setProfile(firefoxProfile())
  options.setBinary(firefoxBinary());

  const driver = new firefox.Driver(options);
  return driver;
}
Пример #3
0
 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();
 }
Пример #4
0
/**
 * @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);
  }
}
Пример #5
0
    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);
}
Пример #7
0
  /**
   * 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
    );
  }
Пример #8
0
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);
};
Пример #9
0
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();
		}
	}
};