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.
- By default, Selenium doesn’t configure the client browser to use itself as a proxy server; it normally runs in the Heightened Privileges mode.
- The proxy injection mode changes the behaviour of Selenium, and in my case didn’t work*
- 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.
- 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