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

Igorii

Client
Регистрация
21.02.2015
Сообщения
372
Благодарностей
300
Баллы
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
Сообщения
372
Благодарностей
300
Баллы
63
Подниму, может кто из Гуру заметит). Нужный снипет для всех будет
 

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
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
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
394
Баллы
63
Подниму, может кто из Гуру заметит). Нужный снипет для всех будет
да не будут гуру ничего изобретать , когда на форуме уже есть куча готовых вариантов. надо только поиском воспользоваться по форуму ;-)
вот например https://zennolab.com/discussion/threads/povtorit-kubik-proekta-pri-oshibke-cherez-n-sekund.91361/post-611227
то что ты хотел ?
 
  • Спасибо
Реакции: Igorii

Igorii

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

Igorii

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

volody00

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

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
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
Сообщения
372
Благодарностей
300
Баллы
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)