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

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
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);
но как сделать ХЗ?
Прошу помощи
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Самое простое - добавить вторую переменную в которую будем закидывать Kopeyka, а после сравнивать с ней при каждой новой итерации.
То есть на след. круге выдираем xpath'ом значение, далее сравниваем со второй переменной. Если увеличилось -> идем дальше, если нет... Уловили суть? :-)
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Самое простое - добавить вторую переменную в которую будем закидывать Kopeyka, а после будем сравнивать с ней при каждой новой итерации.
То есть на след. круге выдираем xpath'ом значение, далее сравниваем со второй переменной. Если увеличилось -> идем дальше, если нет... Уловили суть? :-)
Суть-то я улавливаю, сразу понял что ТАКОЕ надо, но сделать не получается, не знаю как. Вторая переменная не должна меняться на данном цикле, а передавать значение предыдущего. Отсюда, подумал, что объявить переменную и вставить в неё значение надо внутри else. Перепробовал разное и - не работает
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Не понимаю в чем сложность.
Инициализируете её до цикла:
C#:
string lastresult;
Далее после:
Код:
string strKopeyka=instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml")
Вставляете проверку if-else. Если изменилось, то делаем
C#:
lastresult=strKopeyka;
При второй (третьей и т.д.) итерации выдирается новое значение и сравнивается с тем, что мы получили на прошлом шаге.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Не понимаю в чем сложность.
Слишком сырой
Сделал вот так (как я понял из вышесказанного)
Код:
    string strKopeyka = instance.ActiveTab.FindElementByXPath(".//span[@id='played']",0).GetAttribute("InnerHtml");
    if (lastresult=strKopeyka){
ПМ ругается "Компиляция кода Ошибка в действии "CS0029* "Неявное преобразование типа "string* в "bооl" невозможно". [Строка: 10; Столбец: 6]"
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Слишком сырой
Сделал вот так (как я понял из вышесказанного)
Код:
    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("Значение не изменилось");}
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Всё равно ругается
Код:
Компиляция кода Ошибка в действии 'CS0165" "Использование локальной переменной lastresult", которой не присвоено значение". [Строка: 10; Столбец: 6]
но уже иначе. Это радует
 

deopl

Client
Регистрация
06.12.2011
Сообщения
667
Благодарностей
126
Баллы
43
Убери точку в XPATh
и if (lastresult == strKopeyka
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Всё равно ругается
Код:
Компиляция кода Ошибка в действии 'CS0165" "Использование локальной переменной lastresult", которой не присвоено значение". [Строка: 10; Столбец: 6]
но уже иначе. Это радует
Вставили перед циклом?
Код:
string lastresult;
Если да, то попробуйте поменять на:
Код:
string lastresult = string.Empty;
 

deopl

Client
Регистрация
06.12.2011
Сообщения
667
Благодарностей
126
Баллы
43

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Короче.
Пробуйте:
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); // перевод паузы в миллисекунды
}
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Короче.
Пробуйте:
Пробовал и такой и предыдущий. ПМ как-будто не видит этой строки:
Код:
   if (lastresult==strKopeyka) {project.SendWarningToLog("Ничего не изменилось");}
В лог не выводится "Ничего не изменилось"
Выводится только вот это - "Повторяем ЕЩЁ раз!!... и Значение: 0
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Пробовал и такой и предыдущий. ПМ как-будто не видит этой строки:
Код:
   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); // перевод паузы в миллисекунды
}
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Сейчас всё время выходит по "else {lastresult=strKopeyka;}", то есть всегда 2 значения равны
Надо попробовать паузу перед "if (lastresult==strKopeyka)" поставить? Хотя, нет, не поможет
В общем, ничего не решает этот вариант
Я не совсем понимаю (или совсем не понимаю), что делает эта часть "if (lastresult==strKopeyka)" и что делает "else {lastresult=strKopeyka;}" эта?
Если в "if (lastresult==strKopeyka)" присваивается значение, то обе части всегда будут равны, так как значение присваивается одновременно с считыванием
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
что делает эта часть "if (lastresult==strKopeyka)"
Сравнивает.
и что делает "else {lastresult=strKopeyka;}" эта?
Присваивает. При условии, что прошлое и текущее взятое значение не совпадают.
Сейчас всё время выходит по "else {lastresult=strKopeyka;}", то есть всегда 2 значения равны
Если выходит по else, значит что 2 значения неравны. Они отличаются друг от друга. Иначе выводилось бы сообщение "Ничего не изменилось". Все же логично.

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

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Сравнивает.
Присваивает. При условии, что прошлое и текущее взятое значение не совпадают..
Спасибо, понял

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

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

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

Спасибо большое за помощь, буду дальше тестить
 

ibred

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

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Работает, даже если перестало меняться на 2-м или другом уровне цикла.
То, что надо
Null я вставил ещё раньше, увидев, что всё работает
Спасибо за помощь!
 

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