Отладка скрипта AutoIt или получение текущего номера строки скрипта

Мой скрипт AutoIt отправляет список кликов и нажатий клавиш для автоматизации старого приложения с закрытым исходным кодом.

В нем есть ошибки, поэтому я хочу знать, как я могу отлаживать сценарии AutoIt. Или хотя бы вывести номер строки скрипта (чтобы показать код, выполняемый в режиме реального времени).


person Community    schedule 05.12.2015    source источник


Ответы (2)


В SciTE в разделе «Инструменты» выберите «Трассировка: Добавить линии трассировки». Это добавит ConsoleWrite к каждой строке, если ничего не выбрано. Если вы сначала выберете код, он добавит строки ConsoleWrite к тому, что вы выбрали.

Если вы получаете сообщение об ошибке в скомпилированном коде, вы можете добавить это в начало скрипта перед его компиляцией. Когда он выдаст ошибку, он даст вам правильный номер строки в вашем скрипте.

#Au3Stripper_Parameters=/mo
person MrAutoIt    schedule 05.12.2015
comment
Линии трассировки в большинстве случаев хорошо подходят для отладки. Если это дает вам ошибку, проверьте, есть ли в вашем коде какие-либо операторы Select или Switch. Вы захотите удалить все ConsoleWrite, которые он мог добавить между Select/Switch и первым Case. - person MrAutoIt; 05.12.2015
comment
Мой вопрос был плохо сформулирован, я имел в виду, что иногда у меня нет правильного поведения в моем коде (сложная автоматизация с синхронизацией и слепыми окнами (без текста внутри...)), поэтому ваш ответ идеален. - person ; 05.12.2015

Как я могу отлаживать код AutoIt?

Синтаксис

Au3Проверить

Согласно Документация - Введение - Средство проверки синтаксиса AutoIt (Au3Check):

Проверяет скрипт на наличие синтаксических ошибок.

Пример:

#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7

Сообщает (почти) обо всех ошибках, не связанных с выполнением, до выполнения и компиляции.

Время выполнения

Текущая строка

покажи мне какой код выполняется в реальном времени

Согласно Документация — Справочник по функциям — AutoItSetOption():

TrayIconDebug Если включено, показывает текущую строку скрипта в подсказке значка на панели задач для облегчения отладки.

Пример:

AutoItSetOption("TrayIconDebug", 1)

Скомпилированные скрипты

#AutoIt3Wrapper_Run_Debug_Mode=Y запускает сценарий с отладкой консоли.

Из-за предустановленных включаемых файлов номера строк (в сообщениях об ошибках) скомпилированных скриптов не совпадают с исходным файлом .au3. Согласно Документация - SciTE4AutoIt3 - Au3Stripper:

Если ошибок нет, запустите Au3Stripper, чтобы создать очищенный исходный файл Scriptname_Stripped в той же папке, содержащей весь исходный код (скрипт и любые файлы #include).

Пример:

#AutoIt3Wrapper_Run_Au3Stripper=y

Номера строк в сообщениях об ошибках скомпилированных скриптов теперь совпадают с номерами в scriptname_stripped.au3 (присутствуют после компиляции).

Коды ошибок и возвращаемые значения

  • ConsoleWrite(). Add #AutoIt3Wrapper_Change2CUI=y if to be read from compiled script.
    • Macros of use include @error, @extended and @ScriptLineNumber
    • SciTE4AutoIt3 > Tools > Trace: Add Trace Lines вставляет такую ​​команду для каждой строки. Отображает текущий код @error (и соответствующую строку).
    • SciTE4AutoIt3 > Tools > Debug to Console (Alt + D) вставляет такую ​​команду для текущей выбранной строки. Отображает @ScriptLineNumber, возвращаемое значение и код @error. Выполняет исходную строку второй раз для возвращаемого значения (может быть нежелательным).
  • VarGetType() возвращает внутреннее представление типа варианта.
  • _ArrayDisplay() для просмотра структуры и содержимого переменных массива.
  • Возможно записывать в файл или база данных на случай удаленной отладки.
  • Ошибка регистрации UDF (пример) для упрощение.

Утверждения

Согласно Документация — Справочник по пользовательским функциям — _Assert():

Отображать сообщение, если утверждение не выполняется

Связано. Полезно для регрессионных тестов и для проверки пограничных случаев и предположений (или просто для прерывания в случае непредвиденных обстоятельств). Связанные функции включают в себя:

Обработка ошибок

Обычно функции возвращают либо (или их комбинацию) возвращаемое значение, либо -код ошибки. Значения кода ошибки, отличные от 0 (иногда отрицательные), означают сбой. Возвращаемые значения (если используются как таковые) чередуются между 0 (неудача) и 1 (успех).

Обрабатывайте ошибки по мере их появления. Сценарии отлаживают себя для правильной обработки ошибок. Избегайте постепенного вложения If операторов. Пример:

Global Enum  $RANDOM_FLT, _
             $RANDOM_INT

Global Enum  $ERROR_OK, _
             $ERROR_AIR, _
             $ERROR_WATER, _
             $ERROR_FOOD, _
             $ERROR_ENUM

Global       $g_aError[$ERROR_ENUM]
             $g_aError[$ERROR_OK]    = 'survived'
             $g_aError[$ERROR_AIR]   = 'no air'
             $g_aError[$ERROR_WATER] = 'no water'
             $g_aError[$ERROR_FOOD]  = 'no food'

Global Const $g_sMsgConsole          = 'error:%i - %s\n'

While True
    Live()

    If @error Then
        ConsoleWrite(StringFormat($g_sMsgConsole, @error, $g_aError[@error])); And one of following:
        ContinueLoop
;       ExitLoop
;       Return; If in Local scope.
;       Exit @error
    EndIf

    ; Continuation conditional to successful execution of Live():
    ConsoleWrite(StringFormat($g_sMsgConsole, @error, $g_aError[@error]))
WEnd

Func Live()
    Local Const $iError    = Random($ERROR_OK, $ERROR_ENUM - 1, $RANDOM_INT), _
                $iExtended = 0, _
                $iReturn   = $iError ? 0 : 1

    Return SetError($iError, $iExtended, $iReturn)
EndFunc

Или точнее:

Live()

Switch @error

    Case $ERROR_AIR
        ; Handle specific error here.

    Case $ERROR_WATER
        ; Handle specific error here.

    Case $ERROR_FOOD
        ; Handle specific error here.

EndSwitch

Возвращаемые значения позволяют использовать такие конструкции, как:

If Not SomeFunction() Then
    ; Handle here.
EndIf
; Continuation of script here.

Может помочь сопоставление кодов ошибок с текстовыми сообщениями. Особенно полезно, если они совместно используются несколькими связанными функциями, которые вызывают друг друга, прозрачно возвращая коды обнаруженных ошибок (например, некоторые FindOnPage() возвращают $ERR_PAGELOAD из зависимости LoadPage()).

person user4157124    schedule 26.05.2018