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

Gratsh

Client
Joined
Mar 9, 2018
Messages
36
Reaction score
15
Points
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
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113
Делайте проверку на наличие элементов в коллекции, на null и выводите в лог всё что можно, в целях отладки.
 

Gratsh

Client
Joined
Mar 9, 2018
Messages
36
Reaction score
15
Points
8
Делайте проверку на наличие элементов в коллекции, на null и выводите в лог всё что можно, в целях отладки.
Дело в том что отладка это хорошо.
Но трафик банально не заходит в переменную, т.е его просто нет, хотя в таблице он есть.
Так же очень часто если он вдруг все таки загрузился в переменную бывает что не получается извлечь ответ от сервера, хотя он то же имеется.
 

Sanya330

Client
Joined
Aug 16, 2020
Messages
309
Reaction score
71
Points
28
Была проблема что с 1 поиска не находило запрос, хотя он в мониторе был, решил просто зациклить, находит раза с пятого)
 

Gratsh

Client
Joined
Mar 9, 2018
Messages
36
Reaction score
15
Points
8
Была проблема что с 1 поиска не находило запрос, хотя он в мониторе был, решил просто зациклить, находит раза с пятого)
А что именно зациклить? Вызов GetTraffic и обработку?
Или выполнение с нуля в плане загрузки страницы и так далее?
 

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113
Так же очень часто если он вдруг все таки загрузился в переменную бывает что не получается извлечь ответ от сервера, хотя он то же имеется.
Для этого случая есть метод Refresh.
Но трафик банально не заходит в переменную, т.е его просто нет, хотя в таблице он есть.
Необходим минимальный, рабочий шаблон пример.
 

Sanya330

Client
Joined
Aug 16, 2020
Messages
309
Reaction score
71
Points
28
А что именно зациклить? Вызов GetTraffic и обработку?
Или выполнение с нуля в плане загрузки страницы и так далее?
Зациклил C# кубик поиска запросы и получения из него headers/body.
 

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
Так же наблюдаю проблему на 7.7.0.0 и на всех движках. Хз и паузы ставил, и шаблон отдельно писал для отлова бага. В трафике данные есть, получать их не хочет, вернее получает но с периодичностью ~ 2 к 3-5. После прочтения форума понял что баг ещё давнейший. Нужно в ветку писать, только вот пока пофиксят не актуально уже будет. На мой взгляд это одна из главных причин отрапортовать про баг.
 
  • Thank you
Reactions: Hannes

Gratsh

Client
Joined
Mar 9, 2018
Messages
36
Reaction score
15
Points
8
Зациклил C# кубик поиска запросы и получения из него headers/body.
Так, а какой смысл этого действия если после первого чтения весь объект стирается, а запрос к примеру был первым - вторым по очереди?
Для этого случая есть метод Refresh.

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

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113
Так, а какой смысл этого действия если после первого чтения весь объект стирается, а запрос к примеру был первым - вторым по очереди?
Получите объект и в цикле делайте у него Refresh(), пока не появятся.
 

Gratsh

Client
Joined
Mar 9, 2018
Messages
36
Reaction score
15
Points
8
Получите объект и в цикле делайте у него Refresh(), пока не появятся.
Спасибо, обязательно проверю.
Но основная проблема от этого никуда не уходит: очень часто при наличии запроса да же не находит по ссылке его наличие.
 

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113
очень часто при наличии запроса да же не находит по ссылке его наличие.
Необходим пример разработчикам.
 

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113

THE CaHeK

Client
Joined
Jan 29, 2016
Messages
297
Reaction score
118
Points
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("Не было нашей ссылки");
 
  • Thank you
Reactions: Hannes

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
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()
 
  • Thank you
Reactions: THE CaHeK

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
Не очищать трафик автоматически при Navigate
Там точно не в этом дело?
Там в целом трабла с гет трафиком. Я невнимательно прочитал описание этого топика. Но в моей теме ответственный за раздел, бы и отписаться по багу.
 

Gratsh

Client
Joined
Mar 9, 2018
Messages
36
Reaction score
15
Points
8
Вы можете ловить ошибку, еще из за того, что запрос еще не "дошел". Вот вытащил из старого шаблона пример. Внедрите у себя WaitResponse, может частично поможет.
+ NavigateView attachment 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);
}

т.е этот код банально ничего не отобразит.
 
  • Thank you
Reactions: Sho

djaga

Administrator
Staff member
Joined
Apr 26, 2020
Messages
562
Reaction score
1,144
Points
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? Если да, то как получить это изображение, которое есть на странице?
 
  • Thank you
Reactions: Sho

n0n3mi1y

Client
Joined
Mar 8, 2017
Messages
1,351
Reaction score
671
Points
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();
В инспекторе:
View attachment 104718

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

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

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113
  • Thank you
Reactions: djaga

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,571
Reaction score
3,395
Points
113
  • Thank you
Reactions: djaga

djaga

Administrator
Staff member
Joined
Apr 26, 2020
Messages
562
Reaction score
1,144
Points
93
в URL же оно конвертируется в иную последовательность символов:
или что-то другое.
Не понял вас. Вы имеете в виду, что проблема в кодировке поиска?
Я если что и без поиска конкретного url собирал абсолютно все строки из трафика и в gui ZM тоже смотрел. Там его просто нет.)
То есть буквально там нет ничего подобного.(
 
  • Thank you
Reactions: avlba

djaga

Administrator
Staff member
Joined
Apr 26, 2020
Messages
562
Reaction score
1,144
Points
93
Его можно просто получить как есть, в крайнем случае просто заскринить:
В инспекторе в ответе есть цела картинка, а на странице она разделяется на куски и используется в разных частях.
Из-за этого интерес вызывает именно целикова картинка. Скринить кусочки и потом собирать, слишком костельно.(
 
  • Thank you
Reactions: avlba

n0n3mi1y

Client
Joined
Mar 8, 2017
Messages
1,351
Reaction score
671
Points
113
В инспекторе в ответе есть цела картинка, а на странице она разделяется на куски и используется в разных частях.
Из-за этого интерес вызывает именно целикова картинка. Скринить кусочки и потом собирать, слишком костельно.(
Че в js-e этом? Может, проще его выполнить на странице и прочитать результат, как вариант? Если он не огромный, то можно его попробовать разобрать.
 

Besedi

Client
Joined
Mar 4, 2019
Messages
234
Reaction score
42
Points
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);
Использую такой код для сохранения скриншота и не только, но он почему-то айфреймы (капчи например) не скринит
 
  • Thank you
Reactions: Sho

usboff

Client
Joined
Aug 25, 2021
Messages
106
Reaction score
73
Points
28
Подтверждаю наличие ошибки, GetTraffic работал корректно, но не с того ни с сего стал возвращать 1-3 запроса и всё, весь остальной траф будто игнорит. Перепробовал уже все что можно. Работает раз через раз. Кто-то нашел решение?
 

Wide

Client
Joined
Feb 4, 2013
Messages
970
Reaction score
261
Points
63
Подтверждаю наличие ошибки, GetTraffic работал корректно, но не с того ни с сего стал возвращать 1-3 запроса и всё, весь остальной траф будто игнорит. Перепробовал уже все что можно. Работает раз через раз. Кто-то нашел решение?
Попробуй кэш очистить, у себя заметил, что кэшированные урлы не мониторит.
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)