Не работает метод в общем коде

Midnight

Client
Регистрация
28.02.2016
Сообщения
310
Благодарностей
179
Баллы
43
Написал простенький метод для чека элемента на странице
C#:
public class element
{
    public static void check(IZennoPosterProjectModel project, Instance instance, ZennoLab.CommandCenter.HtmlElement he, int time, out bool element_sw)
    {
        element_sw = false;
        for(int i=0; i < time; i++)
        {
            if (!he.IsVoid)
            {
                element_sw = true;
                break;
            }
            System.Threading.Thread.Sleep(1 * 1000);
        }
    }
}
Вызываю так
C#:
ZennoLab.CommandCenter.HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("button", "innerhtml", "ОК", "regexp", 0);
element.check(project, instance, he, 15, out bool element_sw);
if (!element_sw) return -1;
Проблема в том, если все делать пошагово - загрузить страницу и потом запустить этот код, то элемент успешно ищется и все ок. Но если запустить код в момент загрузки страницы элемент не ищется, даже после того как страница полностью прогрузится. То есть цикл в продолжает работать, но нужного элемента не видит. С чем это связано?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 710
Баллы
113
потому что поиск элемента у тебя только один раз происходит в начале кода. если не найдет в начале, то в цикле будет постоянно опрашивать пустой объект.
для поиска элемента, he надо определять внутри цикла, тогда будет динамичный поиск, а не статичный.
 

Midnight

Client
Регистрация
28.02.2016
Сообщения
310
Благодарностей
179
Баллы
43
потому что поиск элемента у тебя только один раз происходит в начале кода. если не найдет в начале, то в цикле будет постоянно опрашивать пустой объект.
для поиска элемента, he надо определять внутри цикла, тогда будет динамичный поиск, а не статичный.
Поместил
C#:
he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("button", "innerhtml", "ОК", "regexp", 0);
внутрь цикла, так заработало, да. Но в таком случае пропадает весь смысл в общем коде, так каждый элемент надо прописывать
 

volody00

Client
Регистрация
06.09.2016
Сообщения
900
Благодарностей
925
Баллы
93
Переходи на поиск по xpath и в качестве параметра в методе передавай xpath путь, а не htmlelement
 
  • Спасибо
Реакции: Midnight

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 710
Баллы
113
Поместил
C#:
he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("button", "innerhtml", "ОК", "regexp", 0);
внутрь цикла, так заработало, да. Но в таком случае пропадает весь смысл в общем коде, так каждый элемент надо прописывать
Нужные параметры передавай в функцию и используй в поиске
 
  • Спасибо
Реакции: Midnight

Midnight

Client
Регистрация
28.02.2016
Сообщения
310
Благодарностей
179
Баллы
43
Нужные параметры передавай в функцию и используй в поиске
То есть так получается надо?
C#:
string[] array = {"0", "0", "button", "innerhtml", "OK", "regexp", "0"};
element.check(project, instance, array, 15, out bool element_sw);

public static void check(IZennoPosterProjectModel project, Instance instance, string[] array, int time, out bool element_sw)
{
    element_sw = false;
    for(int i=0; i < time; i++)
    {
        ZennoLab.CommandCenter.HtmlElement he = instance.ActiveTab.GetDocumentByAddress(array[0]).FindElementByTag("form", Convert.ToInt32(array[1])).FindChildByAttribute(array[2], array[3], array[4], array[5], Convert.ToInt32(array[6]));
        if (!he.IsVoid)
        {
            element_sw = true;
            break;
        }
        System.Threading.Thread.Sleep(1 * 1000);
    }
}
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 710
Баллы
113
То есть так получается надо?
C#:
string[] array = {"0", "0", "button", "innerhtml", "OK", "regexp", "0"};
element.check(project, instance, array, 15, out bool element_sw);

public static void check(IZennoPosterProjectModel project, Instance instance, string[] array, int time, out bool element_sw)
{
    element_sw = false;
    for(int i=0; i < time; i++)
    {
        ZennoLab.CommandCenter.HtmlElement he = instance.ActiveTab.GetDocumentByAddress(array[0]).FindElementByTag("form", Convert.ToInt32(array[1])).FindChildByAttribute(array[2], array[3], array[4], array[5], Convert.ToInt32(array[6]));
        if (!he.IsVoid)
        {
            element_sw = true;
            break;
        }
        System.Threading.Thread.Sleep(1 * 1000);
    }
}
ну можно и так... но я предпочитаю создавать понятный класс с понятными полями и передавать целостный объект.
 

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