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

  • Автор темы Автор темы zlodey
  • Дата начала Дата начала

zlodey

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

Принцип действия таков, ищем по xpath ссылку и кликаем, далее регуляркой проверяем на странице нужный нам текст, если да уходим дальше, если нет то повторяем шаги, всего 10 уровней.
Снимок экрана 2021-03-07 в 16.32.27.png
 
Вроде подобного, главное проверяйте наличие элементов через 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
Вроде подобного, главное проверяйте наличие элементов через 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();
}
 

Вложения

  • Снимок экрана 2021-03-08 в 19.24.17.png
    Снимок экрана 2021-03-08 в 19.24.17.png
    340,6 KB · Просмотры: 6
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
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 и не нашли наш регекс то снова вывели сообщение в лог и вышли по красной
 
Если нигде не накосячил (тестить лень было):
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
throw new Exception("ничего не найдено");

вот так выбрасывать ошибки, в конце добавьте проверку по if и выбрасывайте ошибки.
 
  • Спасибо
Реакции: zlodey
Если нигде не накосячил (тестить лень было):
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); //вывод в лог
 
Попробуй первой же строчкой вывести в лог любое сообщение. Если не выйдет то глюк
прописал первой строкой
project.SendInfoToLog("тест", true); в логе отобразило корректно, не отображает именно 24 строку когда нашли переменную domain на странице.
Проект простой в переменной domain домен вида domain.com, заходим на страницу bing.com и вбиваем любой кей и выполняем код выше(для снятия позиций выдачи)
 
прописал первой строкой
project.SendInfoToLog("тест", true); в логе отобразило корректно, не отображает именно 24 строку когда нашли переменную domain на странице.
Проект простой в переменной domain домен вида domain.com, заходим на страницу bing.com и вбиваем любой кей и выполняем код выше(для снятия позиций выдачи)
значит регулярка не находит ничего.
в лог выводи сколько нашлось и увидишь что почем
project.SendInfoToLog($"найдено {regexGroups.Count}", true);

}
 
Если нигде не накосячил (тестить лень было):
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# код не останавливается при обнаружении регулярки, а если нужный текст сразу же есть во время запуска кода то все ок, регулярка та же
 
В общем что то никак не выходит, а именно регулярка не срабатывает если мы пошли дальше по страницам, к примеру если на 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("Ничего не нашли"); //выход по ошибке
}
 
Последнее редактирование:
del
 
Последнее редактирование:

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