Ошибка HTMLUNit при использовании в Android - PullRequest
1 голос
/ 20 мая 2011

Привет. Я просто пытаюсь загрузить страницу, используя пример кода на сайте htmlunit:

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

Но я всегда получаю эту ошибку во второй строке приведенного выше кода.У меня есть библиотека.В чем может быть проблема.Я искал почти 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 Ответ

1 голос
/ 20 мая 2011

Я не знаю решения, но теперь я знаю немного больше о проблеме.

Я создал тривиальное приложение «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);

Я добавил следующие jar-файлы в проект 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 (я нашел источники для других частей SDK, но не JRE), но прошел через слепой код, Я мог видеть немного активности внутри getMethod, включая вызовы Class.checkPublicMemberAccess, Class.getClassCache и ClassCache.getAllPublicMethods, последний из которых вызывает исключение.

Без источника JRE трудно понять, что именно не работает, но ... Я подозреваю, что какая-то проблема с банкой несовместима. Возможно, файлы JtmlUnit следует перекомпилировать с помощью Android SDK?

...