Selenium Trick: Using a different DNS

I love Selenium. It’s a great tool, that does a damn fine job. But one thing I’ve been wanting to do for a while is to get it to use a different DNS server to the box it’s running on.

Here’s how you do it:

java -Dsun.net.spi.nameservice.provider.1=dns,sun -Dsun.net.spi.nameservice.nameservers= -jar selenium-server.jar

(Caveat: may not work on non-Sun JVMs. Does work on OSX, though…)

I wanted this because we use VM-based test environments, each with a DNS server. To date when we’ve been running tests against these environments, we’ve manually configured the test client to use the appropriate DNS sever. Now, however, I can make the environment name an argument to the test scripts.

For more details on these command-line arguments, see the official documentation.


Update: It turns out that there were some extra subtleties to take into account.

  1. By default, Selenium doesn’t configure the client browser to use itself as a proxy server; it normally runs in the Heightened Privileges mode.
  2. The proxy injection mode changes the behaviour of Selenium, and in my case didn’t work*
  3. I could force the use of the proxy by telling my Selenium client to add custom request headers (see below). That worked – except for SSL.
  4. SSL didn’t work because Selenium creates an SSL tunnel (to deal with certificates, I guess). To do that, it calls out to InetAddress.getLocalHost(). If your machine name isn’t ‘localhost’, this will try to do a DNS lookup – out to the server you configured for your DNS, which in my case didn’t know my machine.

Still, it did work and do the job that I wanted. Problem solved. :) At least for Firefox – different browsers seem to only be able to use a system proxy (IE/Safari), or always use Selenium as the proxy (Google Chrome). This area is more than a little “bleeding edge”, and in hindsight it would probably have been easier just to hack my hosts file.

Here’s how I told my selenium-client (in Ruby) to use custom request headers:

@browser.start_new_browser_session(:addCustomRequestHeaders => true)

Having an explicit “use proxy” mode would have been nicer, though.

* The problem with using proxyInjection with FireFox is probably just mine; I got a clash about the version of libsqllite3.0.dylib

One thought on “Selenium Trick: Using a different DNS

  1. Pingback: A Smattering of Selenium #20 « Official Selenium Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s