Ошибка HTMLUNit при использовании в Android

1

Привет, я просто пытаюсь загрузить страницу с использованием кода примера на сайте 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
    Просто чтобы уточнить, вы запускаете этот код под Android? Какая версия API? Какая версия HtmlUnit?
Теги:
htmlunit

1 ответ

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 следующие банки:

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?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню