为什么';HtmlUnitDriver是否执行JavaScript?

为什么';HtmlUnitDriver是否执行JavaScript?,java,javascript,ajax,selenium,htmlunit-driver,Java,Javascript,Ajax,Selenium,Htmlunit Driver,我遇到了以下问题: 我正在运行一个带有Selenium 2.9的JUnit测试用例,该测试用例使用HtmlUnitDriver和Browserversion Firefox\u 3\u 6。JavaScript已启用。现在,当它应该调用并执行以下javaScript函数时,它什么也不做: function openIdsDocument() { var windowBounds = getWindowBounds(); var XMLHTTP = getAjaxRequestOb

我遇到了以下问题: 我正在运行一个带有Selenium 2.9的JUnit测试用例,该测试用例使用HtmlUnitDriver和Browserversion Firefox\u 3\u 6。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=" + <%=System.currentTimeMillis()%>);
    }
    getLoadingState();
}
函数openIdsDocument() { var windowBounds=getWindowBounds(); var XMLHTTP=getAjaxRequestObject(“XYZ.do?availableWidth=“+windowBounds.width+”&availableHeight=“+windowBounds.height”,true); if(XMLHTTP!=null) { XMLHTTP.onreadystatechange=函数alertAJAXResponse() { if(XMLHTTP.readyState==4) { window.location.href=getContextPath()+“ABC.do”; } }; 发送(“timestamp=“+); } getLoadingState(); } 我想去ABC

如果我用FirefoxDriver执行测试,它就会工作

有没有办法让它与HtmlUnitDriver一起工作?
如果我手动调用driver.get(“”),我的测试可以正常工作,但这不是正确的方法。

您需要初始化


如果您希望设置
BrowserVersion
并启用带有HtmlUnitDriver的Javascript,那么您的初始化需要如下所示(因为无法通过构造函数同时执行这两项操作):


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

您可以通过执行以下任一操作来启用Javascript:

  • 新的HtmlUnitDriver(true)
  • driver.setJavascriptEnabled(true)
您需要做的是等待JavaScript在
get(url)
之后执行

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

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

Thread.sleep(100);

runTest();
更新


正如@Corey在评论中指出的,使用它来代替
Thread.sleep()
,可能会更好。但是,由于我这些天没有使用它们,我无法确认。如果有人对其进行测试并更新此答案,那就太好了。

您可能需要执行以下操作:

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

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

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

True指定应启用javascript@Glenn Nelson,

嗨Ralph,我已经用以下代码启用了JavaScript:driver.setJavascriptEnabled(true);这有什么不同吗?@Tarken:我不知道-试试看!如果我这样做,我就不再模仿Firefox了。因为我必须将driver=new-HtmlUnitDriver(BrowserVersion.Firefox\u 3\u 6)更改为driver=new-HtmlUnitDriver(true)。如果我这样做,我将无法通过浏览器兼容性检查。对我来说,新的HtmlUnitDriver(true)和setJavascriptEnabled(true)不会给出相同的结果。第一个忽略JS错误,第二个抛出异常。在请求包含此java脚本的页面后,是否添加了一些timespan以等待。HtmlUnitDriver需要比FireFoxDriver更多的显式等待?我将驱动程序设置为隐式等待10秒:driver.manage().timeouts().implicitlyWait(10,TimeUnit.seconds);已经尝试过其他的等待方法,效果是一样的,这是我从一开始就做的,但没有起作用。不要使用静态sleeps@CoreyGoldberg想解释一下原因吗?这通常是testsYeah中的反模式,我能猜到原因,但我认为使用它比放弃编写测试要好,因为它通常是一种反模式。当然,如果有其他选择那就好了。太好了。这是怎么一回事?我没有冒犯你。我真的很想知道。
WebDriver driver = new HtmlUnitDriver(BrowserVersion.INTERNET_EXPLORER_8);
((HtmlUnitDriver) driver).setJavascriptEnabled(true);
Webdriver driver = new HtmlUnitDriver(BrowserVersion.Chrome,true);