Отслеживание с помощью Java Script, если запрос Ajax выполняется на веб-странице, или перехват XMLHttpRequest через веб-драйвер Selenium

Я использую 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.

19
задан Ishank 3 May 2013 в 15:45
поделиться