Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTMLUnit不适用于AngularJS_Javascript_Ajax_Angularjs_Web Crawler_Htmlunit - Fatal编程技术网

Javascript HTMLUnit不适用于AngularJS

Javascript HTMLUnit不适用于AngularJS,javascript,ajax,angularjs,web-crawler,htmlunit,Javascript,Ajax,Angularjs,Web Crawler,Htmlunit,据介绍,使用HtmlUnit(2.13),我试图使用AngularJS(1.2.1)为网页创建快照 我的Java代码是: WebClient webClient = new WebClient(); webClient.setAjaxController(new NicelyResynchronizingAjaxController()); webClient.setCssErrorHandler(new SilentCssErrorHandler()); webClient.getOpti

据介绍,使用HtmlUnit(2.13),我试图使用AngularJS(1.2.1)为网页创建快照

我的Java代码是:

WebClient webClient = new WebClient();

webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.setCssErrorHandler(new SilentCssErrorHandler());

webClient.getOptions().setCssEnabled(true);
webClient.getOptions().setRedirectEnabled(false);
webClient.getOptions().setAppletEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setPopupBlockerEnabled(true);
webClient.getOptions().setTimeout(10000);

webClient.getOptions().setThrowExceptionOnFailingStatusCode(true);
webClient.getOptions().setThrowExceptionOnScriptError(true);
webClient.getOptions().setPrintContentOnFailingStatusCode(true);

HtmlPage page = webClient.getPage(new WebRequest(new URL("..."), HttpMethod.GET));
webClient.waitForBackgroundJavaScript(5000);
String result = page.asXml();
虽然
webClient.getPage(…)
不会引发任何异常,但结果字符串仍然包含“未计算的角度表达式”,例如

更新2:
我停止了手动渲染我的页面,因为Google crawler现在渲染angularjs站点本身

当我的单页应用程序使用angularjs 1.0.4时,我有一个类似的代码可以正常工作;唯一不同的是,我必须告诉htmlunit使用FIREFOX_17而不是htmlunit 2.12中的默认IE8(与您提供的链接类似,但使用FIREFOX_17而不是FIREFOX_10)

我升级到angularjs 1.2,我的页面显示了所有角度占位符。

如果我使用HtmlUnit,“未计算的角度表达式”也有同样的问题。解决办法是。复制步骤:

应用程序在浏览器中工作(但不使用HtmlUnit)的最低示例:

<!doctype html>
<html ng-app>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
</head>
<body>
    <div>
        <label>Name:</label> <input type="text" ng-model="yourName"
            placeholder="Enter a name here">
        <hr>
        <h1>Hello {{yourName}}!</h1>
    </div>
</body>
</html>

这是有效的解决方案,但不是真正的快乐解决方案。我不知道这是HtmlUnit或Angularjs的问题。

我也有同样的问题,但无法使用显式引导,因为角度e2e测试不能使用显式引导

我用计算机解决了这个问题

<html id="ng-app" class="ng-app: appmodule;"> 

而不是

<html ng-app="appmodule">

htmlunit测试工作,e2e测试也工作

很可能,htmlunit(完全?)不支持document.querySelectorAll()。angularInit()使用此方法查找ng应用程序指令


ng app指令的语法变体适用于angularInit()中的document.querySelectorAll()调用。

HtmlUnit问题现已修复。AngularJS表达式现在已正确计算


感谢您的报告,已在SVN中修复。请期待HtmlUnit 2.15尽快发布

测试用例现在可以与Chrome simulation一起使用,原因是querySelectorAll()应该在文档/元素中定义

请注意,似乎其他人已经确定了根本原因,向HtmlUnit团队提供一个最小的测试用例可以在很短的时间内修复它


再次感谢您的反馈。

这应该是公认的答案,因为它解决了HTMLUnit无法解决角度指令的问题。谢谢这似乎有帮助,因为HtmlUnit对AngularJS的支持很差,但它并不能解决所有问题。希望2.15会更好…这是固定在什么版本?我使用的是2.14,使用BrowserVersion.CHROME或FIREFOX\u 24会导致未计算的AngularJS表达式,但使用BrowserVersion.INTERNET\u EXPLORER\u 8似乎会计算这些表达式。看起来这还没有发布(2.14在2月份发布)。此修复是在3月份进行的,目前还不是发布的一部分。我试图从最新的SVN构建,但失败了:我已经用最新的SVN分支2.15再次测试了这一点,我仍然需要使用@stephanme在回答中提到的老方法。我使用的是AngularJS 1.0.8。
<!doctype html>
<html ng-app>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
</head>
<body>
    <div>
        <label>Name:</label> <input type="text" ng-model="yourName"
            placeholder="Enter a name here">
        <hr>
        <h1>Hello {{yourName}}!</h1>
    </div>
</body>
</html>
<!doctype html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
    <script>
        angular.element(document).ready(function() {
            angular.module('myApp', []);
            angular.bootstrap(document, ['myApp']);
        });
    </script>
</head>
<body>
    <div>
        <label>Name:</label> <input type="text" ng-model="yourName"
            placeholder="Enter a name here">
        <hr>
        <h1>Hello {{yourName}}!</h1>
    </div>
</body>
</html>
WebClient webClient = new WebClient();
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = webClient.getPage("http://localhost:8080/index.html");

// Initial state
assertEquals("Hello !", page.getElementsByTagName("h1").get(0).asText());

// Set value
((HtmlInput)page.getElementsByTagName("input").get(0)).setValueAttribute("world");

// New state
assertEquals("Hello world!", page.getElementsByTagName("h1").get(0).asText());
<html id="ng-app" class="ng-app: appmodule;"> 
<html ng-app="appmodule">