Younes
Younes

Reputation: 1671

Selenium Javascript Webdriver: how to setup Firefox profile to accept selfsigned certificate

I'm trying to use selenium-webdriver to test a site that uses a self-signed certificate.

To pass the tests under Firefox, it is required to use a profile that tells Firefox to accept the self-signed certificate.

I was able to use a profile created using firefox -ProfileManager. However, I'm not able to use a profile that is created programmatically.

Can anybody tell what I'm missing here?

Here is the javascript program that uses the profile created by firefox -ProfileManager:

var webdriver = require('selenium-webdriver');
var firefox   = require('selenium-webdriver/firefox');

var profile   = new firefox.Profile('/path/to/firefox/profile');
var browser   = new firefox.Driver(new firefox.Options().setProfile(profile));

browser.get('https://self-signed.badssl.com/');
browser.quit();

And here is the javascript program that uses the profile created by code:

var webdriver = require('selenium-webdriver');
var firefox   = require('selenium-webdriver/firefox');

var profile   = new firefox.Profile();
profile.setAcceptUntrustedCerts(true);
profile.setAssumeUntrustedCertIssuer(false); // `true` didn't work too
var browser   = new firefox.Driver(new firefox.Options().setProfile(profile));

browser.get('https://self-signed.badssl.com/');
browser.quit();

The error I'm getting with the second program is as follows:

$ node test-firefox-profile.js
/user/ws/node_modules/selenium-webdriver/lib/promise.js:654
    throw error;
    ^

WebDriverError: Error loading page
    at WebDriverError (/user/ws/node_modules/selenium-webdriver/lib/error.js:27:10)
    at Object.throwDecodedError (/user/ws/node_modules/selenium-webdriver/lib/error.js:477:11)
    at parseHttpResponse (/user/ws/node_modules/selenium-webdriver/lib/http.js:386:15)
    at /user/ws/node_modules/selenium-webdriver/lib/http.js:328:11
    at process._tickCallback (node.js:369:9)
From: Task: WebDriver.navigate().to(https://self-signed.badssl.com/)
    at Driver.schedule (/user/ws/node_modules/selenium-webdriver/lib/webdriver.js:414:17)
    at Navigation.to (/user/ws/node_modules/selenium-webdriver/lib/webdriver.js:1042:25)
    at Driver.get (/user/ws/node_modules/selenium-webdriver/lib/webdriver.js:832:28)
    at Object.<anonymous> (/user/ws/test-firefox-profile.js:9:9)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)

Upvotes: 3

Views: 9431

Answers (2)

Alan Dong
Alan Dong

Reputation: 4095

This worked for me. driver = new webdriver.Builder().withCapabilities({'browserName': 'firefox', acceptSslCerts: true, acceptInsecureCerts: true});

Upvotes: 3

Just a student
Just a student

Reputation: 11050

When answering another question, I stumbled upon this question. Eventually I figured out the answer.

What worked for me was using the Builder instead of trying to use a firefox.Driver:

var webdriver = require('selenium-webdriver'),
    firefox = require('selenium-webdriver/firefox'),
    driver = null,
    profile = new firefox.Profile();
profile.setAcceptUntrustedCerts(true);
profile.setAssumeUntrustedCertIssuer(false);

var opts = new firefox.Options();
opts.setProfile(profile);
var builder = new webdriver.Builder().forBrowser('firefox');
builder.setFirefoxOptions(opts);
driver = builder.build();

driver.get('https://www.google.com');
driver.quit();

Of course, all methods of the firefox.Profile can be used before setting it in the firefox.Options and passing those to the builder.

Note that the builder will still return an instance of a firefox.Driver.

Upvotes: 2

Related Questions