为什么HtmlUnitDriver不执行JavaScript?

Tar*_*ken 14 javascript java ajax selenium htmlunit-driver

我遇到了以下问题:我正在使用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=" + <%=System.currentTimeMillis()%>);
    }
    getLoadingState();
}
Run Code Online (Sandbox Code Playgroud)

我想去ABC.do

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

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

San*_*Lee 21

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

  • new 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();
Run Code Online (Sandbox Code Playgroud)

更新

作为@Corey在评论中指出的,它可能是更好的使用显性和隐性等待代替Thread.sleep().因为我现在不使用它们,但我无法证实.如果有人测试它们并更新这个答案会很棒.


Ral*_*lph 6

您需要初始化HtmlUnitDriverwith enable javascripttrue

new HtmlUnitDriver(true);
Run Code Online (Sandbox Code Playgroud)

  • @Tarken:我不知道 - 测试一下! (2认同)