Продолжить цикл в зависимости от условий



  • @mihalych - да, ... этот вариант рассматривался мною в первую очередь - но хочется максимально имитировать реального пользователя дабы не тревожить ботов ok - а с теми у кого приглашение не доступно я и хочу ничего не делать закончить текущий виток цикла и продолжить цикл...



  • @Turutur после проверки "уже приглашен" сделай if приглашен==true, и внутри добавь continue. Эта команда закончит данную итерацию цикла, и начнет следующую



  • @DrPrime - тестил Continue в таком порядке if{{is_exist}}->log{{profile_id}}->Continue, но на этом цикл не заканчивается - а выполняются действия следующие ниже - вот и не могу понять в чем прокол(



  • @Turutur странно, дай пример скрипта с этим участком, может какая то ошибка



  • @DrPrime
    0_1479816694713_4_INVITE_MEMBERS_GROUP_OK.xml
    @DrPrime - я уже пробовал перезоздавать и эти действия - ничего не помогает - кстати оно срабатывало когда был немного другой алгоритм - но понять разницы не смог
    @support - пожалуйста помогите - почему в этом примере цикл не переходит на следующий виток?


  • administrators

    @Turutur Continue не будет работать если вы перемещали точку выполнения внутри цикла. В этом случае теряются данные о цикле. Если этого не делать, то вызов continue в вашем скрипте работает как надо.



  • @support здравствуйте - я пересоздал действия внутри цикла - continue срабатывает - но только в режиме отладки - в режиме запуска - поток прерывается С ОШИБКОЙ - пожалуйста посмотрите в чем дело - несколько раз пытался сделать - во время теста всегда одно и то же - Поток аварийно завершился с сообщением "Таймаут во время выполнения script for[documentRoot, css :nth-child(1) > .sel-single]"- я написал вам личным сообщением и скрипт прикрепил - пожалуйста посмотрите в чем дело...


  • administrators

    @Turutur Перед проверкой открывается форма, чтобы она открылась нужно время. Поставьте спать или ожидание этой формы.



  • @support я менял интервалы ожидания и 5000 и 10000 - это никак не влияет на работу скрипта - да и подгрузку формы с задержкой тоже не видно - не срабатывает continue((( - скрипт доходя до этого места просто зависает - а в режиме отладаки он работает замечательно!!! После вообще убрал действие спать и continue перестал сраабатывать даже в режиме отладки....
    Перезапустил скрипт - в режиме отладки - выполнил до действия проверки - затем пошагово и о чудо сработало - решил чтото не так делаю - начал все сначала - не срабатывает и все - пожалуйста укажите ошибку - какую форму ждать - почему срабатывает через раз или не срабатывает, как переорганизовать проверку, чтобы срабатывало?


  • administrators

    @Turutur У меня работает проверял несколько раз. Пришлите скрипт, после изменений, который не работает.

    Перезапустил скрипт - в режиме отладки - выполнил до действия проверки - затем пошагово и о чудо сработало - решил чтото не так делаю - начал все сначала - не срабатывает и все - пожалуйста укажите ошибку - какую форму ждать - почему срабатывает через раз или не срабатывает, как переорганизовать проверку, чтобы срабатывало?

    Нужно выставить сон перед открытием формы. В личке скрин.



  • @support - я не стал ждать ответа - реорганизовал проверку - и все сработало нормально - соответственно я что-то не так делал и наличие или отсутствие сна не решало роли - просто неправильно дела проверку - брал общие элементы фрейма, надличие и видимость которых практически всегда присутствовала на странице(
    Спасибо за помощь!



  • Столкнулся с проблемой в аналогичной задаче.
    Скрипт работает так: открывает основную ленту в твиттере и последовательно просматривает по очереди все посты. В каждом посте берется никнейм и сравнивается с белым списком. При совпадении скрипт делает лайк этому посту.
    Вот сам скрипт:
    0_1483990078471_Twrtter-like-0.2017.xml
    Проблема в том, что скрипт работает неустойчиво. Иногда выпадает с ошибкой сразу. Иногда успевает отработать 3 - 5 потоков, а затем выдает ошибку:

    Не удалось дождаться элемента {"raw":".tweet .stream-item-footer > .ProfileTweet-actionList > .ProfileTweet-action--favorite > .ProfileTweet-actionButton > .IconContainer","frames":[],"index":0}"
    
    Не удалось дождаться элемента {"raw":".tweet .ProfileTweet-actionList","frames":[],"index":1}
    
    Не удалось дождаться элемента {"raw":".tweet div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":29}
    
    Не удалось дождаться элемента {"raw":"div.tweet div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":1}
    
    Не удалось дождаться элемента {"raw":"div div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":26}
    
    Не удалось дождаться элемента {"raw":"div div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":234}
    
    Не удалось дождаться элемента {"raw":"div.tweet .stream-item-footer > .ProfileTweet-actionList > .ProfileTweet-action--favorite","frames":[],"index":30}
    
    Не удалось дождаться элемента {"raw":"div.tweet div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":1}
    
    Не удалось дождаться элемента {"raw":"div.tweet div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":55}
    
    Не удалось дождаться элемента {"raw":"div.tweet div.content > div.stream-item-footer > div.ProfileTweet-actionList","frames":[],"index":11}
    

    Это я пробовал менять селекторы и логику работы (про селекторы обсуждалось тут https://community.bablosoft.com/topic/866/разные-циклы-используют-одну-переменную-cycle_index/8#, вложенные цикли не используются, нашел другой способ), но устойчивой работы добиться не удалось. Из 5 запусков только один работает до конца, все остальные останавливаются с ошибкой.

    Посмотрите, пожалуйста, где у меня ошибка. Я сам не могу обнаружить.


  • administrators

    @servasw45 Проблема в том, что div.ProfileTweet-actionList может не существовать в некоторых твиттах.
    Нужно проверять его наличие на странице перед кликом.

    Но вместо ошибки скрипт может ставить лайки не тем, кто находятся в белом списке.
    Объясню. Запись .tweet .ProfileTweet-actionList<0> значит первый элемент .ProfileTweet-actionList родителем которого есть .tweet, но поскольку не каждый .tweet содержит .ProfileTweet-actionList, то счет может "сместиться".

    В следующей версии, которая выйдет очень скоро будет возможна такая запись

    .tweet <<0>> .ProfileTweet-actionList
    

    Что будет значить .ProfileTweet-actionList внутри первого .tweet

    Итак, что нужно сделать, чтобы все работало стабильно:

    1. Дождаться 16.8.0(завтра вечером предположительно)
    2. Заменить [[FOR_EACH_CSS]] .username<[[CYCLE_INDEX]]> на [[FOR_EACH_CSS]] <<[[CYCLE_INDEX]]>> .username и остальные похожие конструкции.
    3. Делать проверку на наличие .ProfileTweet-actionList перед кликом.


  • @support
    Спасибо, @support , жду.
    Пока что все проверки и движения мышью завернул в Проверить существование и уменьшил прокрутку до просмотра только 2 экранов. С такими изменениями скрипт уже несколько запусков стабильно отработал без сбоев.
    У меня тоже появилось подозрение, что ошибку может вызывать постоянно обновляющаяся лента сообщений в твитере. То есть, когда открывается основная лента, скрипт открывает первое сообщение (условно дадим ему №1) и начинает проделывать над ним действия. Затем должен перейти к сообщению №2. Но за то время, пока скрипт обрабатывал сообщение №1, в основной ленте появилось еще несколько новых сообщений, и сообщение с номером 1 могло стать по счету уже 5 или 10. А каким образм БАС привязывается к конкретным сообщениям я не знаю.

    И еще хотел уточнить по работе с селекторами, например, полный путь к элементу такой:

    div.tweet > div.content > div.stream-item-footer > div.ProfileTweet-actionList > div.ProfileTweet-action--retweet > span.ProfileTweet-actionButton > div.IconContainer >
    

    селектор1 такой:

    div.tweet
    

    селектор2 такой:

    div.IconContainer
    

    Как лучше указывать селекторы, чтобы БАС было легче работать, указывать полный путь или только нужный элемент?

    Вариант 1

    селектор1

    .tweet
    

    селектор2

    .IconContainer
    

    Вариант2

    Селектор1

    div.tweet
    

    селектор2

    div.stream-item-footer > div.ProfileTweet-actionList > div.ProfileTweet-action--retweet > span.ProfileTweet-actionButton > div.IconContainer
    

    или

    .stream-item-footer > .ProfileTweet-actionList > .ProfileTweet-action--retweet > .ProfileTweet-actionButton > .IconContainer
    

    Проверял, все варианты рабочие, но может БАС как то путается в длинных путях или наоброт, надо точнее указывать?


  • administrators

    @servasw45 Про новые твитты я не подумал. Это тоже возможно.

    Лучше всего указывать селектор который выдаст сам БАС, так как он проверяет его уникальность. Для цикла его нужно правильно подобрать самому.
    Длинные селекторы не должны быть проблемой, она передаются прямо в document.querySelectorAll



  • Вдогонку. Вспомнил. В одном из ранних вариантов я использовал команду Прокрутка к элементу с селектором 1, а двигал мышкой командой Двигать мышь над элементом с селектором 2. При таком варианте один раз удалось наблюдать такой глюк: страница начала прокручиваться резко вверх, а затем на много постов вниз. Так продолжалось до сообщения об ошибке.

    Как сейчас понимаю, произошла рассинхронизация действий команд с селектором 1 и селектором 2.

    Так что, если сделаете синхронную работу команд с селектором 1 и селектором 2 - будет очень здорово. Потому что постоянное обновление происходит во всех соцсетях. И принцип устройства сообщений похожий: общий контейнер (<div>) сообщения, а внутри его находятся контейнеры ретвит, репост, ответить, написать персональное сообщение. И если лайкнуть ошибочно не того - не очень страшно, то ответ адресованный "Васе" отправленный на аккаунт "Пете" - не желательный :))

    П.С.
    После того, как действия с мышкой завернул в команду Проверить существование, в логе попадаются сообщения, "Неудач и восстановлено(2)" но потоки работают все и до конца.


  • administrators

    @servasw45

    Вдогонку. Вспомнил. В одном из ранних вариантов я использовал команду Прокрутка к элементу с селектором 1, а двигал мышкой командой Двигать мышь над элементом с селектором 2. При таком варианте один раз удалось наблюдать такой глюк: страница начала прокручиваться резко вверх, а затем на много постов вниз. Так продолжалось до сообщения об ошибке.

    Ну если селекторы разные, то это не удивительно. Один указывает на 1 элемент, другой на второй.

    Так что, если сделаете синхронную работу команд с селектором 1 и селектором 2 - будет очень здорово. Потому что постоянное обновление происходит во всех соцсетях. И принцип устройства сообщений похожий: общий контейнер (<div>) сообщения, а внутри его находятся контейнеры ретвит, репост, ответить, написать персональное сообщение. И если лайкнуть ошибочно не того - не очень страшно, то ответ адресованный "Васе" отправленный на аккаунт "Пете" - не желательный :))

    Апдейт, который это решит будет в понедельник.

    После того, как действия с мышкой завернул в команду Проверить существование, в логе попадаются сообщения, "Неудач и восстановлено(2)" но потоки работают все и до конца.

    Неудач и восстановлено появляются только при наличия блока игнорирования ошибок. Нужно смотреть логику.


  • administrators

    @servasw45 В 16.8.0 версии поддерживается поиск внутри элемента цикла.
    Для этого к селектору сгенерированному БАС [[FOR_EACH_CSS]] >AT> [[CYCLE_INDEX]] нужно добавить свой.
    Например,

    [[FOR_EACH_CSS]] >AT> [[CYCLE_INDEX]] >CSS> .username
    

    найдет имя пользователя в текущем твитте.
    Подробнее о новых селекторах http://wiki.bablosoft.com/doku.php?id=ru:how_to_search_for_element



  • support, спасибо за селекторы!
    К вечеру описание появилось, уже будет легче, днем пробовал методом тыка но не разобрался.

    AT> - это указатель на номер цикла?
    Раньше отображалось так <[[CYCLE_INDEX]]> (в таких скобках < >)
    Старый синтаксис, такой: [[FOR_EACH_CSS]] <[[CYCLE_INDEX]]> продолжает работать, а в новом перед номером нужно указывать >AT> ,
    AT> [[CYCLE_INDEX]] , правильно понимаю?

    И еще хочу уточнить про пробелы, в случае использования >MATCH> пробелов не должно быть, при использовании >CSS> пробелы должны быть, привильно?


  • administrators

    @servasw45

    >AT> - это указатель на номер цикла?

    >AT> означает взять элемент с заданным номером.

    >CSS> a >AT> 0
    Первая ссылка.

    >CSS> .tweet >AT> 10
    Девятый твитт

    и т. д.

    Старый синтаксис, такой: [[FOR_EACH_CSS]] <[[CYCLE_INDEX]]> продолжает работать, а в новом перед номером нужно указывать >AT> , [[CYCLE_INDEX]] , правильно понимаю?

    Да, старый продолжает работать. но сделать так, что часть строки в старом, часть в новом не получится(

    Вам нужно просто добавить к тому селектору, что сгенерировал БАС свой кусок, например >CSS> .username

    И еще хочу уточнить про пробелы, в случае использования >MATCH> пробелов не должно быть, при использовании >CSS> пробелы должны быть, привильно?

    Эти селекторы красивее смотрятся с пробелами, в случае css пробелы ни на что не влияют, так что их можно ставить, можно и не ставить, все равно.


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.