Привет, я просто пытаюсь загрузить страницу с использованием кода примера на сайте 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)
Я не знаю решения, но теперь я немного знаю об этой проблеме.
Я создал тривиальное приложение "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 следующие банки:
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
(И мне пришлось вручную удалить файл License.txt из JUnit jar, иначе проект не будет построен.)
Затем я попытался запустить в симуляторе с помощью Android SDK 2.2 и 2.3, и в обоих случаях увидел то же исключение, о котором сообщает OP. (И увидел сообщение об исключении, отображаемое в симуляторе.)
Изменение версии браузера не влияет, и отключает Javascript. Запрошенный URL-адрес также не имеет значения, поскольку исключение создается при настройке WebClient.
Исключение происходит в строке 105 ClassConfiguration
:
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();
}
К сожалению, я не смог найти источник java.lang.Class
, который SDK предоставляет (I найденные источники для других частей SDK, но не JRE), но, пройдя по коду слепым, я мог видеть довольно немного активности внутри getMethod
, включая вызовы Class.checkPublicMemberAccess
, Class.getClassCache
и ClassCache.getAllPublicMethods
, последний из которых вызывает исключение.
Без источника JRE трудно понять, что не удается, но... Я подозреваю, что какая-то проблема несовместима с банкой. Возможно, банки HtmlUnit должны быть перекомпилированы с Android SDK?