您好我只是尝试使用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)
答案 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.BoxObject
和com.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.checkPublicMemberAccess
,Class.getClassCache
和ClassCache.getAllPublicMethods
的调用,其中最后一个会抛出异常。
如果没有JRE源,很难确切地知道什么是失败的,但是......我怀疑某种罐子不兼容问题。也许应该用Android SDK重新编译HtmlUnit jar?