GetTraffic работает не корректно

Gratsh

Client
Регистрация
09.03.2018
Сообщения
35
Благодарностей
14
Баллы
8
Салют.

Есть нетривиальная задача: перейти на страницу, дождаться ее полной загрузки, выполнить заполнение полей формы и нажать на кнопку входа, после этого подождать полной загрузки страницы и при помощи GetTraffic извлечь запрос на форму и получить ответ.

Сделал такой проект, все работает кроме корректного извлечения трафика.

Перед переходом на страницу выполняю : instance.UseTrafficMonitoring = true;
Далее после того как запрос на форму прошел выполняю такой код:


Сохраняю трафик в переменную проекта, для того что бы обращаться к нему не один раз:
project.Context["traff"] = instance.ActiveTab.GetTraffic();
Ищу нужный запрос по маске, записываю его ответ в переменную проекта, а так же вывожу все ссылки запросов в лог для отладки:
var traffic = project.Context["traff"];
foreach(TrafficItem t in traffic)
{
    project.SendInfoToLog(t.Url);
    if (t.Url.Contains("/rest") && t.Method=="POST")
    {
        try
        {
            project.Variables["responce"].Value = System.Text.Encoding.UTF8.GetString(t.ResponseBody);
        }
        catch
        {
            continue;
        }
    }
}
В 100% случаях не работает если в PM нажать на кнопку выполнить с начала, после если произвести те же самые действия руками на странице (или по шагам после того как проект 1 раз выполнился полностью) в 50% случаев работает правильно (в лог выводит ссылки, в переменную записывает нужный ответ).

Что я имею ввиду под словами "не работает": в таблице трафика в PM трафик есть всегда (и ответ на нужный мне запрос то же есть), маска 100% правильная (как минимум потому что ссылка всегда одинаковая и по этой маске он иногда находит запрос), но функция не срабатывает.

В чем может быть дело?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113
Делайте проверку на наличие элементов в коллекции, на null и выводите в лог всё что можно, в целях отладки.
 

Gratsh

Client
Регистрация
09.03.2018
Сообщения
35
Благодарностей
14
Баллы
8
Делайте проверку на наличие элементов в коллекции, на null и выводите в лог всё что можно, в целях отладки.
Дело в том что отладка это хорошо.
Но трафик банально не заходит в переменную, т.е его просто нет, хотя в таблице он есть.
Так же очень часто если он вдруг все таки загрузился в переменную бывает что не получается извлечь ответ от сервера, хотя он то же имеется.
 

Sanya330

Client
Регистрация
16.08.2020
Сообщения
305
Благодарностей
70
Баллы
28
Была проблема что с 1 поиска не находило запрос, хотя он в мониторе был, решил просто зациклить, находит раза с пятого)
 

Gratsh

Client
Регистрация
09.03.2018
Сообщения
35
Благодарностей
14
Баллы
8
Была проблема что с 1 поиска не находило запрос, хотя он в мониторе был, решил просто зациклить, находит раза с пятого)
А что именно зациклить? Вызов GetTraffic и обработку?
Или выполнение с нуля в плане загрузки страницы и так далее?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113
Так же очень часто если он вдруг все таки загрузился в переменную бывает что не получается извлечь ответ от сервера, хотя он то же имеется.
Для этого случая есть метод Refresh.
Но трафик банально не заходит в переменную, т.е его просто нет, хотя в таблице он есть.
Необходим минимальный, рабочий шаблон пример.
 

Sanya330

Client
Регистрация
16.08.2020
Сообщения
305
Благодарностей
70
Баллы
28
А что именно зациклить? Вызов GetTraffic и обработку?
Или выполнение с нуля в плане загрузки страницы и так далее?
Зациклил C# кубик поиска запросы и получения из него headers/body.
 

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
Так же наблюдаю проблему на 7.7.0.0 и на всех движках. Хз и паузы ставил, и шаблон отдельно писал для отлова бага. В трафике данные есть, получать их не хочет, вернее получает но с периодичностью ~ 2 к 3-5. После прочтения форума понял что баг ещё давнейший. Нужно в ветку писать, только вот пока пофиксят не актуально уже будет. На мой взгляд это одна из главных причин отрапортовать про баг.
 
  • Спасибо
Реакции: Hannes

Gratsh

Client
Регистрация
09.03.2018
Сообщения
35
Благодарностей
14
Баллы
8
Зациклил C# кубик поиска запросы и получения из него headers/body.
Так, а какой смысл этого действия если после первого чтения весь объект стирается, а запрос к примеру был первым - вторым по очереди?
Для этого случая есть метод Refresh.

Необходим минимальный, рабочий шаблон пример.
Минимальный пример это зайти на любой сайт и получить ответ с какого-то запроса.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113
Так, а какой смысл этого действия если после первого чтения весь объект стирается, а запрос к примеру был первым - вторым по очереди?
Получите объект и в цикле делайте у него Refresh(), пока не появятся.
 

Gratsh

Client
Регистрация
09.03.2018
Сообщения
35
Благодарностей
14
Баллы
8
Получите объект и в цикле делайте у него Refresh(), пока не появятся.
Спасибо, обязательно проверю.
Но основная проблема от этого никуда не уходит: очень часто при наличии запроса да же не находит по ссылке его наличие.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113

THE CaHeK

Client
Регистрация
29.01.2016
Сообщения
296
Благодарностей
116
Баллы
43
Салют.

Есть нетривиальная задача: перейти на страницу, дождаться ее полной загрузки, выполнить заполнение полей формы и нажать на кнопку входа, после этого подождать полной загрузки страницы и при помощи GetTraffic извлечь запрос на форму и получить ответ.

Сделал такой проект, все работает кроме корректного извлечения трафика.

Перед переходом на страницу выполняю : instance.UseTrafficMonitoring = true;
Далее после того как запрос на форму прошел выполняю такой код:


Сохраняю трафик в переменную проекта, для того что бы обращаться к нему не один раз:
project.Context["traff"] = instance.ActiveTab.GetTraffic();
Ищу нужный запрос по маске, записываю его ответ в переменную проекта, а так же вывожу все ссылки запросов в лог для отладки:
var traffic = project.Context["traff"];
foreach(TrafficItem t in traffic)
{
    project.SendInfoToLog(t.Url);
    if (t.Url.Contains("/rest") && t.Method=="POST")
    {
        try
        {
            project.Variables["responce"].Value = System.Text.Encoding.UTF8.GetString(t.ResponseBody);
        }
        catch
        {
            continue;
        }
    }
}
В 100% случаях не работает если в PM нажать на кнопку выполнить с начала, после если произвести те же самые действия руками на странице (или по шагам после того как проект 1 раз выполнился полностью) в 50% случаев работает правильно (в лог выводит ссылки, в переменную записывает нужный ответ).

Что я имею ввиду под словами "не работает": в таблице трафика в PM трафик есть всегда (и ответ на нужный мне запрос то же есть), маска 100% правильная (как минимум потому что ссылка всегда одинаковая и по этой маске он иногда находит запрос), но функция не срабатывает.

В чем может быть дело?
Вы можете ловить ошибку, еще из за того, что запрос еще не "дошел". Вот вытащил из старого шаблона пример. Внедрите у себя WaitResponse, может частично поможет.
+ Navigate90612

WaitResponse:
foreach(var t in traffic) {
    if (t.Url==url_atmarket) {
        t.WaitResponse(10, 1); //
        string bodyResponse = System.Text.Encoding.UTF8.GetString(t.ResponseBody);
        string status_Code = t.ResultCode.ToString();  
        string RequestBody = t.RequestBody;
        if(bodyResponse.Contains("success")){
            return project.Variables["get_atmarket"].Value = bodyResponse;
        }else{
            throw new Exception("В ссылке, не нашли success(какая-то поебень в ответе - отладить)");
        }
    }
   
}
throw new Exception("Не было нашей ссылки");
 
  • Спасибо
Реакции: Hannes

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113
Вы можете ловить ошибку, еще из за того, что запрос еще не "дошел". Вот вытащил из старого шаблона пример. Внедрите у себя WaitResponse, может частично поможет.

WaitResponse:
foreach(var t in traffic) {
    if (t.Url==url_atmarket) {
        t.WaitResponse(10, 1); //
        string bodyResponse = System.Text.Encoding.UTF8.GetString(t.ResponseBody);
        string status_Code = t.ResultCode.ToString();  
        string RequestBody = t.RequestBody;
        if(bodyResponse.Contains("success")){
            return project.Variables["get_atmarket"].Value = bodyResponse;
        }else{
            throw new Exception("В ссылке, не нашли success(какая-то поебень в ответе - отладить)");
        }
    }
   
}
throw new Exception("Не было нашей ссылки");
Уже писал выше 2 раза, на этот случай есть Refresh()
 
  • Спасибо
Реакции: THE CaHeK

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
Не очищать трафик автоматически при Navigate
Там точно не в этом дело?
Там в целом трабла с гет трафиком. Я невнимательно прочитал описание этого топика. Но в моей теме ответственный за раздел, бы и отписаться по багу.
 

Gratsh

Client
Регистрация
09.03.2018
Сообщения
35
Благодарностей
14
Баллы
8
Вы можете ловить ошибку, еще из за того, что запрос еще не "дошел". Вот вытащил из старого шаблона пример. Внедрите у себя WaitResponse, может частично поможет.
+ NavigateПосмотреть вложение 90612

WaitResponse:
foreach(var t in traffic) {
    if (t.Url==url_atmarket) {
        t.WaitResponse(10, 1); //
        string bodyResponse = System.Text.Encoding.UTF8.GetString(t.ResponseBody);
        string status_Code = t.ResultCode.ToString();
        string RequestBody = t.RequestBody;
        if(bodyResponse.Contains("success")){
            return project.Variables["get_atmarket"].Value = bodyResponse;
        }else{
            throw new Exception("В ссылке, не нашли success(какая-то поебень в ответе - отладить)");
        }
    }
 
}
throw new Exception("Не было нашей ссылки");
Вернулся к трафику в зеннопостер в очередной раз, и вновь не выходит получить ответ/заголовки ответа/заголовки запроса который видно в окне траффика в зеннопостер.
Проблема актуальная для любого сайта, будь это хоть google.com(если вытаскивать параметры заголовков запроса на условный .js скрипт) или что-то еще.

Кстати, банально да же ссылки не видит очень часто
foreach(var t in traffic) {
project.SendInfoToLog(t.Url);
}

т.е этот код банально ничего не отобразит.
 
  • Спасибо
Реакции: Sho

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
554
Благодарностей
1 136
Баллы
93
Схожая проблема кажись, заодно подниму тему.)
В инспекторе во вкладке network есть запрос, а в окне трафик и после исполнения кода нет запроса. Хотя браузер буквально один и тот же.

Я выполняю данный код:
C#:
instance.UseTrafficMonitoring = true;
string site = "ссылка";
instance.ActiveTab.Navigate(site);
instance.ActiveTab.WaitDownloading();

var trafficItems = instance.ActiveTab.GetTraffic();

var resList = trafficItems
    .Where(item => item.Url.Contains("искомое"))
    .Select(item => new Dictionary<string, string>
    {
        { "url", item.Url },
        { "requestBody", item.RequestBody },
        { "responseBody", item.ResponseBody == null ? "" : Encoding.UTF8.GetString(item.ResponseBody) }
    })
    .ToList();
В инспекторе:
1679072927647.png

В окне трафика данного запроса нет.

Это может быть связано как-то с генерацией с помощью js? Если да, то как получить это изображение, которое есть на странице?
 
  • Спасибо
Реакции: Sho

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 285
Благодарностей
624
Баллы
113
Схожая проблема кажись, заодно подниму тему.)
В инспекторе во вкладке network есть запрос, а в окне трафик и после исполнения кода нет запроса. Хотя браузер буквально один и тот же.

Я выполняю данный код:
C#:
instance.UseTrafficMonitoring = true;
string site = "ссылка";
instance.ActiveTab.Navigate(site);
instance.ActiveTab.WaitDownloading();

var trafficItems = instance.ActiveTab.GetTraffic();

var resList = trafficItems
    .Where(item => item.Url.Contains("искомое"))
    .Select(item => new Dictionary<string, string>
    {
        { "url", item.Url },
        { "requestBody", item.RequestBody },
        { "responseBody", item.ResponseBody == null ? "" : Encoding.UTF8.GetString(item.ResponseBody) }
    })
    .ToList();
В инспекторе:
Посмотреть вложение 104718

В окне трафика данного запроса нет.

Это может быть связано как-то с генерацией с помощью js? Если да, то как получить это изображение, которое есть на странице?
Там вроде не URL-ка вовзращается, а картинка в base64 готовом, если мне не кажется.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113
  • Спасибо
Реакции: djaga

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
554
Благодарностей
1 136
Баллы
93
в URL же оно конвертируется в иную последовательность символов:
или что-то другое.
Не понял вас. Вы имеете в виду, что проблема в кодировке поиска?
Я если что и без поиска конкретного url собирал абсолютно все строки из трафика и в gui ZM тоже смотрел. Там его просто нет.)
То есть буквально там нет ничего подобного.(
 
  • Спасибо
Реакции: avlba

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
554
Благодарностей
1 136
Баллы
93
Его можно просто получить как есть, в крайнем случае просто заскринить:
В инспекторе в ответе есть цела картинка, а на странице она разделяется на куски и используется в разных частях.
Из-за этого интерес вызывает именно целикова картинка. Скринить кусочки и потом собирать, слишком костельно.(
 
  • Спасибо
Реакции: avlba

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 285
Благодарностей
624
Баллы
113
В инспекторе в ответе есть цела картинка, а на странице она разделяется на куски и используется в разных частях.
Из-за этого интерес вызывает именно целикова картинка. Скринить кусочки и потом собирать, слишком костельно.(
Че в js-e этом? Может, проще его выполнить на странице и прочитать результат, как вариант? Если он не огромный, то можно его попробовать разобрать.
 

Besedi

Client
Регистрация
04.03.2019
Сообщения
234
Благодарностей
41
Баллы
28
Его можно просто получить как есть, в крайнем случае просто заскринить:
А как правильно скринить?
C#:
//фиксируем ошибку в подкаталоге с уникальным именем
//сохраняем скриншот, дом, сурс страницы и переменные с их значениями

string dt_tm = "Error_"+DateTime.Now.ToString("yyyy_MM_dd__HH_mm_ss__")+Environment.TickCount.ToString();

//Директория ошибок и создание если отсутствует
string errorpath = Path.Combine(project.Directory,"Errors");
if (!Directory.Exists(errorpath)){
    Directory.CreateDirectory(errorpath);
}

//директория конкретной ошибки и создание если отсутствует
string cur_errorpath = Path.Combine(errorpath,dt_tm);
if (!Directory.Exists(cur_errorpath)){
    Directory.CreateDirectory(cur_errorpath);
}

string path_screenshot = Path.Combine(cur_errorpath,"ScreenShot.jpeg");
string path_dom = Path.Combine(cur_errorpath,"dom.txt");
string path_source = Path.Combine(cur_errorpath,"source.txt");
string path_vars = Path.Combine(cur_errorpath,"vars.txt");
string path_log = Path.Combine(cur_errorpath,"log.txt");

//скриншот
ZennoPoster.ImageProcessingUntreatedFromScreenshot(instance.Port, path_screenshot);
//DOM
File.WriteAllText(path_dom,instance.ActiveTab.DomText,Encoding.UTF8);
//Source
File.WriteAllText(path_source,instance.ActiveTab.GetSourceText("UTF8"),Encoding.UTF8);

//vars
var sb = new StringBuilder();
foreach(var variable in project.Variables.Keys){   
    sb.AppendFormat("Name: {0} Value: {1}\r\n", variable, project.Variables[variable].Value);
}

File.WriteAllText(path_vars,sb.ToString(),Encoding.UTF8);

//данные об ошибке
var sbl = new StringBuilder();
LastError le = project.GetLastError();
if (le!=null)
{
      sbl.AppendLine("Error ID: "+le.ActionId);
      sbl.AppendLine("Error comment: "+le.ActionComment);
    //sbl.AppendLine("Error Message: "+le.Exception.Message);
    sbl.AppendLine("Error Source: "+le.Exception.Source);
}

File.WriteAllText(path_log,sbl.ToString(),Encoding.UTF8);

project.SendWarningToLog("Данные по ошибке сохранены в каталоге "+cur_errorpath,true);
Использую такой код для сохранения скриншота и не только, но он почему-то айфреймы (капчи например) не скринит
 
  • Спасибо
Реакции: Sho

usboff

Client
Регистрация
25.08.2021
Сообщения
92
Благодарностей
51
Баллы
18
Подтверждаю наличие ошибки, GetTraffic работал корректно, но не с того ни с сего стал возвращать 1-3 запроса и всё, весь остальной траф будто игнорит. Перепробовал уже все что можно. Работает раз через раз. Кто-то нашел решение?
 

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
Подтверждаю наличие ошибки, GetTraffic работал корректно, но не с того ни с сего стал возвращать 1-3 запроса и всё, весь остальной траф будто игнорит. Перепробовал уже все что можно. Работает раз через раз. Кто-то нашел решение?
Попробуй кэш очистить, у себя заметил, что кэшированные урлы не мониторит.
 
  • Спасибо
Реакции: Yuriy Zymlex, Sho и usboff

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)