Умный ожидатель



  • Название: waitinger;
    Версия: 1.0;
    Данные: waitinger.zip
    Согласие на добавление модуля в BAS: да;
    Описание:

    • Кратко: ожидает появление хотя бы одного элемента из 20 возможных. Можно задавать поиск по CSS, XPATH, MATCH и base64.

    • Возможности модуля:
      а) ждать появления на странице одного из 20 элементов разных типов (СSS, base64 и т.д.);
      г) задавать таймаут для осуществления вышеуказанных действий;
      д) задавать простые действия при обнаружении элемента (кликнуть, двигать мышь над элементом, очистить поле)

    • Работа с результатом: Модуль возвращает переменную [[ELEM]] в виде объекта, где содержится информация:
      1) [[ELEM]].timeout - булево значение (true или false), сигнализирующее о срабатывании таймаута и об отсутствии на странице заданных элементов. Таймаут не выдаёт дефолтную ошибку кубика и не прерывает скрипт. Для того, чтобы проверить, сработал ли таймаут, просто вставьте конструкцию [[ELEM]].timeout в кубик IF.
      2) [[ELEM]].found - первый найденный элемент, возвращает либо undefined (сработал таймаут или элемента нет на странице), либо строку с селектором;
      3) [[ELEM]].bool[N] - где N - порядковый номер. Возращает либо true, либо false. Позволяет проверить найден ли указанный в модуле элемент под определенным номером. Например, [[ELEM]].bool[5] вернёт true или false для 5 элемента, который был вбит для поиска в данную функцию. Помните, что элемент может иметь значение false, даже если он присутствует на странице, это происходит из-за того, что элемент порядковым числом выше был найден первее, а модуль останавливает работу, как только найдет первый попавшийся элемент;
      4) [[ELEM]].bool.nN - где N - порядковый номер. Это аналог предыдущего написания. Например, [[ELEM]].bool.n5 вернёт true или false для 5 элемента;
      5) [[ELEM]].val[5] или [[ELEM]].val.n5 - значение 5 элемента, введенного пользователем для поиска, вместо "5" подставьте любую другую интересующую цифру.

    • Особенности работы модуля:

    1. Модуль прерывает свое выполнения как только обнаружит первый попавшийся элемент;
    2. Модуль проходится в стандартном порядке по элементам от 1 до 20. Элементы так же могут быть указаны в разном порядке, не обязательно начиная с первого;
    3. Обязательно в незаполняемых полях элементов оставлять NULL. Скрипт всё равно не даёт оставлять поле пустым (старожилы, подскажите, как исправить), если вы вобьёте туда что-то другое за исключением селекторов, то алгоритм решит, что это base64, а BAS реагирует крайне негативно на некорректный base :)
    4. По умолчанию таймаут указан 0, что означает бесконечный поиск, но я по разумным причинам не рекомендую так выстраивать логику поиска, впрочем, это вы уже решите сами;
    5. Поиск по base64 имеет дефолтные параметры: не скролит страницу и выставляет индекс похожести на 80.

    Ver. 2.0



  • Спасибо за модуль. Теперь нет необходимости писать трудночитаемый Xpath для множества элементов.



  • Интересная штука. А можно пример применения?



  • А разве стандартное действие проверить существование элемента на странице не позволяет указывать timeout ?



  • @gomeapat said in Умный ожидатель:

    А разве стандартное действие проверить существование элемента на странице не позволяет указывать timeout ?

    нет, ожидание элемента позволяет



  • @olegtut said in Умный ожидатель:

    Обязательно в незаполняемых полях элементов оставлять NULL. Скрипт всё равно не даёт оставлять поле пустым (старожилы, подскажите, как исправить),

    Проверка в файлах ..._select.js



  • @Antonio said in Умный ожидатель:

    Интересная штука. А можно пример применения?

    Ну к примеру, мы ждем после ввода пароля появления либо капчи, либо подтверждения мыла, либо телефона, либо что акк заблочен и т.д. Чтобы перейти к следующему действию после ввода пароля, надо дождаться одно из этих действий. И тут у нас два варианта стандартных действий:

    1. Выставить задержку "спать", чтобы подгрузился один из 10 (к примеру) этих элементов. Но нет гарантии, что вы угадаете время, и вообще этот метод для плохих скриптов. Умельцы вообще не юзают "спать".
    2. В скрипте пришлось бы организовать бесконечный цикл, который каждый раз проверяет все 10 элементов на появление. Код становится громоздким и не очень красивым.
      Для таких целей придуман модуль, который всего за один кубик кода будет ждать появление одного из 20 возможных элементов.
      Где можно применять такой модуль? Чаще всего в сервисах, где есть нелинейная структура вывода html. Например, авторизация вк. В зависимости от того, насколько чист ваш браузер, вк после ввода пароля покажет вам либо капчу, либо что ваш акк заморожен, либо стартовую страницу сайта. После ввода пароля загоняем в модуль элемент с капчей, элемент о заморозке акка, элемент стартовой страницы и скрипт сам будет ждать, пока что-нибудь из этого не появится.


  • @olegtut , потом получаем из модуля значение, какой именно элемент появился и уже через if какие-то действия выполняем?



  • do you have a chance to add English to this



  • @Antonio said in Умный ожидатель:

    @olegtut , потом получаем из модуля значение, какой именно элемент появился и уже через if какие-то действия выполняем?

    Всё верно.



  • В качестве пожелания на будущие апдейты модуля:
    если это возможно, добавить количество найденных элементов в интерфейс. По аналогии с "Ждать появления элемента".
    Такой счетчик сильно облегчает написание селектора.



  • @olegtut Начну с мелких придирок :D.

    • Название всех модулей BAS начинаются с заглавной буквы

    9a0c9c95-dc8b-4759-8330-b9cc78d8ac6f-изображение.png

    • Название действия на английской локализации названо через нижнее подчёркивание "waiting_for_one"

    e7987b29-dbc3-4cbc-9b30-9108daf8861a-изображение.png

    • Описание первых двух полей действия написаны капсом

    7afd6035-118f-453e-a984-a2d959ce1c5a-изображение.png

    • Отсутствует английское описание действия и его полей

    f633735e-6907-4eb6-9c40-05839a0747f4-изображение.png

    • Отсутствует описание для полей селекторов элементов

    06546221-0321-4856-bb95-1860d559ed1b-изображение.png

    • Описание действия нужно дополнить более подробными примерами использования этого действия (например с тем, как использовать итоговый объект)

    Теперь к более серьёзным замечаниям:

    • Действие без селекторов намертво зависает, а должно выдавать ошибку при попытке сохранить такое действие

    support823.gif

    • Вместо кучи непонятных инпутов с текстом NULL лучше создать один, который принимает массив селекторов (ну или строку с разделителем)

    • Судя по коду модуля вы его создали из функции BAS. Можете приложить проект на основании которого создали модуль? Дело в том, что в коде есть не совсем понятные места, например зачем выходить из цикла "while" меткой?

    d9b494ec-21d2-4f61-8a27-eda963012354-изображение.png

    • Опцию "ДЕЙСТВИЯ ПРИ ОБНАРУЖЕНИИ ЭЛЕМЕНТА" лучше убрать в принципе, так как действие призвано ожидать элемент, а не взаимодействовать с ним. Для удобства лучше вывести селектор, на котором сработало действие в переменную результата выполнения.

    • Если же решишь оставить опцию "ДЕЙСТВИЯ ПРИ ОБНАРУЖЕНИИ ЭЛЕМЕНТА", то лучше использовать выпадающий список с вариантами действия, чем выбор цифрами. В существующих модулях можно подсмотреть пример использования



  • @Fox Спасибо, принято. Как будет время поправлю.

    Описание первых двух полей действия написаны капсом

    Не планировал добавлять английскую локализацию.

    Отсутствует описание для полей селекторов элементов

    Ну тут тогда на всех 20-ти придется прописывать :)

    Вместо кучи непонятных инпутов с текстом NULL лучше создать один, который принимает массив селекторов (ну или строку с разделителем)

    Я думал над этим, но тут есть несколько камней преткновения:

    1. Начинающие пользователи с трудом понимают, что такое переменная и куда тыкнуть кнопочку, а уж что такое массив и как его организовать больше чем это позволено сделать в стандартном действии "список" (3 возможных поля)... Тут как минимум уже необходимо знать основы js.
    2. Это не всегда самому сподручно. Если элементов много, то отдельно через js необходимо создавать массив. А это плюс еще один дополнительный кубик перед модулем в скрипте.
      Но с другой стороны, массив визуально выглядит минималистичнее. Пока не определился...

    Судя по коду модуля вы его создали из функции BAS.

    Так и есть. Я обнаружил, что стандартными действиями реализовать задуманную логику невозможно, либо громоздко, поэтому юзал еще и функции БАС.

    зачем выходить из цикла "while" меткой

    Я организовал вложенный цикл, просто при помощи одного break там не выйти.

    Можете приложить проект на основании которого создали модуль?

    Конечно. Вот он: modules v2.xml



  • Эту систему очень сложно понять. Я надеюсь, что придет объяснение на английском. Любое видео нужно. Я не мог добавить его в свое приложение: /



  • Спасибо. Удобный и хорошечный модуль.



  • @olegtut планируете какие-либо обновления модуля? Очень полезная штука



  • Делал для себя похожее, только без return
    Ждал 1 элемент
    Хорошо бы добавить время сна после нахождения элемента, но по умолчанию 0
    А вот "ДЕЙСТВИЯ ПРИ ОБНАРУЖЕНИИ ЭЛЕМЕНТА" я позаимствую)



  • @olegtut
    Попробовал модуль, интересная задумка, но не хватает некоторых функций, поэтому оказался для меня не полезным.

    1. Параметр "Таймаут" не работает. Задаешь сколько угодно секунд, он отрабатывает все равно 90 секунд.
    2. Так же не хватает функции эмуляции "Тач-событий", а не только мыши.
    3. Плюс как сказал @mansory333 было бы классно задавать паузу (или чтение) после нахождения элемента.
      Тогда один кубик решал бы почти все задачи. А то сейчас оформляя все через IF и For выглядит все некрасиво :(


  • @Antonz
    Планирую. Для себя уже сделал другую версию, но всё еще не найду время выкатить сюда :)



  • Обновил модуль до второй версии.


Log in to reply