Один из методов в моих приложениях - использовать трюк внедрения Javascript, описанный в этой теме , для захвата всего HTML веб-страницы после рендеринга:
// This call inject JavaScript into the page which just finished rendering.
browser.loadUrl(
"javascript:window.HTMLOUT.processHTML(
document.getElementsByTagName('html')[0].innerHTML);");
Это работает - даже для очень богатых веб-страниц - но когда он пытается обрабатывать аналогичным образом страницы, которые не содержат any Javascript в них, он генерирует следующую ошибку:
ERROR/Web Console(1335): Uncaught TypeError:
Cannot call method 'processHTML' of undefined at :1
В своем поиске возможной основной причины или объяснения я обнаружил довольно много сообщений, описывающих Uncaught TypeError: Cannot call method *** of undefined at :1
с двумя типичными ответами:
- Использование webView.getSettings ().setDomStorageEnabled (true);
- "Обычно, когда ошибка имеет форму Невозможно вызвать метод 'X' из неопределенного, это означает, что любой объект, который вы пытаетесь вызвать X из не существует. "
Ну, причина проблемы в моем случае не может быть # 1 (setDomStorageEnabled), потому что я уже правильно установил это в своем коде!
Так что единственное другое возможнообъяснение состоит в том, что объект, из которого я пытаюсь вызвать processHTML()
, не выходит.Этот объект называется HTMLOUT
и он создается в onCreate () действия после создания объекта WebView и инициализации его с помощью setWebViewClient()
:
webView.addJavascriptInterface(new JavascriptInterface(this, webView), "HTMLOUT");
. Это заставляет меня подозревать, что создание экземпляра объекта JavascriptInterfaceпо какой-то причине терпит неудачу.
Здесь мое понимание останавливается и начинаются мои вопросы:
- Имеет ли смысл то, что я описывал до сих пор?
- Если такпочему сбой создания экземпляра объекта JavascriptInterface?
- Возможно ли, что причиной сбоя является отсутствие какого-либо Javascript в исходном HTML?
- Что можно сделать, чтобы обойти эту проблемуэто проблема?