在android中使用时出现HTMLUNit错误

时间:2011-05-20 05:33:39

标签: android htmlunit

您好我只是尝试使用htmlunit网站上的示例代码加载页面:

final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage("http://www.google.com");

但是我总是在上面代码的第二行得到这个错误。我有lib包括在内。可能是什么问题。我搜索了差不多2天,但卡在同一部分。请帮忙。

05-20 10:58:11.322: ERROR/JavaScriptEngine(960): Exception while initializing JavaScript for the page
05-20 10:58:11.322: ERROR/JavaScriptEngine(960): java.lang.IllegalStateException: Method 'jsxGet_href' was not found for href property in com.gargoylesoftware.htmlunit.javascript.host.css.CSSImportRule
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.configuration.ClassConfiguration.addProperty(ClassConfiguration.java:109)
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.parsePropertyElement(JavaScriptConfiguration.java:402)
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.parseClassElement(JavaScriptConfiguration.java:349)
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.buildUsageMap(JavaScriptConfiguration.java:299)
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.<init>(JavaScriptConfiguration.java:149)
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.getInstance(JavaScriptConfiguration.java:239)
05-20 10:58:11.322: ERROR/JavaScriptEngine(960):     at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.init(JavaScriptEngine.java:179)

1 个答案:

答案 0 :(得分:1)

我不知道解决方案,但现在我对这个问题了解得更多。

我使用以下活动代码创建了一个简单的“hello world”应用程序:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView tv = new TextView(this);

    try
    {
        final WebClient webClient = new WebClient( BrowserVersion.FIREFOX_3 );
        webClient.setJavaScriptEnabled( false ) ;
        final HtmlPage page = webClient.getPage("http://www.google.com");

        tv.setText( page.asText().substring( 0, 50 ) );
    }
    catch( Throwable t )
    {
        tv.setText(t.getMessage());
    }

    setContentView(tv);

我在Eclipse项目中添加了以下jar:

apache-mime4j-0.6.jar
commons-codec-1.4.jar
commons-collections-3.2.1.jar
commons-io-1.4.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
cssparser-0.9.5.jar
htmlunit-2.8.jar
htmlunit-core-js-2.8.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
httpmime-4.0.1.jar
nekohtml-1.9.14.jar
sac-1.3.jar
serializer-2.7.1.jar
commons-configuration-1.6.jar
junit-4.5.jar

(我必须手动从JUnit jar中删除License.txt文件,否则项目将无法构建。)

然后我尝试使用Android SDK 2.2和2.3在模拟器中运行,并且在两种情况下都看到了OP报告的相同异常。 (并且看到了模拟器中显示的异常消息。)

更改浏览器版本无效,也无法关闭Javascript。请求的URL也无关紧要,因为在WebClient设置期间抛出了异常。

异常发生在ClassConfiguration的第105行:

info.setReadMethod(hostClass_.getMethod(GETTER_PREFIX + name, (Class []) null));

使用调试器对此进行跟踪,我看到hostClass_经历了许多值(包括com.gargoylesoftware.htmlunit.javascript.host.BoxObjectcom.gargoylesoftware.htmlunit.javascript.host.Attr),没有任何问题。只有当com.gargoylesoftware.htmlunit.javascript.host.css.CSSImportRule问题开始时才会出现问题。

奇怪的是,该方法存在:

public String jsxGet_href() {
    return getImportRule().getHref();
}

不幸的是,我找不到SDK提供的java.lang.Class来源(我found sources用于SDK的其他部分,而不是JRE),但是单步执行代码盲,I可以在getMethod内看到相当多的活动,包括对Class.checkPublicMemberAccessClass.getClassCacheClassCache.getAllPublicMethods的调用,其中最后一个会抛出异常。

如果没有JRE源,很难确切地知道什么是失败的,但是......我怀疑某种罐子不兼容问题。也许应该用Android SDK重新编译HtmlUnit jar?