Сниппет ожидание элементов

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
397
Благодарностей
91
Баллы
28
Есть сниппет ожидание одного элемента
C#:
HtmlElement he;
for(int i=0;i<20;i++)
{
    he = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0);
    if(!he.IsVoid)
    {
        break;
    }
    System.Threading.Thread.Sleep(1500);
}
Можно ли сделать ожидание одного из трех элементов? т.е. если появится один из трех элементов, то заканчивать выполнение с передачей в переменную зеннопостера какой именно элемент появился
 
  • Спасибо
Реакции: djaga

bitardenko

Client
Регистрация
27.12.2020
Сообщения
91
Благодарностей
73
Баллы
18
C#:
HtmlElement he;

for(int i=0;i<20;i++)

{

    he = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0);

    if(he.IsVoid)
    {
        he = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0);
        if(he.IsVoid)
        {
            he = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0);
            if(he.IsVoid)
            {
             
            }
            else
            {
                peremennaya = 2;
                break;
            }
        }
        else
        {
            peremennaya = 1;
            break;
        }
    }
    else
    {
        peremennaya = 0;
        break;
    }



    System.Threading.Thread.Sleep(1500);

}
Может быть так
 
  • Спасибо
Реакции: spbalexpiter

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Есть сниппет ожидание одного элемента
C#:
HtmlElement he;
for(int i=0;i<20;i++)
{
    he = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0);
    if(!he.IsVoid)
    {
        break;
    }
    System.Threading.Thread.Sleep(1500);
}
Можно ли сделать ожидание одного из трех элементов? т.е. если появится один из трех элементов, то заканчивать выполнение с передачей в переменную зеннопостера какой именно элемент появился
или так можно короче:
C#:
for (var i = 0; i < 20; i++)
{
    var he0 = instance.ActiveTab.FindElementByAttribute("button", "innertext", "Log\\ out", "regexp", 0); // путь 1
    var he1 = instance.ActiveTab.FindElementByAttribute("button", "innertext", "Log\\ out", "regexp", 0); // путь 2
    var he2 = instance.ActiveTab.FindElementByAttribute("button", "innertext", "Log\\ out", "regexp", 0); // путь 3
    if (!he0.IsVoid || !he1.IsVoid || !he2.IsVoid) break;
    Thread.Sleep(1500);
}
upd: поправил опечатку
 
Последнее редактирование:

viol2021

Client
Регистрация
12.01.2021
Сообщения
482
Благодарностей
180
Баллы
43
или так можно короче:
C#:
HtmlElement he;
for(int i=0;i<20;i++)
{
    he0 = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0); // путь 1
    he1 = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0); // путь 2
    he2 = instance.ActiveTab.FindElementByAttribute("button","innertext","Log\\ out","regexp",0); // путь 3
    if(!he0.IsVoid || !he1.IsVoid || !he2.IsVoid )
    {
        break;
    }
    System.Threading.Thread.Sleep(1500);
}
Если короче, то так

C#:
  Dictionary<string, string> Data = new Dictionary<string, string>
  {
     ["he0"] = "Log\\ out",// путь 1
     ["he1"] = "Log\\ out",// путь 2
     ["he2"] = "Log\\ out"// путь 3
  
  };

  for(int i = 0; i < 20; i ++)
  {
      foreach(var dt in Data)
    {
        if(!instance.ActiveTab.FindElementByAttribute("button","innertext",dt.Value,"regexp",0).IsVoid)
        {
            return dt.Key;
            break;
        }
    }
Thread.Sleep(1500);
  }
 
Последнее редактирование:
  • Спасибо
Реакции: nexx1 и spbalexpiter

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Я тут столкнулся с подобной задачей, но нужно было дальше обрабатывать найденные элементы.
Так что решил немного по другому. Поделюсь здесь, может кому будет интересно. Жмите "Спасибо", если полезно. :dk:

Поиск элементов на странице с возможностью вернуть коллекцию найденных:
for (var i = 0; i < 20; i++)
{
    var element = (from el in new[] { // ↓ сколько угодно вариантов поиска элемента на странице (по атрибуту, xPath)
                       instance.ActiveTab.FindElementByXPath("//a[starts-with(@class,'home-link2')]", 0),
                       instance.ActiveTab.FindElementByAttribute("a", "class", "headline__personal-enter", "regexp", 0),
                       instance.ActiveTab.FindElementByAttribute("a", "class", "informers3__all", "regexp", 0),
                   } where !el.IsVoid select el).ToList(); // собирает список найденных элементов. *Дальше можно будет работать напрямую со списком.
    if (element.Any()) return element.First().OuterHtml; // для примера возвращает OuterHtml первого
    Thread.Sleep(1500);
}
throw new Exception("Элементы не найдены"); // если не найдено, уйдет по красной.
Шаблон для примера ↓
 

Вложения

Zenokiller

Client
Регистрация
06.01.2021
Сообщения
34
Благодарностей
15
Баллы
8
*Дальше можно будет работать напрямую со списком.
Спасибо за приложенный пример поиска элементов. Можно привести пример использования списка найденных элементов? Ну например, чтобы кликнуть по найденному элементу, который находиться в этом списке.
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Спасибо за приложенный пример поиска элементов. Можно привести пример использования списка найденных элементов? Ну например, чтобы кликнуть по найденному элементу, который находиться в этом списке.
Привет. Извини, что так долго отвечал.
Если нужно кликнуть на первый найденный ↓. Очень просто.)
Клик на первый найденный из списка:
for (var i = 0; i < 20; i++)
{
    var element = (from el in new[] { // ↓ сколько угодно вариантов поиска элемента на странице (по атрибуту, xPath)
                       instance.ActiveTab.FindElementByXPath("//a[starts-with(@class,'home-link2')]", 0),
                       instance.ActiveTab.FindElementByAttribute("a", "class", "headline__personal-enter", "regexp", 0),
                       instance.ActiveTab.FindElementByAttribute("a", "class", "informers3__all", "regexp", 0),
                   } where !el.IsVoid select el).ToList(); // собирает список найденных элементов. *Дальше можно будет работать напрямую со списком.
    if (element.Any())
    {
        element.First().Click(); // пример клика на первый найденный элемент
        break;
    }

    Thread.Sleep(1500);
}
throw new Exception("Элементы не найдены"); // если не найдено, уйдет по красной.
 
  • Спасибо
Реакции: isaacfks, Demiz и Sho

DocSpoc

Client
Регистрация
04.01.2016
Сообщения
285
Благодарностей
169
Баллы
43
Привет. Извини, что так долго отвечал.
Если нужно кликнуть на первый найденный ↓. Очень просто.)
Клик на первый найденный из списка:
for (var i = 0; i < 20; i++)
{
    var element = (from el in new[] { // ↓ сколько угодно вариантов поиска элемента на странице (по атрибуту, xPath)
                       instance.ActiveTab.FindElementByXPath("//a[starts-with(@class,'home-link2')]", 0),
                       instance.ActiveTab.FindElementByAttribute("a", "class", "headline__personal-enter", "regexp", 0),
                       instance.ActiveTab.FindElementByAttribute("a", "class", "informers3__all", "regexp", 0),
                   } where !el.IsVoid select el).ToList(); // собирает список найденных элементов. *Дальше можно будет работать напрямую со списком.
    if (element.Any())
    {
        element.First().Click(); // пример клика на первый найденный элемент
        break;
    }

    Thread.Sleep(1500);
}
throw new Exception("Элементы не найдены"); // если не найдено, уйдет по красной.
Привет.
А как найти элемент если нужно что бы обязательно два атрибута совпали? Но не первый попавшийся. А с конкретным номером. Номер перебирать в цикле и если у него оба атрибута совпали, то кликнут, если нет, то пропуск.
На основе твоего сниппета сделал:

C#:
bool res = false;
var rnd = new Random(); //переменная для рандома
var tab = instance.ActiveTab;
int num = int.Parse(project.Variables["num_like"].Value);
    
HtmlElement he1 = tab.FindElementByAttribute("svg", "innerhtml", "Like", "regexp", num);
HtmlElement he2 = tab.FindElementByAttribute("svg", "height", "24", "regexp", num);

     if(he1.IsVoid && he2.IsVoid)

    {
        res = true;
        tab.Touch.SwipeIntoView(he1); //свайпим экран, чтобы увидеть ссылку
        while (tab.IsBusy)
            {
                Thread.Sleep(100); //ждем окончания свайпа
            }
        Thread.Sleep(rnd.Next(300,1500)); //еще ждем
        tab.Touch.Touch(he1); //тап по ссылке
        new Exception("нашел");
     }


if (res) throw new Exception("Не смог найти оба элемента. Выход по красной");
Вот тут у меня в num_like передается переменная из цикла. Но что-то не срабатывает((
 
  • Спасибо
Реакции: djaga

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Привет.
А как найти элемент если нужно что бы обязательно два атрибута совпали? Но не первый попавшийся. А с конкретным номером. Номер перебирать в цикле и если у него оба атрибута совпали, то кликнут, если нет, то пропуск.
На основе твоего сниппета сделал:

C#:
bool res = false;
var rnd = new Random(); //переменная для рандома
var tab = instance.ActiveTab;
int num = int.Parse(project.Variables["num_like"].Value);
   
HtmlElement he1 = tab.FindElementByAttribute("svg", "innerhtml", "Like", "regexp", num);
HtmlElement he2 = tab.FindElementByAttribute("svg", "height", "24", "regexp", num);

     if(he1.IsVoid && he2.IsVoid)

    {
        res = true;
        tab.Touch.SwipeIntoView(he1); //свайпим экран, чтобы увидеть ссылку
        while (tab.IsBusy)
            {
                Thread.Sleep(100); //ждем окончания свайпа
            }
        Thread.Sleep(rnd.Next(300,1500)); //еще ждем
        tab.Touch.Touch(he1); //тап по ссылке
        new Exception("нашел");
     }


if (res) throw new Exception("Не смог найти оба элемента. Выход по красной");
Вот тут у меня в num_like передается переменная из цикла. Но что-то не срабатывает((
Привет. Данный код без отладки, так как нет примера.

Визуально исправил все недочеты и добавил вывод в лог, чтобы вы могли отработать поиск элементов.
Цикл рассчитан на 30 итераций, а значит на 30 возможных элементов.

Попробуйте так:
Поиск двух элементов на странице:
var rnd = new Random(); //переменная для рандома
var tab = instance.ActiveTab;
int num = 1; // начальный элемент

do
{
    HtmlElement he1 = tab.FindElementByAttribute("svg", "innerhtml", "Like", "regexp", num);
    HtmlElement he2 = tab.FindElementByAttribute("svg", "height", "24", "regexp", num);

    if (!he1.IsVoid) project.SendInfoToLog("he1 найден"); // удалить. Нужно для проверки поиска элементов
    if (!he2.IsVoid) project.SendInfoToLog("he2 найден"); // удалить. Нужно для проверки поиска элементов
    
    if (!he1.IsVoid && !he2.IsVoid)
    {
        tab.Touch.SwipeIntoView(he1); // свайп экрана, чтобы увидеть ссылку
        while (tab.IsBusy)
            Thread.Sleep(100); // ждем окончания свайпа

        Thread.Sleep(rnd.Next(300, 1500)); // еще ждем
        tab.Touch.Touch(he1); // тап по ссылке

        return "Нашел";
    }

    Thread.Sleep(100);
    num++;
} while (num <= 30);

throw new Exception("Не смог найти оба элемента. Выход по красной");
 

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