Я использую 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 script, чтобы проверить, прокручивается ли страница
Шаг 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.