Я использую Selenium WebDriver для сканирования веб-сайта(только для примера, я буду сканировать и другие веб-сайты! )с бесконечной прокруткой.
Постановка задачи:
Прокрутите страницу с бесконечной прокруткой до тех пор, пока содержимое не перестанет загружаться с помощью веб-драйвера Selenium.
Мой подход: В настоящее время я делаю это-
Шаг 1 :Прокрутите страницу вниз
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.onload=toBottom();"+
"function toBottom(){" +
"window.scrollTo(0,Math.max(document.documentElement.scrollHeight," +
"document.body.scrollHeight,document.documentElement.clientHeight));" +
"}");
Затем я жду некоторое время, чтобы запрос Ajax завершился следующим образом-
Шаг 2 :Явное ожидание завершения запроса Ajax
Thread.sleep(1000);
Затем я даю другой java-скрипт, чтобы проверить, прокручивается ли страница
Шаг 3 :Проверьте, можно ли прокручивать страницу
//Alternative to document.height is to be used which is document.body.clientHeight
//refer to https://developer.mozilla.org/en-US/docs/DOM/document.height
if((Long)js.executeScript("return " +
"(document.body.clientHeight-(window.pageYOffset + window.innerHeight))")>0)
Если приведенное выше условие верно, то я повторяю с шага 1 -3 до тех пор, пока условие на шаге 3 не станет ложным.
Проблема:
Я не хочу давать Thread.sleep(1000);
на шаге 2, скорее я хотел бы проверить с помощью Java Script, закончился ли фоновый запрос Ajax, а затем прокрутить вниз, если условие на шаге 3 верно.
PS:Я не разработчик страницы, поэтому у меня нет доступа к коду, запускающему страницу, я могу просто внедрить java-скрипты (, как на шаге 1 и 3 )на веб-странице. И мне нужно написать общую логику для любого веб-сайта с Ajax-запросами во время бесконечной прокрутки.
Я буду благодарен тому, кто сможет уделить немного времени здесь!
РЕДАКТИРОВАТЬ:Хорошо, после борьбы в течение 2 дней,Я понял, что страницы, которые я просматриваю через Selenium WebDriver, могут иметь любую из этих библиотек JavaScript , и мне придется объединять их в соответствии с другой библиотекой, например, в случае использования веб-приложения. jQuery API, возможно, я жду
(Long)((JavascriptExecutor)driver).executeScript("return jQuery.active")
вернуть ноль.
Аналогичным образом, если веб-приложение использует библиотеку JavaScript Prototype , мне придется ждать
(Long)((JavascriptExecutor)driver).executeScript("return Ajax.activeRequestCount")
вернуть ноль.
Теперь , проблема заключается в том, как мне написать общий код, который мог бы работать с большинством доступных библиотек JavaScript?
Проблема, с которой я столкнулся при реализации этого-
1 . Как узнать, какая библиотека JavaScript используется в веб-приложении (с помощью Selenium WebDriver в Java ), чтобы затем написать соответствующие методы ожидания? В настоящее время я использую это
2 . Таким образом, мне придется написать до 77 методов для отдельной библиотеки JavaScript, поэтому мне нужен лучший способ справиться с этим сценарием.
Короче говоря, мне нужно выяснить, делает ли браузер какой-либо вызов (Ajax или простой )с какой-либо библиотекой JavaScript или без нее через реализацию Java Selenium Web Driver
PS :Существуют дополнения для Chorme Детектор JavaScript Lib и Firefox Детектор библиотеки JavaScript , которые обнаруживают используемую библиотеку JavaScript.