Прокрутка страницы с загрузкой содержимого AJAX Selenium Webdriver

Я использую Selenium Webdriver для получения содержимого веб-страницы. Страница загружает больше контента, когда пользователь прокручивает страницу вниз с помощью AJAX. Я могу прокручивать вниз с помощью javascript, но не знаю, когда остановить прокрутку. Как я узнаю, что больше не могу прокручивать вниз? Я не могу использовать document.clientheight или любое из свойств высоты, потому что они имеют дело с прокруткой, когда окно слишком маленькое, но все элементы привязаны к DOM, и поэтому их высота известна. Здесь элементы динамически прикрепляются к DOM, поэтому высота заранее неизвестна.

Как я узнаю, что достиг дна? Есть ли где-нибудь условие «полоса прокрутки не прокручивается»? Или это также сработает, если загружается больше контента, а полоса прокрутки еще недоступна для прокрутки, но скоро будет?

Спасибо, бсг

Обновлять

Ответ, который сработал для меня, на самом деле был дан на другой мой вопрос (этот вопрос был более точным подмножеством того). А именно, используйте jquery для проверки следующей эквивалентности: $(document).height() == ($(window).height() + $(window).scrollTop();. Если он оценивается как true, вы достигли внизу страницы. (Объяснение того, почему это работает, см. в Значение $(window).scrollTop() == $(document).height() - $(window).height()) Я не уверен, что это будет работать без jquery, поэтому, если страница вы тестируете, у вас нет jquery, вам, вероятно, следует использовать ответ пользователя 1177636 ниже.

Точный код, который я использовал, был:

JavascriptExecutor js = (JavascriptExecutor)driver;
do{

  //scroll down and do whatever processing you need

  reachedbottom = Boolean.parseBoolean(js.executeScript("return $(document).height() == ($(window).height() + $(window).scrollTop());").toString());

  }while(!reachedbottom);

Надеюсь, это поможет кому-то.


person bsg    schedule 12.07.2013    source источник
comment
Что вы будете делать дальше, как только он достигнет дна? Если это выполнимо, прекратите прокрутку. Вас устроит такая логика?   -  person Yi Zeng    schedule 13.07.2013
comment
Я бы хотел, чтобы это произошло. Я прокручиваю, чтобы получить все элементы на странице, и когда я спускаюсь вниз, я хочу выполнить некоторую обработку элементов, которые я получил. Поскольку у них нет уникальных идентификаторов или имен, я не могу дождаться появления какого-либо конкретного, чтобы узнать, достиг ли я дна.   -  person bsg    schedule 14.07.2013
comment
Как насчет проверки readyState=complete?   -  person Yi Zeng    schedule 14.07.2013
comment
Я пытаюсь написать код, чтобы попробовать ваше предложение, но, к сожалению, я не очень хорошо знаком с JS. Можете ли вы точно указать, для какого объекта readyState является свойством? Судя по поиску, их больше одного. И поместил бы я это в ожидание WebDriver? Как заставить его ждать выполнения JS (если это так)?   -  person bsg    schedule 15.07.2013


Ответы (2)


Поскольку OP хочет, чтобы я ответил здесь, я попытаюсь что-нибудь записать, но, возможно, это неправильный ответ на этот вопрос.

Во-первых, мне нужно знать, поддерживает ли ваш сайт бесконечную прокрутку, например Flickr Explore.

Если она бесконечна, то я сомневаюсь, что можно определить, когда она закончится. Вы можете только проверить, существует ли один конкретный элемент (это не ваш случай, верно?).

Однако, если ваш сайт в какой-то момент закончится, вы можете продолжить прокрутку, если readyState!=complete

Поскольку вы не сказали, какой язык вы используете, я проиллюстрирую на С#.

bool readyStateComplete = false;
while (!readyStateComplete) {
    IJavaScriptExecutor executor = driver as IJavaScriptExecutor;
    executor.ExecuteScript("window.scrollTo(0, document.body.offsetHeight)");
    readyStateComplete = (string)executor.ExecuteScript("return document.readyState") == "complete";
}
person Yi Zeng    schedule 15.07.2013
comment
Спасибо за пример. На самом деле я использую Java, но должен уметь переводить. К счастью, мой сайт не имеет бесконечной прокрутки, так что это должно работать. Проблема, которая у меня все еще есть, заключается в том, что если я прокручиваю слишком быстро, содержимое загружается недостаточно быстро, и я получаю StaleElementExceptions. (По крайней мере, это то, что я предполагаю, является причиной ошибки, поскольку она не возникает, когда я прохожу по каждой строке.) Есть ли способ дождаться завершения readyState? Будет ли это работать? Должен ли я начать новый вопрос об этой конкретной проблеме? - person bsg; 15.07.2013
comment
Куда брошен StaleElementException? Я не думаю, что JavaScriptExecutor это волнует, пока не задействованы элементы. - person Yi Zeng; 15.07.2013
comment
Мой первоначальный ответ ждал завершения readyState, а затем понял, что это не сработает. Поскольку он будет завершен, даже если он не внизу, вы прокручиваете еще раз, страница загружается, затем readyState=complete, затем вы все равно можете снова прокрутить вниз. - person Yi Zeng; 15.07.2013
comment
Извините - я не ясно. У меня было несколько вопросов, которые я поместил в один вопрос, а затем я поместил этот в отдельный вопрос. Вы уже ответили на этот вопрос, но я надеялся, что ваш первоначальный ответ поможет мне решить другую проблему, с которой я столкнулся. (А именно, что мой контент загружается недостаточно быстро, поэтому попытка доступа к нему до завершения загрузки вызывает ошибки. Мне нужен какой-то способ дождаться завершения загрузки.) - person bsg; 15.07.2013
comment
Я собираюсь принять ваш ответ, потому что он должен работать, но на самом деле я использовал ответ, который я получил, на другой вопрос, который я добавлю сюда. Спасибо! - person bsg; 15.07.2013

У меня такая же проблема. Я только что выполнил $('.footer').scrollIntoView() js для прокрутки вниз.

person Pavel Zorin    schedule 14.07.2013
comment
Спасибо за ваш ответ, но это не сработает для меня, потому что мне нужно прокручивать один экран за раз и извлекать некоторые элементы со страницы. На самом деле я получил ответ на этот вопрос по другому моему вопросу (который включал этот вопрос, но был более общим), но я пока не собираюсь закрывать этот вопрос, потому что хотел бы посмотреть, ответит ли пользователь 1177636 на мой вопрос в комментарий выше. - person bsg; 15.07.2013
comment
самый надежный способ - вызвать функцию javascript на вашей странице с элементами прикрепления при прокрутке вниз. - person Pavel Zorin; 15.07.2013