@Farak1 zabil platnie otpechatki kupit
a po delu
ef9c6dc3-1bff-476d-aebb-8b14a9817902-image.png
esli telo IF'a pustoe on vidaet false
Не верно работает логика скрипта 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Костыль конечно, но по другому никак
