None of the popular browsers uses the javascript engine used by HtmlUnit (Rhino). If you test javascript using HtmlUnit the results may differ significantly from those browsers.
When we say "javascript" we actually mean "javascript and the DOM". Although the DOM is defined by the W3C each browser out there has its own quirks and differences in their implementation of the DOM and in how javascript interacts with it. HtmlUnit has an impressively complete implementation of the DOM and has good support for using javascript, but it is no different from any other browser: it has its own quirks and differences from both the W3C standard and the DOM implementations of the major browsers, despite its ability to mimic other browsers.
With WebDriver, we had to make a choice; do we enable HtmlUnit's javascript capabilities and run the risk of teams running into problems that only manifest themselves there, or do we leave javascript disabled, knowing that there are more and more sites that rely on javascript? We took the conservative approach, and by default have disabled support when we use HtmlUnit. With each release of both WebDriver and HtmlUnit, we reassess this decision: we hope to enable javascript by default on the HtmlUnit at some point.
Enabling Javascript
If you can't wait, enabling Javascript support is very easy:
This will cause the HtmlUnitDriver to emulate IE's Javascript handling by default.
Emulating a Specific Browser
Notwithstanding other considerations above, it is possible to get HtmlUnitDriver to emulate a specific browser. You should not really be doing this, as web-applications are better coded to be neutral of which reasonably recent browser you are using. There are two more constructors forHtmlUnitDriver that take allow us to indicate a browser to emulate. One takes a browser version directly:
HtmlUnitDriver(Capabilities capabilities) Note: There are two configuration modes for the HtmlUnitDriver using this constructor.
Method Summary
void
close() Close the current window, quitting the browser if it's the last window currently open.
java.lang.Object
executeAsyncScript(java.lang.String script, java.lang.Object... args) Execute an asynchronous piece of JavaScript in the context of the currently selected frame or window.
java.lang.Object
executeScript(java.lang.String script, java.lang.Object... args) Executes JavaScript in the context of the currently selected frame or window.
getWindowHandle() Return an opaque handle to this window that uniquely identifies it within this driver instance.
java.util.Set
getWindowHandles() Return a set of window handles which can be used to iterate over all open windows of this webdriver instance by passing them to #switchTo().window(String)
modifyWebClient(com.gargoylesoftware.htmlunit.WebClient client) Child classes can override this method to customise the webclient that the HtmlUnit driver uses.
Note: There are two configuration modes for the HtmlUnitDriver using this constructor. The first is where the browserName is "firefox", "internet explorer" and browserVersion denotes the desired version. The second one is where the browserName is "htmlunit" and the browserVersion denotes the required browser AND its version. In this mode the browserVersion could either be "firefox" for Firefox or "internet explorer-7" for IE 7. The Remote WebDriver uses the second mode - the first mode is deprecated and should not be used.
Load a new web page in the current browser window. This is done using an HTTP GET operation, and the method will block until the load is complete. This will follow redirects issued either by the server or as a meta-redirect from within the returned HTML. Should a meta-redirect "rest" for any duration of time, it is best to wait until this timeout is over, since should the underlying page change whilst your test is executing the results of future calls against this interface will be against the freshly loaded page. Synonym for WebDriver.Navigation.to(String).
Find the first WebElement using the given method. This method is affected by the 'implicit wait' times in force at the time of execution. The findElement(..) invocation will return a matching row, or try again repeatedly until the configured timeout is reached. findElement should not be used to look for non-present elements, use WebDriver.findElements(By) and assert zero length response instead.
Find all elements within the current page using the given mechanism. This method is affected by the 'implicit wait' times in force at the time of execution. When implicitly waiting, this method will return as soon as there are more than 0 items in the found collection, or will return an empty list if the timeout is reached.
Get the source of the last loaded page. If the page has been modified after loading (for example, by Javascript) there is no guarantee that the returned text is that of the modified page. Please consult the documentation of the particular driver being used to determine whether the returned text reflects the current state of the page or the text last sent by the web server. The page source returned is a representation of the underlying DOM: do not expect it to be formatted or escaped in the same way as the response sent from the web server. Think of it as an artist's impression.
Return a set of window handles which can be used to iterate over all open windows of this webdriver instance by passing them to #switchTo().window(String)
Return an opaque handle to this window that uniquely identifies it within this driver instance. This can be used to switch to this window at a later date
Executes JavaScript in the context of the currently selected frame or window. The script fragment provided will be executed as the body of an anonymous function.Within the script, use document to refer to the current document. Note that local variables will not be available once the script has finished executing, though global variables will persist. If the script has a return value (i.e. if the script contains a return statement), then the following steps will be taken:
For an HTML element, this method returns a WebElement