C# Нужна помощь

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Привет! У меня реализовано ожидание элемента с помощью C# кубика:

Код:
var tab = instance.ActiveTab;
for (int i=0; i<60; i++)
{
    var he = tab.FindElementByAttribute("button", "ng-click", "doImport()", "regexp", 0);
    if (he.IsVoid)
        {
            tab.Stop();
            return "ok";
        }
    System.Threading.Thread.Sleep(1000);
}
Получается если время ожидание вышло, идёт дальнейшие выполнения шаблона, как сделать так что бы по истечении времени ожидания элемента кубик отдавал действие по красной линии? То есть если элемент не найден за указанный промежуток времени то делать исключение.
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Думал добавить после цикла:

Код:
if (!he.IsVoid) {
    return "error";   
}
Но проект выполняется с ошибкой.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Добавьте в конец:
C#:
return null;
Думал добавить после цикла:

Код:
if (!he.IsVoid) {
    return "error"; 
}
Но проект выполняется с ошибкой.
Потому что переменная he объявлена внутри цикла, а вызываете Вы её вне этой области.
 
  • Спасибо
Реакции: Martin Rigs

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

__Maks

Client
Регистрация
03.10.2016
Сообщения
353
Благодарностей
74
Баллы
28
у вас есть ошибка в коде:
вьі вне цьікла оглавляете переменную tab (что, в общем, кажется верньім)
А потом ждете появления елемента. Но в переменной так у вас буде активная вкладка на момент записи ее в переменную tab.
(то есть представьте что у вас страница еще не отобразилась, вьі ее записали в переменную tab, а потом в цикле на етой пустой странице, которая не отобразилась, ищите елемент). а он никогда не появится, поскольку вкладка то обновиться, то в переменной останеться инстанс еще той пустой вкладки. когда еще ничего не бьіло.

Потому. Вам нужно в цьікле прописьівать не tab.FindEleme.... а instance.ActiveTab.FindElem (то есть каждьій раз у вас будет идти поиск по новому состоянию вкладки.
Результат должен бьіть таким:


Код:
var tab = instance.ActiveTab;
for (int i=0; i<60; i++)
{
    var he = instance.ActiveTab.FindElementByAttribute("button", "ng-click", "doImport()", "regexp", 0);
    if (he.IsVoid)
        {
            tab.Stop();
            return "ok";// ну или return null; ето как хотите уже
        }
    System.Threading.Thread.Sleep(1000);
}
Так же у вас написано if(he.isVoid) ето означает "Если елемента нету" (а его в первьі момент запуска кода может и не бьіть) оно сразу отдаст return null и вьі пойдете по красной линии, хотя елемент, припустим, через секунду мог появиться.
Потому лучше поставить паузу в начале.

НО не все так просто. Идем дальше.
ДАже если мьі поставим паузу в 1 сек в начале - не факт, чо за ету секунду появиться елемент.
Елемента, представим, не появился - мьі делаем проверку if(елемента нету) - а его ведь за секунду может и не бьіть - тогда идем по красной линии.
что же получается? получается, что у вас етих 10 сек ни к чему.

И, НАКОНЕЦ, РЕШЕНИЕ))))

Код:
var tab = instance.ActiveTab;
for (int i=0; i<60; i++)
{
    var he = instance.ActiveTab.FindElementByAttribute("button", "ng-click", "doImport()", "regexp", 0);
    if (!he.IsVoid)//мьі поставили знак восклицния, что означает НЕ/ теперь код звучит как: если елемента нету, то
            System.Threading.Thread.Sleep(1000);//ждем 1 секунду
   else
   break;// а если есть - вьіходим из цикла и далее исполняем код.
if(i = 59)//если мьі дошли до 59 секунд - идем по крайней линии
return null;


}
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
у вас есть ошибка в коде:
вьі вне цьікла оглавляете переменную tab (что, в общем, кажется верньім)
А потом ждете появления елемента. Но в переменной так у вас буде активная вкладка на момент записи ее в переменную tab.
(то есть представьте что у вас страница еще не отобразилась, вьі ее записали в переменную tab, а потом в цикле на етой пустой странице, которая не отобразилась, ищите елемент). а он никогда не появится, поскольку вкладка то обновиться, то в переменной останеться инстанс еще той пустой вкладки. когда еще ничего не бьіло.

Потому. Вам нужно в цьікле прописьівать не tab.FindEleme.... а instance.ActiveTab.FindElem (то есть каждьій раз у вас будет идти поиск по новому состоянию вкладки.
Результат должен бьіть таким:


Код:
var tab = instance.ActiveTab;
for (int i=0; i<60; i++)
{
    var he = instance.ActiveTab.FindElementByAttribute("button", "ng-click", "doImport()", "regexp", 0);
    if (he.IsVoid)
        {
            tab.Stop();
            return "ok";// ну или return null; ето как хотите уже
        }
    System.Threading.Thread.Sleep(1000);
}
Так же у вас написано if(he.isVoid) ето означает "Если елемента нету" (а его в первьі момент запуска кода может и не бьіть) оно сразу отдаст return null и вьі пойдете по красной линии, хотя елемент, припустим, через секунду мог появиться.
Потому лучше поставить паузу в начале.

НО не все так просто. Идем дальше.
ДАже если мьі поставим паузу в 1 сек в начале - не факт, чо за ету секунду появиться елемент.
Елемента, представим, не появился - мьі делаем проверку if(елемента нету) - а его ведь за секунду может и не бьіть - тогда идем по красной линии.
что же получается? получается, что у вас етих 10 сек ни к чему.

И, НАКОНЕЦ, РЕШЕНИЕ))))

Код:
var tab = instance.ActiveTab;
for (int i=0; i<60; i++)
{
    var he = instance.ActiveTab.FindElementByAttribute("button", "ng-click", "doImport()", "regexp", 0);
    if (!he.IsVoid)//мьі поставили знак восклицния, что означает НЕ/ теперь код звучит как: если елемента нету, то
            System.Threading.Thread.Sleep(1000);//ждем 1 секунду
   else
   break;// а если есть - вьіходим из цикла и далее исполняем код.
if(i = 59)//если мьі дошли до 59 секунд - идем по крайней линии
return null;


}
Там всё было правильно. В c# переменной мы можем присваивать значение, а можем передавать объекты. В первом случае переменная будет абсолютно независима со своей копией переданного значения внутри. instance.ActiveTab - это объект. Передавая переменной объект, мы не копируем его, мы передаём ссылку на него. Таким образом переменная будет указывать на него, у неё не будет собственного значения. Она будет показывать значение этого обекта, если мы меняем её - будет меняться этот объект. Переменная становится посредником, она не получает копию объекта
 

__Maks

Client
Регистрация
03.10.2016
Сообщения
353
Благодарностей
74
Баллы
28
Там всё было правильно. В c# переменной мы можем присваивать значение, а можем передавать объекты. В первом случае переменная будет абсолютно независима со своей копией переданного значения внутри. instance.ActiveTab - это объект. Передавая переменной объект, мы не копируем его, мы передаём ссылку на него. Таким образом переменная будет указывать на него, у неё не будет собственного значения. Она будет показывать значение этого обекта, если мы меняем её - будет меняться этот объект. Переменная становится посредником, она не получает копию объекта
Да, проверил. Вьі бьіли правьі. Передается обьект. Значит, наверное, когда-то бьіл проблема не в етом, что не находило елемент)

Но на счет he.isVoid то хоть верно)?
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Да, проверил. Вьі бьіли правьі. Передается обьект. Значит, наверное, когда-то бьіл проблема не в етом, что не находило елемент)

Но на счет he.isVoid то хоть верно)?
нет)
Совет был поместить ретур нул в самый конец, за пределы цикла. Таким образом он сработал бы при условии, что все итерации цикла пройдены и внутри не сработал ретурн ок
 

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