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

  • Автор темы Автор темы Midnight
  • Дата начала Дата начала

Midnight

Client
Регистрация
28.02.2016
Сообщения
351
Реакции
225
Баллы
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;

Проблема в том, если все делать пошагово - загрузить страницу и потом запустить этот код, то элемент успешно ищется и все ок. Но если запустить код в момент загрузки страницы элемент не ищется, даже после того как страница полностью прогрузится. То есть цикл в продолжает работать, но нужного элемента не видит. С чем это связано?
 
потому что поиск элемента у тебя только один раз происходит в начале кода. если не найдет в начале, то в цикле будет постоянно опрашивать пустой объект.
для поиска элемента, he надо определять внутри цикла, тогда будет динамичный поиск, а не статичный.
 
потому что поиск элемента у тебя только один раз происходит в начале кода. если не найдет в начале, то в цикле будет постоянно опрашивать пустой объект.
для поиска элемента, he надо определять внутри цикла, тогда будет динамичный поиск, а не статичный.
Поместил
C#:
Развернуть Свернуть Копировать
he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("button", "innerhtml", "ОК", "regexp", 0);
внутрь цикла, так заработало, да. Но в таком случае пропадает весь смысл в общем коде, так каждый элемент надо прописывать
 
Поместил
C#:
Развернуть Свернуть Копировать
he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("button", "innerhtml", "ОК", "regexp", 0);
внутрь цикла, так заработало, да. Но в таком случае пропадает весь смысл в общем коде, так каждый элемент надо прописывать
Нужные параметры передавай в функцию и используй в поиске
 
  • Оценить
Реакции: Midnight
Нужные параметры передавай в функцию и используй в поиске
То есть так получается надо?
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);
    }
}
 
То есть так получается надо?
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);
    }
}
ну можно и так... но я предпочитаю создавать понятный класс с понятными полями и передавать целостный объект.
 

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