【问题标题】:Why doesn't HtmlUnitDriver execute JavaScript?为什么 HtmlUnitDriver 不执行 JavaScript?
【发布时间】:2011-12-17 02:17:42
【问题描述】:

我遇到了以下问题: 我正在使用带有 Browserversion Firefox_3_6 的 HtmlUnitDriver 运行带有 Selenium 2.9 的 JUnit 测试用例。 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();
}

我想去 ABC.do

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

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

【问题讨论】:

  • 您是否添加了一些时间跨度以在请求包含此 java 脚本的页面后等待。 HtmlUnitDriver 接缝需要比 FireFoxDriver 更明确的等待?
  • 我将驱动程序设置为隐式等待 10 秒: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);已经尝试过其他的等待方式,效果是一样的

标签: java javascript ajax selenium htmlunit-driver


【解决方案1】:

你需要初始化HtmlUnitDriver with enable javascript true

new HtmlUnitDriver(true);

【讨论】:

  • 嗨 Ralph 我使用以下代码启用了 JavaScript:driver.setJavascriptEnabled(true);这有什么不同吗?
  • @Tarken:我不知道 - 测试一下!
  • 如果我这样做,我将不再模拟 Firefox。因为我必须将 driver = new HtmlUnitDriver(BrowserVersion.Firefox_3_6) 更改为 driver = new HtmlUnitDriver(true)。如果我这样做,我将无法再通过浏览器兼容性检查。
  • 对我来说, new HtmlUnitDriver(true) 和 setJavascriptEnabled(true) 不会给出相同的结果。第一个忽略 JS 错误,第二个抛出异常。
【解决方案2】:

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

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

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

【讨论】:

  • 这就是我从一开始就在做的事情,但没有奏效。
【解决方案3】:

您可以通过以下任一方式启用 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 在 cmets 中指出的那样,使用 Explicit and Implicit Waits 而不是 Thread.sleep() 可能会更好。由于这些天我不使用它们,但我无法确认。如果有人对其进行测试并更新此答案,那就太好了。

【讨论】:

  • 不要使用静态睡眠
  • @CoreyGoldberg 想解释一下原因?
  • 它通常是测试中的反模式
  • 是的,我可以猜到原因,但我认为使用它比放弃编写测试要好,因为它通常是一种反模式。当然,如果有替代方案就好了。
  • 太棒了。它是什么?我不是在冒犯。我真的很想知道。
【解决方案4】:

您可能需要这样做:

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

【讨论】:

    【解决方案5】:

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

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

    True 指定应该启用 javascript。 @格伦尼尔森,

    【讨论】:

      猜你喜欢
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2014-10-16
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多