Как в C# сделать цикл действий

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Подскажите пожалуйста как правильно реализовать в С# цикл действий дабы избежать нагромождения из кубиков

Принцип действия таков, ищем по xpath ссылку и кликаем, далее регуляркой проверяем на странице нужный нам текст, если да уходим дальше, если нет то повторяем шаги, всего 10 уровней.
Снимок экрана 2021-03-07 в 16.32.27.png
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Вроде подобного, главное проверяйте наличие элементов через if.

C#:
// Объявляем tab
Tab tab = instance.ActiveTab;

// Заводим  цикл
for (int i = 0; i < 10; i++)
{
    // Проверяем кнопку
    if (!tab.FindElementByXPath(".//*",0).IsNull)
    {
        tab.FindElementByXPath(".//*",0).Click("Full"); // Кликаем
        Thread.Sleep(5 * 1000);  // Пауза
    }

    // Проверяем нужный элемент и если нашли, то выходим из цикла
    if (!tab.FindElementByXPath(".//[*]",0).IsNull) break;
}
 
  • Спасибо
Реакции: zlodey

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Вроде подобного, главное проверяйте наличие элементов через if.

C#:
// Объявляем tab
Tab tab = instance.ActiveTab;

// Заводим  цикл
for (int i = 0; i < 10; i++)
{
    // Проверяем кнопку
    if (!tab.FindElementByXPath(".//*",0).IsNull)
    {
        tab.FindElementByXPath(".//*",0).Click("Full"); // Кликаем
        Thread.Sleep(5 * 1000);  // Пауза
    }

    // Проверяем нужный элемент и если нашли, то выходим из цикла
    if (!tab.FindElementByXPath(".//[*]",0).IsNull) break;
}
Все равно не могу понять как правильно его реализовать, вот мои пути, принцип такой что при переходе на каждый ишем регуляркой текст, если нашли то выходит по Good если нет идем по следующим xpath

tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'2')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'3')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'4')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'5')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'6')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'7')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'8')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'9')]",0);
tab.FindElementByXPath(@"//a[@class='b_widePag sb_bp'][contains(text(),'10')]",0);


Вот регулярка которой проверяем результат сконвертированная из кубика


C#:
// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
if (regexGroups.Count == 0)
{
    if (errorIfEmpty) throw new Exception();
}
else
{
    project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
}
 

Вложения

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
C#:
Tab tab = instance.ActiveTab;

// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");

//если по регулярке ничего не нашли, идем на другие страницы
if (regexGroups.Count == 0)
{
    for(int i=2;i<11;i++)
    {
        //переходим на следующую стр
        tab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0).Click();
        tab.WaitDownloading();
        
        //ищем регулярку. Если нашли покинь цикл
        regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
        if (regexGroups.Count != 0)
        {
            project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
            break;
        }
    }
}
 
  • Спасибо
Реакции: zlodey

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
C#:
Tab tab = instance.ActiveTab;

// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");

//если по регулярке ничего не нашли, идем на другие страницы
if (regexGroups.Count == 0)
{
    for(int i=2;i<11;i++)
    {
        //переходим на следующую стр
        tab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0).Click();
        tab.WaitDownloading();
       
        //ищем регулярку. Если нашли покинь цикл
        regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
        if (regexGroups.Count != 0)
        {
            project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
            break;
        }
    }
}
Еще хотел бы уточнить момент как сделать выход по красной ветке если прошли все 10 страниц и ничего не нашли, сейчас цикл завершается по зеленой если итерация завершена и ничего не найдено, еще момент по поводу вывода в лог значения итерации (номер страницы на которой ищем), как я понимаю номер страницы у нас в переменной итерации i но что то не получается вывести в лог цифровое значение
project.SendInfoToLog(i.ToString(), true);

В конечном итоге хочу получить если отработала регулярка, вывели сообщение, если пошли дальше по циклу то выводим в лог текущее значение i (т.е номер итерации), если прошли всю итерацию от 2 до 10 и не нашли наш регекс то снова вывели сообщение в лог и вышли по красной
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Если нигде не накосячил (тестить лень было):
C#:
Tab tab = instance.ActiveTab;

// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");

//если по регулярке ничего не нашли, идем на другие страницы
bool flag = false; //флажок, чтобы отследить, нашли ли что-то
if (regexGroups.Count == 0)
{
    for(int i=2;i<11;i++)
    {
        //переходим на следующую стр
        tab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0).Click();
        tab.WaitDownloading();
        project.SendInfoToLog($"Пробуем xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
        
        //ищем регулярку. Если нашли покинь цикл
        regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
        if (regexGroups.Count != 0)
        {
            project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
            project.SendInfoToLog($"нашли нужный xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
            flag = true;
            break;
        }
    }
    if(!flag) throw new Exception("Ничего не нашли"); //выход по ошибке
}
 
  • Спасибо
Реакции: zlodey и artomka

artomka

Client
Регистрация
23.08.2018
Сообщения
159
Благодарностей
93
Баллы
28
throw new Exception("ничего не найдено");

вот так выбрасывать ошибки, в конце добавьте проверку по if и выбрасывайте ошибки.
 
  • Спасибо
Реакции: zlodey

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Если нигде не накосячил (тестить лень было):
C#:
Tab tab = instance.ActiveTab;

// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");

//если по регулярке ничего не нашли, идем на другие страницы
bool flag = false; //флажок, чтобы отследить, нашли ли что-то
if (regexGroups.Count == 0)
{
    for(int i=2;i<11;i++)
    {
        //переходим на следующую стр
        tab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0).Click();
        tab.WaitDownloading();
        project.SendInfoToLog($"Пробуем xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
      
        //ищем регулярку. Если нашли покинь цикл
        regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
        if (regexGroups.Count != 0)
        {
            project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
            project.SendInfoToLog($"нашли нужный xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
            flag = true;
            break;
        }
    }
    if(!flag) throw new Exception("Ничего не нашли"); //выход по ошибке
}
Все гуд кроме 24 строки, при нахождении не получил уведомления в лог project.SendInfoToLog($"нашли нужный xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Не знаю, должен выводиться. Если только проект скинешь тогда смогу сказать в чем дело
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Попробуй первой же строчкой вывести в лог любое сообщение. Если не выйдет то глюк
 

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Попробуй первой же строчкой вывести в лог любое сообщение. Если не выйдет то глюк
прописал первой строкой
project.SendInfoToLog("тест", true); в логе отобразило корректно, не отображает именно 24 строку когда нашли переменную domain на странице.
Проект простой в переменной domain домен вида domain.com, заходим на страницу bing.com и вбиваем любой кей и выполняем код выше(для снятия позиций выдачи)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
прописал первой строкой
project.SendInfoToLog("тест", true); в логе отобразило корректно, не отображает именно 24 строку когда нашли переменную domain на странице.
Проект простой в переменной domain домен вида domain.com, заходим на страницу bing.com и вбиваем любой кей и выполняем код выше(для снятия позиций выдачи)
значит регулярка не находит ничего.
в лог выводи сколько нашлось и увидишь что почем
project.SendInfoToLog($"найдено {regexGroups.Count}", true);

}
 

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Если нигде не накосячил (тестить лень было):
C#:
Tab tab = instance.ActiveTab;

// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");

//если по регулярке ничего не нашли, идем на другие страницы
bool flag = false; //флажок, чтобы отследить, нашли ли что-то
if (regexGroups.Count == 0)
{
    for(int i=2;i<11;i++)
    {
        //переходим на следующую стр
        tab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0).Click();
        tab.WaitDownloading();
        project.SendInfoToLog($"Пробуем xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
       
        //ищем регулярку. Если нашли покинь цикл
        regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
        if (regexGroups.Count != 0)
        {
            project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
            project.SendInfoToLog($"нашли нужный xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
            flag = true;
            break;
        }
    }
    if(!flag) throw new Exception("Ничего не нашли"); //выход по ошибке
}
Что то поломалось в коде, до этого все стабильно работало, не могу понять в чем дело

Теперь если запускаем обход страниц то C# код не останавливается при обнаружении регулярки, а если нужный текст сразу же есть во время запуска кода то все ок, регулярка та же
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
В общем что то никак не выходит, а именно регулярка не срабатывает если мы пошли дальше по страницам, к примеру если на 1й странице есть нужный нам домен то регекс отрабатывает успешно, а вот начиная со 2 и далее уже нет.
Кто может проверить возьмите домен которого нет на 1 странице выдачи и положите его в переменную domain и запустите код, в переменной checksource пусто (это результат выполнения регулярки)

C#:
Tab tab = instance.ActiveTab;

instance.ActiveTab.Navigate("https://www.","");
instance.ActiveTab.WaitDownloading();

// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.DomText);
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");

project.SendInfoToLog("Проверяем наличие ссылки на странице", true);

var rnd = new Random();

//если по регулярке ничего не нашли, идем на другие страницы
bool flag = false; //флажок, чтобы отследить, нашли ли что-то
if (regexGroups.Count == 0)
{
    for(int i=2;i<11;i++)
    {
        //переходим на следующую стр
        //text = project.ExecuteMacro(instance.ActiveTab.GetSourceText("utf-8"));
        var elButton = instance.ActiveTab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0); //Находим элемент кнопки
        int topInBrowser = int.Parse(elButton.GetAttribute("topInBrowser")); //Определяем, на каком расстоянии от верха страницы находится кнопка
        instance.ActiveTab.FullEmulationMouseWheel(0, topInBrowser); //Делаем прокрутку на это расстояние
        instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(elButton); //Ведём курсор мышки к кнопке
        //instance.ActiveTab.FullEmulationMouseClick("left", "click"); //Кликаем
        tab.FindElementByXPath($"//a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", 0).Click();
      
        instance.ActiveTab.WaitDownloading(); // Ожидание загрузки
        System.Threading.Thread.Sleep(rnd.Next(1, 2) * 1000); // Пауза 2-3 сек
    
        //tab.WaitDownloading();
        project.SendInfoToLog($"Пробуем xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
    
        //ищем регулярку. Если нашли покинь цикл
        regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
        if (regexGroups.Count != 0)
        {
            project.Variables["checksource"].Value = regexGroups[0].FirstOrDefault();
            //project.SendInfoToLog($"нашли нужный xpath - //a[@class='b_widePag sb_bp'][contains(text(),'{i}')]", true); //вывод в лог
            flag = true;
            break;
        }
    }
    if(!flag) throw new Exception("Ничего не нашли"); //выход по ошибке
}
 
Последнее редактирование:

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
del
 
Последнее редактирование:

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