gpt4 book ai didi

javascript - HTMLUnit 不适用于 AngularJS

转载 作者:数据小太阳 更新时间:2023-10-29 05:08:00 26 4
gpt4 key购买 nike

根据 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com