为什么HtmlUnitDriver不执行JavaScript?

我遇到了以下问题:我使用HtmlUnitDriver和Browserversion Firefox_3_6运行带有Selenium 2.9的JUnit testCase。 JavaScript已启用。 现在,当它应该调用并执行以下javaScript函数时,它什么都不做:

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=" + ); } getLoadingState(); } 

我想去ABC.do

如果我使用FirefoxDriver执行我的测试,它可以工作。

有没有办法让这个使用HtmlUnitDriver? 如果我手动调用driver.get(“ http://host/ABC.do ”),我的测试工作,但这不是正确的方法。

您可以通过执行任一操作来启用JavaScript

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

你需要做的是等到get(url)之后执行JavaScript。

您可以使用Thread.sleep()方法添加一些延迟。

 HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3_6); driver.setJavascriptEnabled(true); driver.get(url); Thread.sleep(100); runTest(); 

更新

正如@Corey在评论中指出的那样,使用Explicit和Implicit Waits而不是Thread.sleep()可能更好。 因为我现在不使用它们,但我无法证实。 如果有人测试它们并更新这个答案会很棒。

您需要使用enable javascript true初始化HtmlUnitDriver

 new HtmlUnitDriver(true); 

如果您希望设置BrowserVersion以及使用HtmlUnitDriver启用Javascript,您的初始化需要如下所示(因为没有办法通过构造函数执行):

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

这将允许您使用您选择的浏览器定义并使用Javascript。

您可能需要这样做:

 WebDriver driver = new HtmlUnitDriver(BrowserVersion.INTERNET_EXPLORER_8); ((HtmlUnitDriver) driver).setJavascriptEnabled(true); 

好吧,有一种简单的方法来启用浏览器function和javascript,您可以执行以下操作:

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

True指定应启用javascript。 @Glenn Nelson,