带有GWT的HtmlUnit返回不完整的页面

时间:2012-01-17 21:48:47

标签: ajax gwt seo htmlunit

我正在尝试使用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>

由于

2 个答案:

答案 0 :(得分:2)

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

完整的HTML由网站提供服务,遵守Googles Ajax爬行标准并替换#!与?_escaped_fragment_ =。

以下地址应从App Engine

获取页面

Link

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

不幸的是,一些facebook类型的东西现在已被破坏 - 我怀疑是由于API的变化 - 但说实话,我真的没有看到我有其他优先事项。

我已经两年多没碰过这个了,我有点生气......

尝试

放线......

webClient.waitForBackgroundJavaScript(30000);
获取页面后

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

答案 1 :(得分:0)

试试这个

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;