为啥 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?的主要内容,如果未能解决你的问题,请参考以下文章
带有 HTMLUnitDriver 的 Selenium 3.0.x