Спасибо за этот вопрос, это было так сложно. Так вот мое решение.
Это JS, чтобы сгладить прокрутку, пока вниз.
(async function() {
function sleep() {
return new Promise(resolve => setTimeout(resolve, 500))
};
var height;
do {
height = document.body.scrollHeight;
window.scrollTo({
"behavior": "smooth",
"left": 0,
"top": document.body.scrollHeight
});
await sleep()
} while (height != document.body.scrollHeight)})();
Я использовал асинхронную функцию, потому что chomedriver.executeScript () хочет, чтобы асинхронная функция использовала оператор 'await'.
String scrollWhileScrollsJS = "(async function(){function sleep(){return new Promise(resolve=>setTimeout(resolve,500))};var height;do{height=document.body.scrollHeight;window.scrollTo({\"behavior\":\"smooth\",\"left\":0,\"top\":document.body.scrollHeight});await sleep()}while(height!=document.body.scrollHeight)})();";
( (ChromeDriver) webDriver ).executeScript( scrollWhileScrollsJS );
И, конечно, нам нужно свободное ожидание. Для этого я обнаружил, что «scrollY» будет равно «document.body.scrollHeight-innerHeight» только тогда, когда мы находимся в нижней части страницы.
new FluentWait<>( webDriver ).withTimeout( Duration.ofSeconds( 10 ) )
.pollingEvery( Duration.ofMillis( 500 ) )
.until( result -> ( (ChromeDriver) webDriver ).executeScript( "return scrollY" ).equals( ( (ChromeDriver) webDriver ).executeScript( "return document.body.scrollHeight-innerHeight" ) ) );
В результате вы можете использовать этот код для прокрутки страницы, дождаться ее прокрутки до конца и получить элементы, не зная, сколько их должно быть.
PS: пожалуйста, не ... я имею в виду, действительно, НЕ используйте while (true) в ваших тестах автоматизации.