Ожидание видимого элемента

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
Друзья, помогите объединить два снипета. Первый код, ищет среди одинаковых элементов на странице, тот который видимый, и если находит, выходит по зелёной. Второй код, ждёт появления элемента в течении заданного времени, если не находит, выходит по красной. То есть нужно, что бы код в течении заданного времени, с какой-то периодичностью, проходился по всем найденным элементам (возможно и их отсутствие), ожидая появления видимого. Если в течении заданного времени не нашёл, то выходил по красной, если нашёл, то делал бы клик по найденному элементу и выводил в переменную его номер.
Первый код взят от сюда.

C#:
var tab = instance.ActiveTab;
//Ищем коллекцию элементов по заданным атрибутам
var col = tab.FindElementsByAttribute("div", "class", "uix", "regexp");
//Создаём результирующий элемент
var elResult = tab.FindElementByXPath("//sngvuyrbuy",0);
//Если в коллекции есть элементы
if (col.Count>0)
{
    //В цикле проверяем каждый элемент коллекции
    foreach (var el in col.Elements)
    {
        //Получаем значения topInBrowser и leftInBrowser
        int topInBrowser = int.Parse(el.GetAttribute("topInBrowser"));
        int leftInBrowser = int.Parse(el.GetAttribute("leftInBrowser"));
        //Если элемент видимый
        if (el.Height>0 && el.Width>0 && topInBrowser>=0 && leftInBrowser>=0)
        {
            //Присваиваем результирующему элементу текущий
            elResult = el;
            //Выходим из цикла проверки
            break;
        }
    }
}
//Проверяем, нашли ли нужный элемент
if (elResult.IsNull || elResult.IsVoid)
{
    throw new Exception("Видимый элемент по заданным атрибутам не найден, действие не выполнено!");
}
//Найдено
C#:
HtmlElement he;
int i = 0;
int timeout = 10;
// Ожидание появления
do
{
         he = instance.ActiveTab.FindElementByAttribute("div", "class", "uix", "regexp");
         Thread.Sleep(1000);
        i++;
} while (he.IsVoid && i < timeout);
if (he.IsVoid) throw new Exception("Не найдено");
//Найдено
 

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
Подниму, может кто из Гуру заметит). Нужный снипет для всех будет
 

volody00

Client
Регистрация
06.09.2016
Сообщения
794
Благодарностей
814
Баллы
93
попробуй так

C#:
for(int i=0;i<10;i++)
{
    //поиск по xpath
    var kol = instance.ActiveTab.FindElementsByXPath("//a");
    if(kol.Count == 0)
    {
        project.SendInfoToLog("ждем появления элементов");
        Thread.Sleep(1000);
        continue;
    }
    
    //проверка найденных на видимость
    foreach(var s in kol)
    {
        //клик по первому подходящему и выход
        if(s.Width > 0) //я проверяю ширину. можно и так int.Parse(el.GetAttribute("topInBrowser")) > 0
        {
            s.Click();
            return "";
        }
    }
}
throw new Exception("не нашли элемент");
 
  • Спасибо
Реакции: Igorii

Ахилес

Client
Регистрация
11.11.2020
Сообщения
870
Благодарностей
354
Баллы
63
Подниму, может кто из Гуру заметит). Нужный снипет для всех будет
да не будут гуру ничего изобретать , когда на форуме уже есть куча готовых вариантов. надо только поиском воспользоваться по форуму ;-)
вот например https://zennolab.com/discussion/threads/povtorit-kubik-proekta-pri-oshibke-cherez-n-sekund.91361/post-611227
то что ты хотел ?
 
  • Спасибо
Реакции: Igorii

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
@volody00, спасибо, работает! Только не пойму, что в return прописать, что бы номер видимого элемента выводился?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
794
Благодарностей
814
Баллы
93
  • Спасибо
Реакции: Igorii

volody00

Client
Регистрация
06.09.2016
Сообщения
794
Благодарностей
814
Баллы
93
C#:
for(int i=0;i<10;i++)

{

    //поиск по xpath

    var kol = instance.ActiveTab.FindElementsByXPath("//a");

    if(kol.Count == 0)

    {

        project.SendInfoToLog("ждем появления элементов");

        Thread.Sleep(1000);

        continue;

    }

    

    //проверка найденных на видимость
    int i=0;
    foreach(var s in kol)

    {

        //клик по первому подходящему и выход

        if(s.Width > 0) //я проверяю ширину. можно и так int.Parse(el.GetAttribute("topInBrowser")) > 0

        {

            s.Click();

            return i;

        }
        i++;
        

    }

}

throw new Exception("не нашли элемент");
Может быть так, но не проверял
 
  • Спасибо
Реакции: Igorii

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
Спасибо! Ошибку выдавал:
Компиляция кода Ошибка в действии "CS0136" "A local or parameter named 'i' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter". [Строка: 24; Cтолбец: 9]
Изменил имя переменной в 24 строке, вроде заработало, как надо!
Вот поправленный код:
C#:
for(int i=0;i<10;i++)

{

    //поиск по xpath

    var kol = instance.ActiveTab.FindElementsByAttribute("span", "innertext", "ZennoPoster", "regexp");

    if(kol.Count == 0)

    {

        project.SendInfoToLog("ждем появления элементов");

        Thread.Sleep(1000);

        continue;

    }

    

    //проверка найденных на видимость
    int n=0;
    foreach(var s in kol)

    {

        //клик по первому подходящему и выход

        if(s.Width > 0) //я проверяю ширину. можно и так int.Parse(el.GetAttribute("topInBrowser")) > 0

        {

            s.Click();

            return n;

        }
        i++;
        

    }

}

throw new Exception("не нашли элемент");
 

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