HtmlUnit сделать снимок Ajax-приложений

1

Я создаю базовое приложение AJAX GWT (Google Web Toolkit), и теперь я пытаюсь создать моментальные снимки для сканеров, читающих эту страницу.

Я создаю Servlet для ответа на сканеры, используя HtmlUnit.

Мое приложение отлично работает, когда я нахожусь в браузере. Но когда в HtmlUnit, он бросает много ошибок об особых символах, которые у меня есть в HTML. Но эти символы довольны, и я не хотел бы заменять его специальными кодами, когда он в настоящее время работает, только из-за HtmlUnit. (по крайней мере, я должен проверить, если я правильно использую HtmlUnit)

Изображение 174551

Я думаю, что HtmlUnit должен прочитать информацию о кодировке страницы и отобразить ее в качестве браузера, как только это станет целью проекта, который я думаю.

Я не нашел хорошей информации об этой проблеме. Это ограничение HtmlUnit? Нужно ли мне изменять весь контент моего сайта, чтобы использовать эту библиотеку java для создания моментальных снимков?

Вот мой код:

if ((queryString != null) && (queryString.contains("_escaped_fragment_"))) {
            // ok its the crawler
            // rewrite the URL back to the original #! version
            // remember to unescape any %XX characters

            url = URLDecoder.decode(url, "UTF-8");

            String ajaxURL = url.replace("?_escaped_fragment_=", "#!");


            final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);


            HtmlPage page = webClient.getPage(ajaxURL);

            // important!  Give the headless browser enough time to execute JavaScript
            // The exact time to wait may depend on your application.
            webClient.waitForBackgroundJavaScript(3000);

            // return the snapshot
            response.getWriter().write(page.asXml());
  • 0
    Вы установили кодировку на своей странице хоста?
  • 0
    Да точно. UTF8. HtmlUnit хорошо работает, если я удаляю специальные символы, такие как 'ç'.
Показать ещё 4 комментария
Теги:
gwt
htmlunit
googlebot
google-crawlers

1 ответ

0
Лучший ответ

Проблема заключалась в объединении XML с HTML. Комментарии @ColinAlworth помогли мне.

Я последовал примеру Google и не работал.

Для этого вам нужно удалить теги XML и позволить только HTML отвечать, меняя строку:

 // return the snapshot
 response.getWriter().write(page.asXml());

в

 response.getWriter().write(page.asXml().replaceFirst("<\\?.*>",""));

Теперь это рендеринг.

Но, хотя он отображается, CSS не работает, а DOM не обновляется (GWT обновляет заголовок страницы при открытии страницы). HTMLUnit бросил много ошибок в CSS, и я использую twitter bootstrap без каких-либо изменений. По-видимому, в проекте HtmlUnit есть много ошибок, хороших для небольших тестов, но не для синтаксического анализа сложных (или даже простых) HTML файлов.

  • 0
    Помните также, что HtmlUnit на самом деле не отображает содержимое видимым образом. Это подразумевает, что на самом деле ему не нужно знать обо всех современных CSS - хотя, конечно, это удобно, если он знает, так что вы можете проверить работоспособность своего приложения. Пока он возвращает правильный контент, я не буду беспокоиться об этом, не зная, как отобразить тот же контент. Если вы хотите создать резервную копию своего сервера с помощью настоящего браузера, загляните в PhantomJS - это встроенный двоичный файл, но это сборка без заголовка из хрома, которая даже позволяет делать снимки экрана.
  • 0
    @ColinAlworth, я получаю вывод asXml () и открываю в своем браузере, он полностью отличается от Chrome. В GWT вы устанавливаете заголовок страницы динамически, вызывая методы фреймворка, что приводит к JavaScript. HTMLUnit не возвращает обновленный DOM после выполнения этих методов ajax javascripts. Я не знаю, как люди работают на ajax-сайтах, чтобы сканеры хорошо выполняли свою работу.

Ещё вопросы

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