Продолжить цикл в зависимости от условий
-
@Turutur Continue не будет работать если вы перемещали точку выполнения внутри цикла. В этом случае теряются данные о цикле. Если этого не делать, то вызов continue в вашем скрипте работает как надо.
-
@support здравствуйте - я пересоздал действия внутри цикла - continue срабатывает - но только в режиме отладки - в режиме запуска - поток прерывается С ОШИБКОЙ - пожалуйста посмотрите в чем дело - несколько раз пытался сделать - во время теста всегда одно и то же - Поток аварийно завершился с сообщением "Таймаут во время выполнения script for[documentRoot, css :nth-child(1) > .sel-single]"- я написал вам личным сообщением и скрипт прикрепил - пожалуйста посмотрите в чем дело...
-
@Turutur Перед проверкой открывается форма, чтобы она открылась нужно время. Поставьте спать или ожидание этой формы.
-
@support я менял интервалы ожидания и 5000 и 10000 - это никак не влияет на работу скрипта - да и подгрузку формы с задержкой тоже не видно - не срабатывает continue((( - скрипт доходя до этого места просто зависает - а в режиме отладаки он работает замечательно!!! После вообще убрал действие спать и continue перестал сраабатывать даже в режиме отладки....
Перезапустил скрипт - в режиме отладки - выполнил до действия проверки - затем пошагово и о чудо сработало - решил чтото не так делаю - начал все сначала - не срабатывает и все - пожалуйста укажите ошибку - какую форму ждать - почему срабатывает через раз или не срабатывает, как переорганизовать проверку, чтобы срабатывало?
-
@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 запусков только один работает до конца, все остальные останавливаются с ошибкой.
Посмотрите, пожалуйста, где у меня ошибка. Я сам не могу обнаружить.
-
@servasw45 Проблема в том, что
div.ProfileTweet-actionList
может не существовать в некоторых твиттах.
Нужно проверять его наличие на странице перед кликом.Но вместо ошибки скрипт может ставить лайки не тем, кто находятся в белом списке.
Объясню. Запись.tweet .ProfileTweet-actionList<0>
значит первый элемент.ProfileTweet-actionList
родителем которого есть.tweet
, но поскольку не каждый.tweet
содержит.ProfileTweet-actionList
, то счет может "сместиться".В следующей версии, которая выйдет очень скоро будет возможна такая запись
.tweet <<0>> .ProfileTweet-actionList
Что будет значить
.ProfileTweet-actionList
внутри первого.tweet
Итак, что нужно сделать, чтобы все работало стабильно:
- Дождаться 16.8.0(завтра вечером предположительно)
- Заменить
[[FOR_EACH_CSS]] .username<[[CYCLE_INDEX]]>
на[[FOR_EACH_CSS]] <<[[CYCLE_INDEX]]>> .username
и остальные похожие конструкции. - Делать проверку на наличие .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
Проверял, все варианты рабочие, но может БАС как то путается в длинных путях или наоброт, надо точнее указывать?
-
@servasw45 Про новые твитты я не подумал. Это тоже возможно.
Лучше всего указывать селектор который выдаст сам БАС, так как он проверяет его уникальность. Для цикла его нужно правильно подобрать самому.
Длинные селекторы не должны быть проблемой, она передаются прямо в document.querySelectorAll
-
Вдогонку. Вспомнил. В одном из ранних вариантов я использовал команду Прокрутка к элементу с селектором 1, а двигал мышкой командой Двигать мышь над элементом с селектором 2. При таком варианте один раз удалось наблюдать такой глюк: страница начала прокручиваться резко вверх, а затем на много постов вниз. Так продолжалось до сообщения об ошибке.
Как сейчас понимаю, произошла рассинхронизация действий команд с селектором 1 и селектором 2.
Так что, если сделаете синхронную работу команд с селектором 1 и селектором 2 - будет очень здорово. Потому что постоянное обновление происходит во всех соцсетях. И принцип устройства сообщений похожий: общий контейнер (<div>) сообщения, а внутри его находятся контейнеры ретвит, репост, ответить, написать персональное сообщение. И если лайкнуть ошибочно не того - не очень страшно, то ответ адресованный "Васе" отправленный на аккаунт "Пете" - не желательный :))
П.С.
После того, как действия с мышкой завернул в команду Проверить существование, в логе попадаются сообщения, "Неудач и восстановлено(2)" но потоки работают все и до конца.
-
Вдогонку. Вспомнил. В одном из ранних вариантов я использовал команду Прокрутка к элементу с селектором 1, а двигал мышкой командой Двигать мышь над элементом с селектором 2. При таком варианте один раз удалось наблюдать такой глюк: страница начала прокручиваться резко вверх, а затем на много постов вниз. Так продолжалось до сообщения об ошибке.
Ну если селекторы разные, то это не удивительно. Один указывает на 1 элемент, другой на второй.
Так что, если сделаете синхронную работу команд с селектором 1 и селектором 2 - будет очень здорово. Потому что постоянное обновление происходит во всех соцсетях. И принцип устройства сообщений похожий: общий контейнер (<div>) сообщения, а внутри его находятся контейнеры ретвит, репост, ответить, написать персональное сообщение. И если лайкнуть ошибочно не того - не очень страшно, то ответ адресованный "Васе" отправленный на аккаунт "Пете" - не желательный :))
Апдейт, который это решит будет в понедельник.
После того, как действия с мышкой завернул в команду Проверить существование, в логе попадаются сообщения, "Неудач и восстановлено(2)" но потоки работают все и до конца.
Неудач и восстановлено появляются только при наличия блока игнорирования ошибок. Нужно смотреть логику.
-
@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> пробелы должны быть, привильно?
-
>AT>
- это указатель на номер цикла?>AT>
означает взять элемент с заданным номером.>CSS> a >AT> 0
Первая ссылка.>CSS> .tweet >AT> 10
Девятый твитти т. д.
Старый синтаксис, такой: [[FOR_EACH_CSS]] <[[CYCLE_INDEX]]> продолжает работать, а в новом перед номером нужно указывать
>AT>
, [[CYCLE_INDEX]] , правильно понимаю?Да, старый продолжает работать. но сделать так, что часть строки в старом, часть в новом не получится(
Вам нужно просто добавить к тому селектору, что сгенерировал БАС свой кусок, например >CSS> .username
И еще хочу уточнить про пробелы, в случае использования >MATCH> пробелов не должно быть, при использовании >CSS> пробелы должны быть, привильно?
Эти селекторы красивее смотрятся с пробелами, в случае css пробелы ни на что не влияют, так что их можно ставить, можно и не ставить, все равно.