C# как сделать проверку повторяемости номера в цикле

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Реакции
300
Баллы
83
Никак не могу понять, как сделать проверку: увеличивается ли номер или нет?
Код:
Развернуть Свернуть Копировать
Tab tab = instance.ActiveTab;
int intKopeyka=0;
    int countOfIterations = 10; //максимальное число проверок элемента на странице
    int pause = 3; //пауза в секундах после каждой проверки элемента на странице
     //главный цикл
    for(int i=0;i<countOfIterations;i++)
{
    string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
    project.Variables["Kopeyka"].Value=strKopeyka;
    project.SendInfoToLog("Получено: " + strKopeyka);
//Проверяем, ЧТО получили
        int Kopeyka = Convert.ToInt32(project.Variables["Kopeyka"].Value);
        if (Kopeyka == 25){
            project.SendInfoToLog("ЗАКОНЧИЛИ!!!" + strKopeyka);
            return -1;
        }else{
            project.SendInfoToLog("Повторяем ЕЩЁ раз!!! - " + strKopeyka + i);
        }               
    System.Threading.Thread.Sleep(pause*1000); // перевод паузы в миллисекунды
}
Суть такая:
- на странице есть счётчик, число в нём увеличивается от 0 до 25
- задаю цикл - == 25 или нет?
- если не равно повторяю цикл, пока не станет равно == 25
НО есть загвоздка,- иногда страница зависает, и счётчик стоит на месте. В этом случае лучше уйти со страницы, потому что висеть будет долго. Зависание видно по тому, что цифра не увеличивается

ВОПРОС:
- как сделать (думаю внутри }else{ ) проверку переменной в цикле, стала ли цифра больше, чем в предыдущем цикле или осталась прежней?
Думаю, надо впихнуть сюда,
Код:
Развернуть Свернуть Копировать
        }else{
            project.SendInfoToLog("Повторяем ЕЩЁ раз!!! - " + strKopeyka + i);
но как сделать ХЗ?
Прошу помощи
 
Самое простое - добавить вторую переменную в которую будем закидывать Kopeyka, а после сравнивать с ней при каждой новой итерации.
То есть на след. круге выдираем xpath'ом значение, далее сравниваем со второй переменной. Если увеличилось -> идем дальше, если нет... Уловили суть? :-)
 
Самое простое - добавить вторую переменную в которую будем закидывать Kopeyka, а после будем сравнивать с ней при каждой новой итерации.
То есть на след. круге выдираем xpath'ом значение, далее сравниваем со второй переменной. Если увеличилось -> идем дальше, если нет... Уловили суть? :-)
Суть-то я улавливаю, сразу понял что ТАКОЕ надо, но сделать не получается, не знаю как. Вторая переменная не должна меняться на данном цикле, а передавать значение предыдущего. Отсюда, подумал, что объявить переменную и вставить в неё значение надо внутри else. Перепробовал разное и - не работает
 
Не понимаю в чем сложность.
Инициализируете её до цикла:
C#:
Развернуть Свернуть Копировать
string lastresult;
Далее после:
Код:
Развернуть Свернуть Копировать
string strKopeyka=instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml")
Вставляете проверку if-else. Если изменилось, то делаем
C#:
Развернуть Свернуть Копировать
lastresult=strKopeyka;
При второй (третьей и т.д.) итерации выдирается новое значение и сравнивается с тем, что мы получили на прошлом шаге.
 
Не понимаю в чем сложность.
Слишком сырой
Сделал вот так (как я понял из вышесказанного)
Код:
Развернуть Свернуть Копировать
    string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
    if (lastresult=strKopeyka){
ПМ ругается "Компиляция кода Ошибка в действии "CS0029* "Неявное преобразование типа "string* в "bооl" невозможно". [Строка: 10; Столбец: 6]"
 
Слишком сырой
Сделал вот так (как я понял из вышесказанного)
Код:
Развернуть Свернуть Копировать
    string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
    if (lastresult=strKopeyka){
ПМ ругается "Компиляция кода Ошибка в действии "CS0029* "Неявное преобразование типа "string* в "bооl" невозможно". [Строка: 10; Столбец: 6]"
В условии нельзя присваивать значение.
C#:
Развернуть Свернуть Копировать
if (lastresult==strKopeyka) {project.SendWarningToLog("Значение не изменилось");}
 
Всё равно ругается
Код:
Развернуть Свернуть Копировать
Компиляция кода Ошибка в действии 'CS0165" "Использование локальной переменной lastresult", которой не присвоено значение". [Строка: 10; Столбец: 6]
но уже иначе. Это радует
 
Убери точку в XPATh
и if (lastresult == strKopeyka
 
Всё равно ругается
Код:
Развернуть Свернуть Копировать
Компиляция кода Ошибка в действии 'CS0165" "Использование локальной переменной lastresult", которой не присвоено значение". [Строка: 10; Столбец: 6]
но уже иначе. Это радует
Вставили перед циклом?
Код:
Развернуть Свернуть Копировать
string lastresult;

Если да, то попробуйте поменять на:
Код:
Развернуть Свернуть Копировать
string lastresult = string.Empty;
 
Короче.
Пробуйте:
C#:
Развернуть Свернуть Копировать
Tab tab = instance.ActiveTab;
int intKopeyka=0;
int countOfIterations = 10; //максимальное число проверок элемента на странице
int pause = 3; //пауза в секундах после каждой проверки элемента на странице
string lastresult = string.Empty;

//главный цикл
for(int i=0; i < countOfIterations; i++) {
   string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
   if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");}
   project.SendInfoToLog("Получено: " + strKopeyka);
   //Проверяем, ЧТО получили
   if (Convert.ToInt32(strKopeyka)==25) {
     project.Variables["Kopeyka"].Value=strKopeyka;
     project.SendInfoToLog("ЗАКОНЧИЛИ!!!" + strKopeyka);
     return -1;
   } else {
     project.SendInfoToLog("Повторяем ЕЩЁ раз!!! - " + strKopeyka + i.ToString());
   }   
   System.Threading.Thread.Sleep(pause*1000); // перевод паузы в миллисекунды
}
 
Короче.
Пробуйте:
Пробовал и такой и предыдущий. ПМ как-будто не видит этой строки:
Код:
Развернуть Свернуть Копировать
   if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");}
В лог не выводится "Ничего не изменилось"
Выводится только вот это - "Повторяем ЕЩЁ раз!!... и Значение: 0
 
Пробовал и такой и предыдущий. ПМ как-будто не видит этой строки:
Код:
Развернуть Свернуть Копировать
   if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");}
В лог не выводится "Ничего не изменилось"
Выводится только вот это - "Повторяем ЕЩЁ раз!!... и Значение: 0
Забыл добавить запись прошлого результата, извиняюсь.
C#:
Развернуть Свернуть Копировать
Tab tab = instance.ActiveTab;
int intKopeyka=0;
int countOfIterations = 10; //максимальное число проверок элемента на странице
int pause = 3; //пауза в секундах после каждой проверки элемента на странице
string lastresult = string.Empty;

//главный цикл
for(int i=0; i < countOfIterations; i++) {
   string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
   if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");} else {lastresult=strKopeyka;}
   project.SendInfoToLog("Получено: " + strKopeyka);
   //Проверяем, ЧТО получили
   if (Convert.ToInt32(strKopeyka)==25) {
     project.Variables["Kopeyka"].Value=strKopeyka;
     project.SendInfoToLog("ЗАКОНЧИЛИ!!!" + strKopeyka);
     return -1;
   } else {
     project.SendInfoToLog("Повторяем ЕЩЁ раз!!! - " + strKopeyka + i.ToString());
   }  
   System.Threading.Thread.Sleep(pause*1000); // перевод паузы в миллисекунды
}
 
Сейчас всё время выходит по "else {lastresult=strKopeyka;}", то есть всегда 2 значения равны
Надо попробовать паузу перед "if (lastresult==strKopeyka)" поставить? Хотя, нет, не поможет
В общем, ничего не решает этот вариант
Я не совсем понимаю (или совсем не понимаю), что делает эта часть "if (lastresult==strKopeyka)" и что делает "else {lastresult=strKopeyka;}" эта?
Если в "if (lastresult==strKopeyka)" присваивается значение, то обе части всегда будут равны, так как значение присваивается одновременно с считыванием
 
что делает эта часть "if (lastresult==strKopeyka)"
Сравнивает.
и что делает "else {lastresult=strKopeyka;}" эта?
Присваивает. При условии, что прошлое и текущее взятое значение не совпадают.
Сейчас всё время выходит по "else {lastresult=strKopeyka;}", то есть всегда 2 значения равны
Если выходит по else, значит что 2 значения неравны. Они отличаются друг от друга. Иначе выводилось бы сообщение "Ничего не изменилось". Все же логично.

Поставьте после:
Код:
Развернуть Свернуть Копировать
string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");

Вывод в лог, чтобы понимать, что было взято. А дальше анализируйте. Код должен отрабатывать верно.
 
  • Спасибо
Реакции: Valiksim
Сравнивает.
Присваивает. При условии, что прошлое и текущее взятое значение не совпадают..
Спасибо, понял

Если выходит по else, значит что 2 значения неравны. Они отличаются друг от друга. Иначе выводилось бы сообщение "".
Понял. Вывод в лог помог разобраться, и, конечно же, данные подсказки

Поставьте после:
string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
Вывод в лог, чтобы понимать, что было взято. А дальше анализируйте. Код должен отрабатывать верно.
Сделал везде вывод в лог и вроде разобрался. Код, что выше работает!

Не знаю, как будет, когда код выдал сначала цифру, а потом замер? надо ждать пока такое появится в реале или как-то вызвать? То есть, если в первом цикле значение были разные, идёт выполнение, а если во втором, третьем они стали равными, сработает ли код?
Вся проблема в том и состоит, что сайт тормознутый иногда, и зависает. Чтобы этого избежать, надо вовремя выйти со страницы, которая тормозит

Спасибо большое за помощь, буду дальше тестить
 
То есть, если в первом цикле значение были разные, идёт выполнение, а если во втором, третьем они стали равными, сработает ли код?
Вся проблема в том и состоит, что сайт тормознутый иногда, и зависает. Чтобы этого избежать, надо вовремя выйти со страницы, которая тормозит
Да, если на втором-третьем-четвертом и т.д. этапах значения будут равны, выведется сообщение "Ничего не изменилось".
Если необходимо не просто вывести сообщение, а еще и выйти из кубика, то замените эту строку:
Код:
Развернуть Свернуть Копировать
if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");} else {lastresult=strKopeyka;}

На:
Код:
Развернуть Свернуть Копировать
if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");return null;} else {lastresult=strKopeyka;}

Когда значения станут равны, произойдет выход по красной ветке.
 
  • Спасибо
Реакции: Valiksim
Работает, даже если перестало меняться на 2-м или другом уровне цикла.
То, что надо
Null я вставил ещё раньше, увидев, что всё работает
Спасибо за помощь!
 

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