【问题标题】:HtmlUnit with GWT returns incomplete page带有 GWT 的 HtmlUnit 返回不完整的页面
【发布时间】:2012-01-17 21:48:46
【问题描述】:

我正在尝试使用HtmlUnit 来测试我的GWT 网站是否正确加载。

很遗憾,我正在获取的页面似乎并不完整。当我在普通浏览器中访问该页面时,它缺少可查看的内容。

这是产生此输出的单元测试:

WebClient webClient = new WebClient();
webClient.setThrowExceptionOnScriptError(false);

webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.waitForBackgroundJavaScript(30000);
HtmlPage page = webClient.getPage("http://www.ozdroid.com/#!BLOG/2010/10/12/How_to_Make_Google_AppEngine_Applications_Ajax_Crawlable");

System.out.println(page.asXml());
webClient.closeAllWindows();

有没有人知道我可以做些什么来解决这个问题并获取网站的完整 Html?

编辑

这是 page.asXml() 返回的更新代码,显然不完整:

<?xml version="1.0" encoding="ISO-8859-1"?>
<html xmlns:fb="http://www.facebook.com/2008/fbml>
&lt;head>
&lt;meta http-equiv=" content-type="">
  <head>
    <meta name="google-site-verification" content="_KCG8ec0LvgmXjnBAikAog0knc7jAbIGCu8Cmu2hsCI"/>
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
    <link rel="shortcut icon" href="favicon.ico"/>
    <link rel="icon" type="image/gif" href="favicon.gif"/>
    <title>
      OzDroid - Enterprise Solutions for Android | Laser Barcode
scanners | RFID | Handheld Computers | Rugged PDA's and Mobile Phones
    </title>
    <script type="text/javascript">
//<![CDATA[
var _gaq = _gaq || [];
//]]>
    </script>
    <script type="text/javascript" language="javascript" src="ozdroid/ozdroid.nocache.js">
    </script>
    <script defer="defer">
//<![CDATA[
ozdroid.onInjectionDone('ozdroid')
//]]>
    </script>
    <script src="http://www.google-analytics.com/ga.js" type="text/javascript">
    </script>
  </head>
  <body>
    <!-- OPTIONAL: include this if you want history support -->    <iframe src="javascript:''" id="__gwt_historyFrame" style="position: absolute; width: 0; height: 0; border: 0">
    </iframe>
    <noscript>

&lt;div
    style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif"&gt;
&lt;p&gt;Welcome, to the website of OzDroid, we sell and distribute rugged Android
 handheld computers, pda's and mobile phones. These devices can be equipped 
 with options including 1D and 2D laser barcode scanners, RFID, wifi,
  bluetooth and cameras.&lt;/p&gt;
 &lt;p&gt; In the near future, we also
 will be supplying logistics software for the same.
&lt;/p&gt;
&lt;p&gt;As this site contains dynamic content that relies on javascript,
 &lt;b&gt;your web browser must have JavaScript enabled&lt;/b&gt; in order for this site to
display correctly.
&lt;/p&gt;&lt;/div&gt;

    </noscript>
    <div id="fb-root">
    </div>
    <!-- Production -->    <script src="http://connect.facebook.net/en_GB/all.js">
    </script>
  </body>
</html>

谢谢

【问题讨论】:

  • GWT 应用程序是丰富的 Javascript 应用程序,而不仅仅是静态网页。 HTML 标记不会包含您在浏览器中加载页面时看到的所有内容的源 - 其中大部分是由 javascript 加载的。
  • 可能是htmlunit的bug,你为什么不去那里问?
  • @NickJohnson 我正在使用 HtmlUnit 来查看完全渲染的页面。

标签: ajax gwt seo htmlunit


【解决方案1】:

Cuga 您要获取的网站是我的,当我学习一些 GWT 的东西并想让网站可抓取时,这基本上有点矫枉过正。这个想法是制作一个简单的博客,以便我可以抓取动态内容。博客文章是使用 RPC 调用从 appengine 数据存储中获取的,因此这是一个有用的测试。

网站通过遵守 Google 的 Ajax 抓取标准并替换 #! 来提供完整的 HTML。使用 ?_escaped_fragment_= 。

下面的地址应该从 App Engine 获取页面

Link

在 appengine 服务器上生成 HTML 快照的所有工作都由 HTMLUnit 完成。所以它不太可能是 HTMLUnit 错误。

不幸的是,一些 facebook 类型的东西现在已经坏了 - 我怀疑是由于 API 更改 - 但老实说,我真的没有看到我有其他优先事项。

因为两年多没碰这个,我有点生疏了……

试试这个

放线...

webClient.waitForBackgroundJavaScript(30000);

获取页面后。我认为 waitForBackgroundJavaScript() 应该阻止你所在的线程,直到所有的 javascript 都运行。在获取页面之前调用它可能什么都不做。

【讨论】:

  • 嗨,brucko,感谢您的帮助。我从中提取的真实站点位于开发服务器上。我以您的 URL 为例,因为我正在关注您的教程,并在尝试将您的 URL 作为我们的开发站点时发现了相同的结果。我确实注意到,如果“等待时间”设置得足够长,您的网站会正常工作,但我们的开发网站不会。我认为最新的 GWT 或 GAE SDK 中可能存在错误,因为我们的网站也不会在 IE 中加载。无论如何,再次感谢您的教程和帮助。
【解决方案2】:

试试这个

HtmlPage page = null;
try {
    page = webClient.getPage(url);
} catch (Exception e) {
    System.out.println("Get page error");
}
JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager();
while (manager.getJobCount() > 0) {
    Thread.sleep(1000);
}
System.out.println(page.asXml());
return page;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多