Как вебдрайвером отлавливать реквесты с сайта

Добрый день, может кто-то сталкивался с подобным тестированием и может помочь

Задача: Нужно отлавливать реквесты, которые уходят с сайта при выполнении любых действий (клик на ссылку, переход по линке, заполнение формы и т.д.). В параметрах этих реквестов хранится множество аналитической информации, которую нужно проверять.
Подскажите, как с помощью вебдрайвера можно получить реквесты, которые уходят с сайта? Возможно есть какие то другие утилиты? Может можно подключить фидлер, который будет ловить эти запросы? Но тесты должны оставаться параллельными

image

Сам не пробовал, но тут есть информация.

2 Likes

У меня было много подобных тестов.
Есть 2 спсооба:

  1. Более лёгкий, но работает только с хромом: http://chromedriver.chromium.org/logging/performance-log
  2. Использовать прокси. Я знаю две тулы: GitHub - lightbody/browsermob-proxy: A free utility to help web developers watch and manipulate network traffic from their AJAX applications. и Using FiddlerCore to capture HTTP Requests with .NET - Rick Strahl's Web Log
    Работал с обеими, по мне первый предпочтительней.
1 Like

Спасибо за советы, буду пробовать

Вариант первый, как пишут выше - использовать прокси
Вариант второй, более интересный, перехватывать запросы на уровне JavaScript
Я так делаю в своем проекте. Не могу привести пример, потому что меня интересовал только запрос и дополнительные данные которые туда подставляют(application insight javascript)
Вам необходимо перехватывать последнюю стадию запроса - сам респонс(их там около 4, могу ошибаться)
По запросу: intercept ajax requests javascript, выдает сотни ответов

Перехватчик ставлю на уровне Selenium Execute JavaScript, результат пишу в лог файл

1 Like

Спасибо за совет, звучит очень интересно. Но я не совсем разобрался как это работает.
Пробовал руками посмотреть на возвращаемый результат. Для этого использовал функцию JS

(function(send) {
    XMLHttpRequest.prototype.send = function(body) {
        var info="send data\r\n"+body;
        alert(info);
        send.call(this, body);
    };
})(XMLHttpRequest.prototype.send);

Но body в данном случае равен null. И возможно ли как то фильтровать запросы? Например не все запросы выводить, а которые содержат “/analytics/”

так выглядит скрипт для перехвата request:

window.ajaxInterceptor = function addXMLRequestCallback(callback) {
                    var oldSend, i;
                    if( XMLHttpRequest.callbacks ) 
                    {
                        XMLHttpRequest.callbacks.push(callback);
                    } 
                    else
                    {
                        XMLHttpRequest.callbacks = [callback];
                        oldSend = XMLHttpRequest.prototype.send;
                        XMLHttpRequest.prototype.send = function(){
                            for( i = 0; i < XMLHttpRequest.callbacks.length; i++ ) 
                            {
                                XMLHttpRequest.callbacks[i](this);
                            }
                        oldSend.apply(this, arguments);
                        }
                    }
                };
                window.ajaxInterceptor(function(xhr) {
                   if (xhr.ajaxData)
                   {
                       window.logs += '\n' + (xhr.ajaxData.id + ' | ' + xhr.ajaxData.requestUrl);
                       console.dir(xhr.ajaxData.id + ' | ' + xhr.ajaxData.requestUrl);
                   }
                });

и то меня только интересуют id, url: xhr.ajaxData.id, xhr.ajaxData.requestUrl

для перехвата респонса, надо этот скрипт дописать, но сейчас есть задания с более высоким приоритетом

1 Like

Что делать, если иногда улетают GET запросы, а иногда POST?
И как быть, если нужно словить запросы на загрузку страницы или переход на другую страницу? Когда подсовывать этот js?

Тоже пытался на уровне браузера перехватывать. Когда понял, что на этапе загрузки страницы не перехватить, кончилось все установкой митм прокси между браузером и реальным сервером. А уж с прокси можно было делать все что угодно.

1 Like

Get или Post это без разницы
А вот во время загрузки страницы или редиректе на другую табу(загрузка новой страницы) этот способ не подходит.
Извините, в моем случае это неважно, поэтому не написал