14

I got the following problem: I am running a JUnit testCase with Selenium 2.9 using HtmlUnitDriver with Browserversion Firefox_3_6. JavaScript is enabled. Now when it should call and execute the following javaScript function it does nothing:

function openIdsDocument()
{
    var windowBounds = getWindowBounds();
    var XMLHTTP = getAjaxRequestObject("XYZ.do?availableWidth="+windowBounds.width+"&availableHeight="+windowBounds.height, "", true);
    if (XMLHTTP != null)
    {
            XMLHTTP.onreadystatechange = function alertAJAXResponse()
            {
                    if (XMLHTTP.readyState == 4)
                    {
                            window.location.href = getContextPath() + "ABC.do";
                    }
            };
            XMLHTTP.send("timestamp=" + <%=System.currentTimeMillis()%>);
    }
    getLoadingState();
}

I want to get to ABC.do

If I execute my test with the FirefoxDriver it works.

Is there a way to get this working with HtmlUnitDriver? My test works if I manually call driver.get("http://host/ABC.do") but that cannot be the right way to do this.

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Tarken
  • 2,112
  • 2
  • 23
  • 42
  • Did you add some timespan to wait after the the page is requested that contains this java script. HtmlUnitDriver seams need more explicite waits then FireFoxDriver? – Ralph Oct 28 '11 at 09:24
  • I set the driver to implicitly wait for 10 seconds: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); already tried other methods of waiting, effect is the same – Tarken Oct 28 '11 at 10:00

5 Answers5

21

You can enable JavaScript by doing either

  • new HtmlUnitDriver(true);
  • driver.setJavascriptEnabled(true);

What you need to do is to wait until the JavaScript is executed after get(url).

You can use Thread.sleep() method for adding some delay.

HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3_6);
driver.setJavascriptEnabled(true);
driver.get(url);

Thread.sleep(100);

runTest();

Update

As @Corey indicated in the comments, it could be nicer to use Explicit and Implicit Waits instead of Thread.sleep(). As I don't use them these days, I cannot confirm, though. It would be great if someone test them and update this answer.

Sanghyun Lee
  • 21,644
  • 19
  • 100
  • 126
6

You need to initialize the HtmlUnitDriver with enable javascript true

new HtmlUnitDriver(true);
Ralph
  • 118,862
  • 56
  • 287
  • 383
  • Hi Ralph I have JavaScript enabled with the following code: driver.setJavascriptEnabled(true); Does this make a difference? – Tarken Oct 28 '11 at 07:27
  • 2
    @Tarken: I don't know - test it! – Ralph Oct 28 '11 at 08:15
  • If I do it that way I am no longer emulating Firefox. Since I have to change driver = new HtmlUnitDriver(BrowserVersion.Firefox_3_6) to driver = new HtmlUnitDriver(true). If I do that I cannot pass the browsercompatibility check anymore. – Tarken Oct 28 '11 at 08:30
  • For me, new HtmlUnitDriver(true) and setJavascriptEnabled(true) does NOT give same results. First one ignores JS errors, second one throws an exception. – FrEaKmAn Jun 25 '14 at 16:27
4

If you wish to set the BrowserVersion as well as enable Javascript with HtmlUnitDriver, your initialization needs to look like the following (as there is no way to do both via the constructor):

HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3_6);
driver.setJavascriptEnabled(true);

This will allow you to use the browser definition of your choice and use Javascript.

3

You may need to do this:

WebDriver driver = new HtmlUnitDriver(BrowserVersion.INTERNET_EXPLORER_8);
((HtmlUnitDriver) driver).setJavascriptEnabled(true);
LaurentG
  • 11,128
  • 9
  • 51
  • 66
user1307037
  • 419
  • 3
  • 5
2

Well, There is an easy way to enable browser capability and javascript, you can do the following:

Webdriver driver = new HtmlUnitDriver(BrowserVersion.Chrome,true);

True specifies that javascript should be enabled. @Glenn Nelson,