Reputation: 13147
I am trying to implement some Selenium 2 Webdriver tests with JUnit. The documentation on SeleniumHQ.org and the web is confusing to me because it seems to jump back and forth between Selenium RC and Webdriver. Plus, my Java is not very strong. I've took a few courses years ago, but haven't used it much. I want to have JUnit tests run from a headless CI server, and have Firefox run on a remote client system by using Webdriver.
From what I've gathered, I can use the following code to open a Webdriver-controlled instance of Firefox on my local system. The web site I'm testing has an untrusted SSL/TLS certificate, so I need to tell the Firefox driver to accept untrusted certificates. This works great locally:
FirefoxProfile profile = new FirefoxProfile();
profile.setAcceptUntrustedCertificates(true); // NOTE: this is the default behavior
RemoteWebDriver driver = new FirefoxDriver(profile);
Selenium selenium = new WebDriverBackedSelenium(driver, baseurl);
But I can't figure out how to do this on the remote system using Webdriver. The two approaches seem totally incompatible. The code above does not fit in any way into the following code that I have been using for using Webdriver remotely:
Selenium selenium = new DefaultSelenium(host, port, browser, baseurl);
selenium.start();
Now, I have spent many hours working with custom Firefox profiles on the remote test system. It worked in the summer of 2012, but after recent OS and browser updates, it stopped working. It seems much better to create the Firefox driver profile and call setAcceptUntrustedCertificates(true). Is it possible to use Webdriver to run tests in a browser on a remote system and also have the browser ignore untrusted SSL/TLS certificates?
Upvotes: 2
Views: 6227
Reputation: 13147
When I asked this question, I didn't understand the distinction between Selenium objects and WebDriver objects. Even though I was specifically trying to learn about Selenium 2's "WebDriver" feature, I foolishly thought that I could write a "Selenium 2 Webdriver" project with Selenium 2 objects. That may sound obvious to someone who has experience with these tools, but that distinction was still not clear in my mind after reading "Selenium 2" books and project documentation.
As I result, I was writing Java code to instantiate a Selenium object to examine a web page, and trying to pass the Selenium object a WebDriver object, in the hope that the test would run on a remote server.
Now it seems clearer: The Selenium and WebDriver projects merged into a new umbrella project named (confusingly) Selenium 2.0, but they are distinct and separate tools within Selenium 2. If I want to use the WebDriver API, it seems that I must convert any existing Selenium objects to WebDriver objects. There appears to be no useful interaction between the two tools.
For example, in my project I had the following code. It ran great on my local desktop system's web browser:
Selenium selenium = new DefaultSelenium(host, port, browser, baseurl);
selenium.get(urlPath);
selenium.type(username_field, username);
selenium.type(password_field, password);
selenium.click(login_button);
But I want to be able to run that test on a headless continuous integration server, not my desktop system. I have converted the code to use a WebDriver object instead of a Selenium object. Now it runs on a remote system connected to a Selenium Grid 2 server:
WebDriver driver = new RemoteWebDriver(new URL("http://10.0.0.29:4444/wd/hub"), capability);
driver.get(urlPath);
driver.findElement(By.name(username_field)).sendKeys(username);
driver.findElement(By.name(password_field)).sendKeys(password);
driver.findElement(By.className(login_button)).submit();
I hope other people wanting to learn how to use WebDriver in Selenium 2 will not waste as much time as I did reading about Selenium objects, thinking that the Selenium object is part of WebDriver. My current [n00b] advice is to ignore anything that mentions Selenium objects, and focus purely on finding out as much as you can about WebDriver objects. A good place to start is the WebDriver documentation at SeleniumHQ.org:
As A.J. suggested in his answer, also take a look at the Selenium Grid documentation:
And PS: a remote Selenium 2 Webdriver instance accepts untrusted SSL/TLS certificates automatically, by default. No code required.
Upvotes: -1
Reputation: 1389
First of all i will recommend sticking to webdriver if you are using webdriver backed selenium just for profile. You can define profile to be used on your local machine as
File file = new File("firebug-1.8.1.xpi");
FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.addExtension(file);
firefoxProfile.setPreference("extensions.firebug.currentVersion", "1.8.1");
WebDriver driver = new FirefoxDriver(firefoxProfile);
To Answer Your Question: I will quote Simon Stewart's solution from here:
FirefoxProfile profile = new FirefoxProfile();
profile.setAcceptUntrustedCertificates(true);
DesiredCapabilities caps = DesiredCapabilities.firefox();
caps.setCapability(FirefoxDriver.PROFILE, profile);
Use this profile to create the remote driver.
Now if this doesn't work than may be we can write-up a bug (or at least a feature request).
post edit: I can not really test this solution as I dont have a cert issue site readily available. So in a way I would be looking towards you feedback to get the real picture... :)
Upvotes: 2
Reputation: 4949
As mentioned in your question, you don't need to set any property for accepting untrusted certificates explicitly. By default webdriver accepts untrusted certificates. Rather than using a webdriverbacked selenium, you should use the remotewebdriver directly like:
Webdriver wd = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());
Here http://localhost:4444/wd/hub
is the URL of the Hub to which tests should be send for execution. When you start the tests, hub will look for remote nodes that have registered with firefox capability.
Personally I would suggest to read documentation at http://code.google.com/p/selenium/wiki/Grid2 rather than seleniumhq.org. As far as I know, selenium team is trying to get the seleniumhq documentation updated. You can also contribute to it :)
Upvotes: 2