2010-12-22 60 views
4

我有一个GWT应用程序,我尝试索引。HtmlUnit&GWT错误

我使用的HtmlUnit来获取生成的HTML内容:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6); 
HtmlPage refDesing = webClient.getPage("http://localhost:8080/MyGWTApp/#page2"); 
FileOutputStream fos1 = new FileOutputStream("D:\\work\\out\\page2.html"); 
fos1.write(refDesing.asXml().getBytes()); 
fos1.close(); 

但我得到以下错误,返回的页面大约空!

Dec 22, 2010 6:16:25 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify 
WARNING: Expected content type of 'application/javascript' or 'application/ecmascript' for remotely loaded JavaScript element at 'http://xxxxxxxxxxxx/xxxxxxxx/xxxxxxxx/xxxxxxxxxx.nocache.js', but got 'application/x-javascript'. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [485:24] Error in expression. Invalid token "=". Was expecting one of: <S>, <COMMA>, "/", <PLUS>, "-", <HASH>, <STRING>, ")", <URI>, "inherit", <EMS>, <EXS>, <LENGTH_PX>, <LENGTH_CM>, <LENGTH_MM>, <LENGTH_IN>, <LENGTH_PT>, <LENGTH_PC>, <ANGLE_DEG>, <ANGLE_RAD>, <ANGLE_GRAD>, <TIME_MS>, <TIME_S>, <FREQ_HZ>, <FREQ_KHZ>, <DIMENSION>, <PERCENTAGE>, <NUMBER>, <FUNCTION>, <IDENT>. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [485:29] Error in style rule. Invalid token "\n". Was expecting one of: "}", ";". 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning 
WARNING: CSS warning: null [485:29] Ignoring the following declarations in this rule. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [518:24] Error in expression. Invalid token "=". Was expecting one of: <S>, <COMMA>, "/", <PLUS>, "-", <HASH>, <STRING>, ")", <URI>, "inherit", <EMS>, <EXS>, <LENGTH_PX>, <LENGTH_CM>, <LENGTH_MM>, <LENGTH_IN>, <LENGTH_PT>, <LENGTH_PC>, <ANGLE_DEG>, <ANGLE_RAD>, <ANGLE_GRAD>, <TIME_MS>, <TIME_S>, <FREQ_HZ>, <FREQ_KHZ>, <DIMENSION>, <PERCENTAGE>, <NUMBER>, <FUNCTION>, <IDENT>. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [518:29] Error in style rule. Invalid token "\n ". Was expecting one of: "}", ";". 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning 
WARNING: CSS warning: null [518:29] Ignoring the following declarations in this rule. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [541:24] Error in expression. Invalid token "=". Was expecting one of: <S>, <COMMA>, "/", <PLUS>, "-", <HASH>, <STRING>, ")", <URI>, "inherit", <EMS>, <EXS>, <LENGTH_PX>, <LENGTH_CM>, <LENGTH_MM>, <LENGTH_IN>, <LENGTH_PT>, <LENGTH_PC>, <ANGLE_DEG>, <ANGLE_RAD>, <ANGLE_GRAD>, <TIME_MS>, <TIME_S>, <FREQ_HZ>, <FREQ_KHZ>, <DIMENSION>, <PERCENTAGE>, <NUMBER>, <FUNCTION>, <IDENT>. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [541:29] Error in style rule. Invalid token "\n ". Was expecting one of: "}", ";". 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning 
WARNING: CSS warning: null [541:29] Ignoring the following declarations in this rule. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [951:24] Error in expression. Invalid token "=". Was expecting one of: <S>, <COMMA>, "/", <PLUS>, "-", <HASH>, <STRING>, ")", <URI>, "inherit", <EMS>, <EXS>, <LENGTH_PX>, <LENGTH_CM>, <LENGTH_MM>, <LENGTH_IN>, <LENGTH_PT>, <LENGTH_PC>, <ANGLE_DEG>, <ANGLE_RAD>, <ANGLE_GRAD>, <TIME_MS>, <TIME_S>, <FREQ_HZ>, <FREQ_KHZ>, <DIMENSION>, <PERCENTAGE>, <NUMBER>, <FUNCTION>, <IDENT>. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [951:29] Error in style rule. Invalid token "\n". Was expecting one of: "}", ";". 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning 
WARNING: CSS warning: null [951:29] Ignoring the following declarations in this rule. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [977:24] Error in expression. Invalid token "=". Was expecting one of: <S>, <COMMA>, "/", <PLUS>, "-", <HASH>, <STRING>, ")", <URI>, "inherit", <EMS>, <EXS>, <LENGTH_PX>, <LENGTH_CM>, <LENGTH_MM>, <LENGTH_IN>, <LENGTH_PT>, <LENGTH_PC>, <ANGLE_DEG>, <ANGLE_RAD>, <ANGLE_GRAD>, <TIME_MS>, <TIME_S>, <FREQ_HZ>, <FREQ_KHZ>, <DIMENSION>, <PERCENTAGE>, <NUMBER>, <FUNCTION>, <IDENT>. 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: null [977:29] Error in style rule. Invalid token "\n". Was expecting one of: "}", ";". 
Dec 22, 2010 6:16:27 PM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning 
WARNING: CSS warning: null [977:29] Ignoring the following declarations in this rule. 

编辑:

我的意思大致为空时,这里是返回的HTML的快照:

请注意,不是显示在原始页面的所有数据(原始来自DB)由HtmlUnit返回。还有什么“?”手段?我不认为这意味着任何编码错误导致所有字都是清晰的ASCII字符。

<td align="center" style="vertical-align: top;"> 
    <table class="refDesignGrid" cellspacing="5"> 
     <colgroup> 
     <col/> 
     </colgroup> 
     <tbody align="left"> 
     <tr> 
      <td align="left" style="vertical-align: top;"> 
      <table cellpadding="0" class="categoryItem" cellspacing="0"> 
       <tbody align="left"> 
       <tr> 
        <td align="left" style="vertical-align: top;"> 
        <div class="header4"> 
         C++ 
        </div> 
        </td> 
       </tr> 
       </tbody> 
      </table> 
      </td> 
      <td align="left" style="vertical-align: top;"> 
      <table cellpadding="0" class="categoryItem" cellspacing="0"> 
       <tbody align="left"> 
       <tr> 
        <td align="left" style="vertical-align: top;"> 
        <div class="header4"> 
         Java 
        </div> 
        </td> 
       </tr> 
       </tbody> 
      </table> 
      </td> 
      <td align="left"> 
      <table cellpadding="0" class="categoryItem" cellspacing="0"> 
       <tbody align="left"> 
       <tr> 
        <td align="left" style="vertical-align: top;"> 
        <div class="header4"> 
         C# 
        </div> 
        </td> 
       </tr> 
       </tbody> 
      </table> 
      </td> 
      <td> 
      ? 
      </td> 
     </tr> 
     <tr> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
     </tr> 
     <tr> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
     </tr> 
     <tr> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
     </tr> 
     <tr> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
      <td> 
      ? 
      </td> 
     </tr> 
     </tbody> 
    </table> 
    </td> 
</tr> 
</tbody> 
</table> 
</div> 

回答

1

答案就在这里: http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork

使用的HtmlUnit可完成执行主线程之前 让后台线程运行。您有几个选项:

webClient.setAjaxController(new NicelyResynchronizingAjaxController());会告诉您的WebClient 实例重新同步异步XHR。 webClient.waitForBackgroundJavaScript(10000);或 webClient.waitForBackgroundJavaScriptStartingBefore(10000);在 之后获取页面并在操作之前。显式等待您的JavaScript运行时预期满足的 条件,例如 当注册到WebClient的实例

//try 20 times to wait .5 second each for filling the page. 
for (int i = 0; i < 20; i++) { 
    if (condition_to_happen_after_js_execution) { 
     break; 
    } 
    synchronized (page) { 
     page.wait(500); 
    } 
} 
+0

虽然这可能在理论上回答这个问题,[这将是更可取的](http://meta.stackexchange.com/q/8259)在此包含答案的基本部分,提供链接供参考。 – 2011-10-27 14:56:02

2

HtmlUnit可能有点琐碎,特别是可以让事情看起来更糟糕。

创建这两个类:

import org.w3c.css.sac.CSSException; 
import org.w3c.css.sac.CSSParseException; 
import com.gargoylesoftware.htmlunit.DefaultCssErrorHandler; 

/* 
* get rid of warnings... and provide a place to hang a break point 
*/ 
public class QuietCssErrorHandler 
    extends DefaultCssErrorHandler 
{ 

    @Override public void error(CSSParseException e) throws CSSException 
    { 
     super.error(e) ; 
    } 

    @Override public void fatalError(CSSParseException e) throws CSSException 
    { 
     super.fatalError(e) ; 
    } 

    @Override public void warning(CSSParseException e) throws CSSException 
    { 
    } 
} 

import com.gargoylesoftware.htmlunit.IncorrectnessListener; 

public class SilentIncorrectnessListener 
    implements IncorrectnessListener 
{ 
    @Override public void notify(String message, Object origin) 
    { 
     // do nuttin' honey! 
    } 
} 

那么当您创建Web客户端...

wc.setIncorrectnessListener(new SilentIncorrectnessListener()) ; 
wc.setCssErrorHandler(new QuietCssErrorHandler()) ; 

然后你应该得到更少的警告。

至于“大约为空”......这是什么意思?

+0

这些处理程序告诉我同样的错误。请参阅我的关于“大约为空”的编辑 – 2010-12-23 07:24:19