Но появилась новая проблема. Иногда скрипт во время работы внезапно запрещает выделять действия. Т.е при клике на любое действие, оно просто не выделяется красным. Это второй баг, независимый от первого если что
Не верно работает логика скрипта continue
-
Есть список страниц.
Надо их проверить на наличие элементов и сорвешить действия.Логика скрипта:
БЕРЕМ СПИСОК ЭЛЕМЕНТОВ
ЗАПУСКАЕМ ЦИКЛ FOREACH
ФУНКЦИЯ 1
Загрузка страницы
Проверка 1
Если TRUE то запись в Лог и след. итерация цикла.(continue)
Иначе
Проверка 2
Если TRUE то запись в Лог и след. итерация цикла.(continue)
Иначе
Проверка 3
Если TRUE то запись в Лог и след. итерация цикла.(continue)
Иначе
Клик на элемент и запись в ЛогФУНКЦИЯ 2
Проверка 1
Если TRUE то запись в Лог и след. итерация цикла.(continue)
Иначе
Проверка 2
Если TRUE то запись в Лог и след. итерация цикла.(continue)
Иначе
Клик на элемент
Проверка 3
Если TRUE то запись в Лог и след. итерация цикла.(continue)
Иначе
Клик на элемент, запись в Лог, клик на элементSuccess
Все страницы корректно проверяються кроме одной.
В момент Проверки 1 в Функции 1 возвращается TRUE, но цикл не переходит на след. итерацию а продолжает работать в текущей до момента "Клик на элемент в Проверке 2 Функции 2" и останавливается потому, что не может найти элемент на странице на который нужно кликнуть.Как исправить, что бы логика скрипта continue возвращала на след. итерацию?
-
@zizitop
вероятно функция тот же блок что и цикл, тут не стека не сохранения/востановления состояния до вызова функции, ни рекурсии человечей нет, не нужно ожидать что континуе или еще какой бряк внутри функции сработает для наружнего по отношению к функции цикла,
использовать готу, поставить метку энд в конце цикла и прыгать на ней. -
и исходить из того что вызов функции это не функции вызов а переход на метку в блоке, а имя функции это название метки,
нету параметров нету ретурна
если в функции сделать вызов самого себя, заранее позаботившись о том чтобы не зациклить все к ... UPDто то что будет после этого вызова выполнится только один раз, а должно выполниться по числу вызовов каждый раз как функция закончит выполняться она должна вернуть управление в точку вызова позади.то выполнится сколько надо раз.
вобщем это не функция совсем.
цикл не цикл а блок с меткой вначале и готу в конце.
ну дак какая между ними разница? -
@ruzne said in Не верно работает логика скрипта continue:
вероятно функция тот же блок что и цикл, тут не стека не сохранения/востановления состояния до вызова функции, ни рекурсии человечей нет, не нужно ожидать что континуе или еще какой бряк внутри функции сработает для наружнего по отношению к функции цикла,
Я не программист поэтому и использую BAS, знания у меня поверхностные поэтому в основном исхожу из логики действий как должно быть.
@ruzne said in Не верно работает логика скрипта continue:
использовать готу, поставить метку энд в конце цикла и прыгать на ней.
go to - это установить метку/перейти к метке? А где будет тогда конец цикла, в конце второй функции или после нее?Или как то еще?
@ruzne said in Не верно работает логика скрипта continue:
и исходить из того что вызов функции это не функции вызов а переход на метку в блоке, а имя функции это название метки,
нету параметров нету ретурна
если в функции сделать вызов самого себя, заранее позаботившись о том чтобы не зациклить все к ... то то что будет после этого вызова выполнится только один раз, а должно выполниться по числу вызовов каждый раз как функция закончит выполняться она должна вернуть управление в точку вызова позади. вобщем это не функция совсем.
цикл не цикл а блок с меткой вначале и готу в конце.
ну дак какая между ними разница?Тобишь нет разницы использовать цикл или метку так как работают они одинаково?
-
@ruzne Что ты несешь?
@zizitop
В бас все действия - это функции. Даже циклы. Continune по сути делает переход в старт этой же функции. Break прерывает функцию.
Не нужно усложнять скрипт метками, просто устанавливайте какую то переменную в функции в определенное значение, а при выходе из функции проверять эту переменную -
@DrPrime said in Не верно работает логика скрипта continue:
Не нужно усложнять скрипт метками, просто устанавливайте какую то переменную в функции в определенное значение, а при выходе из функции проверять эту переменную
Что то не совсем понятно. Какую переменную, с каким значением в какой функции, при выходе из цикла и где он будет?
Можете пожалуйста описать логику на моем примере что бы понятнее было? -
два то зачем, одного бы хватило
@ruzne said in Не верно работает логика скрипта continue:
вероятно
я могу ошибаться как я и говорил, функция - именованый блок действий, поэтому назвав это блоком я много не ошибся.
называть это функцией я все же не буду потому что как функция это себя не ведет.
@zizitop
чтобы прямо исправится за все косяки за которые меня тут подтягивают предложу использоватьвместо континуе
_next(2)вместо бряка
_break(2)2 - по числу вложеностей.
вот, функции сремные.
@DrPrime
претензия к функциям следующаяfunction a(){ log('1'); i++; if(i<5){ a(); }else{ log('2'); } log('3'); } i=0; a();это работать не будет. ошибка иф елзе экспрешен. условие в ифе не вычислено, точнее вычислено но благополучно забыто, а должно было быть сохранено при вызове функции и востановлено при возврате из функции.
вывод функции поддельные. -
@ruzne said in Не верно работает логика скрипта continue:
чтобы прямо исправится за все косяки за которые меня тут подтягивают предложу использовать
вместо континуе
_next(2)вместо бряка
_break(2)2 - по числу вложеностей.
А как этот самый _next(2) мне впихнуть и в виде чего, переменной или как произвольный код или без разницы?
-
@zizitop
в данном конкретном случае _next(3) точно работает как континуе для внешнего по отношению к функции циклу
я провелил, если степень вложености изменится, то насколько выше или ниже нужно будет другой аргумент некст указывать, вероятно можно не только на сколько выше ниже указать но и метку в дефолтном континуе например внутри на самом деле вызов _next("function")
я вот еще закгрузку в игнорировать ошибки обернул чтобы это заработало -
@ruzne Да, если загрузку обернуть в игнор ошибок все работает с некстом.
@ruzne said in Не верно работает логика скрипта continue:
вероятно можно не только на сколько выше ниже указать но и метку в дефолтном континуе например внутри на самом деле вызов _next("function")
А как реализуется эта самая "метка в дефолтном континуе", что то не пойму?
-
@zizitop
Тебе нужно вместо Continune в функциях сделать Выполнить кодVAR_NEED_NEXT = true _break()В цикле после каждой функции блок IF с условием [[NEED_NEXT]]
Внутри которого
Установить переменную NEED_NEXT в значение false с типом данных expression
И блок ContinuneТак же перед циклом
Установить переменную NEED_NEXT в значение false с типом данных expressionКостыль конечно, но по другому никак
