C помощью Selenium и facebook-php-webdriver я парсю один сайт. (в тегах я специально указал не только PHP так как возможно эту проблему решали те, кто пользовался selenium в связке и с другими языками)
На сайте есть окно, в котором список данных:
<ul>
<li class='myclass'>1</li>
<li class='myclass'>2</li>
<li class='myclass'>3</li>
</ul>
Чтобы получить все эти элементы и пройтись по ним в цикле, использую стандартный для такого случая код:
$elements=$driver->findElements(WebDriverBy::className('myclass')); // 3 элемента
foreach ($elements as $element) {
// обрабатываем
}
Все бы ничего, но в окне отображаются только часть li, новые элементы подгружаются после скролла окна вниз.
Прокручиваем скролл командой:
$driver->getKeyboard()->sendKeys(array(WebDriverKeys::PAGE_DOWN));
И заново собираем все элементы li, которых после прокрутки стало уже не 3, а 6. Сколько именно появится новых элементов закономерности нет.
$elements=$driver->findElements(WebDriverBy::className('myclass')); // уже 6 элементов, 3 старых + 3 новых.
foreach ($elements as $element) {
// обрабатываем
}
Можно ли как-то получать в $elements только новые значения, которые подгрузились после прокрутки ?
В целом с этим можно было бы жить, но прокрутить скролл нужно далеко не один раз, и элементов в объекте $elements может собраться несколько десятков, а то и сотен тысяч. В конечном итоге они все просто не влезут.
Либо возможно кто-то знает альтернативный вариант обработать все элементы с определенным классом не используя findElements ?
Возможно тут какое-то элементарное решение, но голова уже не варит.
Интересует мнение людей которые сталкивались с такой проблемой. Просто поумничать ищите другой вопрос.