Что такое циклы?
Цикл - это повторение одних и тех же действий несколько раз. Например, нужно открыть 10 сайтов подряд - вместо копирования кода 10 раз, используем цикл.
1. Цикл FOR - когда знаем сколько раз повторять
Базовый синтаксис
csharp
for (int i = 0; i < 5; i++)
{
// код выполнится 5 раз
}Расшифровка:
int i = 0- начинаем с нуляi < 5- повторяем пока i меньше 5 (0,1,2,3,4)i++- после каждого повтора увеличиваем i на 1
Пример 1: Пролистать ленту 10 раз
csharp
for (int i = 0; i < 10; i++)
{
instance.ScrollDown();
System.Threading.Thread.Sleep(1000);
project.SendInfoToLog("Прокрутка " + (i + 1) + " из 10");
}Пример 2: Перебор списка по индексу
csharp
List<string> cities = new List<string> { "Москва", "Питер", "Казань" };
for (int i = 0; i < cities.Count; i++)
{
project.SendInfoToLog("Город " + i + ": " + cities[i]);
}2. Цикл WHILE - повторяем пока условие истинно
Базовый синтаксис
csharp
while (условие)
{
// код выполняется пока условие = true
}Пример 1: Ждём появления элемента
csharp
int попыток = 0;
while (instance.GetCountElementByXpath("//button[@class='login']") == 0)
{
System.Threading.Thread.Sleep(500);
попыток++;
project.SendInfoToLog("Ожидание кнопки... попытка " + попыток);
if (попыток > 20)
{
project.SendInfoToLog("Кнопка не появилась за 10 секунд");
break; // выходим из цикла
}
}Пример 2: Скроллим пока есть кнопка “Загрузить ещё”
csharp
while (instance.GetCountElementByXpath("//button[text()='Загрузить ещё']") > 0)
{
HtmlElement кнопка = instance.GetElementByXpath("//button[text()='Загрузить ещё']");
кнопка.Click();
System.Threading.Thread.Sleep(2000);
project.SendInfoToLog("Подгрузили ещё контент");
}3. Цикл FOREACH - перебор коллекций
Базовый синтаксис
csharp
foreach (тип переменная in коллекция)
{
// код для каждого элемента
}Пример 1: Перебор списка товаров
csharp
List<string> товары = new List<string> { "iPhone", "Samsung", "Xiaomi" };
foreach (string товар in товары)
{
project.SendInfoToLog("Ищем товар: " + товар);
instance.SearchElement(товар);
}Пример 2: Клик по всем ссылкам
csharp
HtmlElementCollection ссылки = instance.GetElementsByXpath("//a[@class='product-link']");
foreach (HtmlElement ссылка in ссылки)
{
string url = ссылка.GetAttribute("href");
project.SendInfoToLog("Найдена ссылка: " + url);
}Пример 3: Обработка таблицы
csharp
List<string> строки = project.Lists["emails"];
foreach (string email in строки)
{
project.SendInfoToLog("Обработка: " + email);
instance.GetElementByXpath("//input[@type='email']").SetValue(email);
}4. DO-WHILE - сначала делаем, потом проверяем
Базовый синтаксис
csharp
do
{
// код выполнится минимум 1 раз
}
while (условие);Пример: Решение капчи с повторами
csharp
bool решена = false;
do
{
string результат = SolveRecaptcha();
if (результат != "")
{
решена = true;
project.SendInfoToLog("Капча решена!");
}
else
{
project.SendInfoToLog("Капча не решилась, пробуем снова...");
System.Threading.Thread.Sleep(2000);
}
}
while (!решена);5. Управление циклами
BREAK - выход из цикла
csharp
for (int i = 0; i < 100; i++)
{
if (instance.GetCountElementByXpath("//div[@class='captcha']") > 0)
{
project.SendInfoToLog("Обнаружена капча, останавливаем цикл");
break; // полностью выходим из цикла
}
instance.ScrollDown();
}CONTINUE - пропуск итерации
csharp
List<string> urls = project.Lists["sites"];
foreach (string url in urls)
{
if (url == "")
{
continue; // пропускаем пустые строки
}
instance.GoToUrl(url);
project.SendInfoToLog("Обработан: " + url);
}6. Вложенные циклы
Пример: Два уровня вложенности
csharp
List<string> категории = new List<string> { "Одежда", "Обувь" };
List<string> бренды = new List<string> { "Nike", "Adidas" };
foreach (string категория in категории)
{
foreach (string бренд in бренды)
{
string запрос = категория + " " + бренд;
project.SendInfoToLog("Ищем: " + запрос);
instance.SearchElement(запрос);
}
}Практические задания
Задание 1
Напишите цикл, который откроет 7 страниц новостей (page=1, page=2… page=7)
Задание 2
Создайте цикл while, который будет скроллить страницу вниз пока не найдёт элемент с классом “footer”
Задание 3
Есть список email’ов в project.Lists[“emails”]. Переберите его через foreach и выведите каждый email в лог
Частые ошибки
❌ Бесконечный цикл
csharp
int i = 0;
while (i < 10)
{
project.SendInfoToLog("i = " + i);
// забыли написать i++
}❌ Неправильное условие
csharp
for (int i = 0; i <= 5; i++) // выполнится 6 раз (0,1,2,3,4,5)✅ Правильно
csharp
for (int i = 0; i < 5; i++) // выполнится 5 раз (0,1,2,3,4)