Я играл с HTMLUnit ранее для подобных целей.
На самом деле вы можете найти всю необходимую информацию здесь .В HTMLUnit поддержка AJAX включена по умолчанию, поэтому, когда вы получаете в коде объект newPage
, вы можете генерировать события кликов на странице (найти определенный элемент и вызвать его функцию click()
).Самое сложное в том, что AJAX является асинхронным, поэтому вам нужно вызывать wait()
или sleep()
после выполнения виртуального клика, чтобы код Javascript на сайте мог обрабатывать действия.Это не лучший подход, поскольку использование сети делает sleep()
ненадежным.На странице вы можете найти что-то, что меняется, когда вы выполняете событие, вызывающее вызовы AJAX (например, изменяется заголовок заголовка), поэтому вы можете регулярно проверять, произошло ли это изменение на сайте или нет.(Я должен отметить, что в HTMLUnit встроен ресинхронизатор событий , однако мне не удалось заставить его работать так, как я ожидал.) Я использую Firebug или панель инструментов разработчика Chrome для изучения сайта.Вы можете проверить дерево DOM до и после вызовов AJAX, и таким образом вы будете знать, как ссылаться на определенные элементы управления (например, ссылки и выпадающие меню) на странице.
Я бы использовал XPath для получения определенных элементов тогданапримерВы можете сделать это (из примеров HTML-модуля):
//get div which has a 'name' attribute of 'John'
final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@name='John']").get(0);
YouTube фактически не использует AJAX для пересмотра своего результата.Если щелкнуть раскрывающееся меню «Сортировка» на странице результатов (это оформленный <button>
), появится абсолютное позиционированное <ul>
(имитирующее раскрывающуюся часть комбо), в котором есть элементы <li>
для каждого элемента меню.Элементы <li>
содержат специальный элемент <span>
с прикрепленным атрибутом href
.Когда вы нажимаете элемент <span>
, Javascript перемещает браузер к этому значению href
.
Например,в моем случае элемент сортировки по релевантности <span>
выглядит следующим образом:
<span href="/results?search_type=videos&search_query=test&suggested_categories=2%2C24%2C10%2C1%2C28" class=" yt-uix-button-menu-item" onclick=";window.location.href=this.getAttribute('href');return false;">Relevancia</span>
Вы можете получить список этих диапазонов относительно легко, поскольку хостинг <ul>
является единственным таким потомком <body>
.Хотя сначала нужно нажать на кнопку выпадающего меню, потому что он создаст элемент <ul>
со всеми описанными выше дочерними элементами с использованием Javascript.Вы можете получить сортировку по кнопке с этим XPath:
//div[@class='sort-by floatR']/button
Вы можете проверить свои запросы XPath, например.прямо в Chrome, если вы откроете инструменты разработчика и консоль разработчика Javascript с его панели инструментов.Тогда вы можете проверить это следующим образом:
> $x("//div[@class='sort-by floatR']/button")
[
<button type="button" class=" yt-uix-button yt-uix-button-text yt-uix-button-active" onclick=";return false;" role="button" aria-pressed="true" aria-expanded="true" aria-haspopup="true" aria-activedescendant data-button-listener="26">…</button>
]
Надеюсь, что это приведет вас в правильном направлении.