- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
根据 https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot ,使用 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(...)
没有抛出任何异常,结果字符串仍然包含“未计算的 Angular 表达式”,例如
<div>
{{name}}
</div>
我知道 http://htmlunit.10904.n7.nabble.com/htmlunit-to-scrape-angularjs-td29931.html#a30075但那里给出的建议也不起作用。
当然,相同的 GET 请求在所有当前浏览器中都可以正常工作。
关于如何让 HtmlUnit 与 AngularJS 一起工作的任何想法/经验?
更新:
我创建了一个 HTMLUnit bug report .
目前,我将我的实现切换到了 PhantomJS。也许这段代码片段可以帮助其他人解决类似的问题:
System.setProperty("phantomjs.binary.path", "phantomjs.exe");
DesiredCapabilities caps = new DesiredCapabilities();
caps.setJavascriptEnabled(true);
caps.setCapability("takesScreenshot", false);
PhantomJSDriver driver = new PhantomJSDriver(caps);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(new URL("..."));
String result = driver.getPageSource();
更新 2:我停止手动呈现我的页面,因为 Google 爬虫现在自己呈现 Angular 网站
最佳答案
我遇到了同样的问题,但无法使用显式 Bootstrap ,因为 Angular 端到端测试不适用于显式 Bootstrap 。
我用
解决了这个问题<html id="ng-app" class="ng-app: appmodule;">
代替
<html ng-app="appmodule">
htmlunit 测试有效,e2e 测试也有效。
很可能,htmlunit 不(完全?)支持 document.querySelectorAll()。 angularInit() 使用此方法来查找 ng-app 指令。
ng-app 指令的语法变体围绕 angularInit() 中的 document.querySelectorAll() 调用工作。
关于javascript - HTMLUnit 不适用于 AngularJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153104/
我是一名优秀的程序员,十分优秀!