В настоящее время я изучаю HtmlUnit для очистки веб-сайтов. Все шло хорошо и гладко, пока я не столкнулся с динамической страницей (например, я использую сайт Pinterest), на которой элементы добавляются на лету, когда пользователь прокручивает страницу вниз.
Я пробовал несколько способов, которые должны вызывать прокрутку в реальном браузере (я покажу их ниже). Прежде чем идти дальше, я хотел бы упомянуть, что у меня уже установлена следующая конфигурация:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
Допустим, я хочу, чтобы все мои подписчики были в Pinterest. Я перехожу на эту страницу, и теперь, когда у вас в первый раз только 24 из них, я хочу прокрутить вниз, событие, которое запускает вызов Ajax на сервер и получает следующий набор подписчиков.
1) Простой код JavaScript или jQuery для запуска прокрутки в окне.
ScriptResult sr = followersPage.executeJavaScript("window.scrollBy(0,1000)");
// One version in jQuery
// ScriptResult sr = followersPage.executeJavaScript("$(window).scrollTop(0,1000);");
// also tried with the body, html, with animation
// ScriptResult sr = followersPage.executeJavaScript("$("html, body").animate({ scrollTop: $(document).height() }, 1000);");
webclient.waitForBackgroundJavaScript(10000);
followersPage = (HtmlPage)sr.getNewPage();
=> Когда я проверяю расстояние до вершины, оно равно 0, и страница результатов совпадает с исходной страницей. Во время отладки в Eclipse, когда я перехожу через строку, где выполняется javascript, он напрямую переходит на следующую строку без каких-либо задержек. Если я напишу любой другой javascript, например, например:
ScriptResult sr = followersPage.executeJavaScript("$(div.GridItems).html('new content')");
, вы можете заметить, что отладчик зависает на этой строке на полсекунды, что означает, что javascript выполняется.
2) Измените фокус с одной привязки подписчика на другую (я выбрал привязку, потому что она используется в порядке фокусировки при нажатии клавиши TAB):
HtmlDivision gridItems = followersPage.getFirstByXPath("//div[contains(concat(' ',@class,' '),' GridItems ')]");
List<HtmlDivision> els = (List<HtmlDivision>) gridItems.getByXPath("//div[@class='item ']");
List<HtmlDivision> items = (List<HtmlDivision>) gridItems.getByXPath("//div[@class='item ']");
for (HtmlDivision item : items) {
HtmlAnchor a = item.getFirstByXPath("//a[@class='userWrapper']");
a.focus();
webClient.waitForBackgroundJavaScript(1000);
}
followersPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
Опять же, прокрутка не произошла , Страница результатов остается такой же, как и в оригинале
3) Создайте кнопку, которая запускает событие прокрутки в окнах:
HtmlButton scrollButton = (HtmlButton) followersPage.createElement("button");
scrollButton.setAttribute("type", "button");
scrollButton.setAttribute("onclick", "window.scrollTo(0,document.body.scrollHeight);");
gridItems.appendChild(scrollButton);
followersPage = scrollButton.click();
К сожалению, это не сработало.
Я пробовал много других методов, но до сих пор не получил положительного результата.
Я прочитал много связанных статей, также здесь, на stackoverflow, по этой теме. И кажется, что никому не удалось заставить работать прокрутку с помощью HtmlUnit, так как большинство вопросов остались без ответа. Вот почему мне интересно, была ли эта функция когда-либо функциональной.
Кому-то удалось прокрутить страницу (простая страница, без ajax)? Кому-то удалось прокрутить страницу, событие, которое вызвало какой-то вызов ajax?