为啥 HtmlUnitDriver 不执行 JavaScript?

Posted

技术标签:

【中文标题】为啥 HtmlUnitDriver 不执行 JavaScript?【英文标题】: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);已经尝试过其他的等待方式,效果是一样的 【参考方案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。 @格伦尼尔森,

【讨论】:

以上是关于为啥 HtmlUnitDriver 不执行 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

为啥弄不到jav的力量

带有 HTMLUnitDriver 的 Selenium 3.0.x

Selenium HtmlUnitDriver 程序中捕获的 SocketException

干货来袭——WebDriver系列学习笔记

为啥我的环境变量里面找不到classpath?

为啥我无法在文档上设置 innerHTML? [复制]