В SilkTest-e существует несколько способов открытия файлов. В этом посте мы опишем три способа, а также когда их лучше применять.

 

  1. Функция SYS_Execute(). Самый простой способ. Позволяет запускать исполняемые файлы (*.com, *.exe, *.bat). Если вы решили использовать этот способ, то должны иметь ввиду, что выполнение скрипта будет остановлено до тех пор, пока не закершится команда, вызванная с помощью SYS_Execute.

    Пример использования:

    LIST OF STRING lsOut
    Print (SYS_Execute ("start C:\test_file.bat", lsOut))
    Print (lsOut)

    Кроме того, с помощью этой команды можно открывать любые файлы, которые ассоциированы с каким-либо приложением. Например:

    Print (SYS_Execute ("start C:\temp.txt"))

    Здесь файл C:\temp.txt будет открыт в Блокноте.
    Обратите внимание, что в этом случае выполнение скрипта продолжится сразу после того, как откроется файл. Однако для запуска исполняемых файлов этот метод не подходит. Пример:

    Print (SYS_Execute ("start C:\test_file.bat"))

    Скрипт не продолжит выполнение, пока не завершится программа test_file.bat.

  2. Метод Start(). Вообще-то этот метод определен для главных окон (MainWin) и предназначен для запуска приложений. В случае его использования должно открыться окно, у которого мы вызываем этот метод. Например, 

    window MainWin wCalculator
     tag "Calculator"

    testcase TestStartMethod () appstate none
     wCalculator.Start ("C:\WINDOWS\system32\calc.exe")

    Этот код отработает без ошибок только в том случае, если окно калькулятора откроется. Иначе мы получим сообщение об ошибке

    *** Error: Window '[MainWin]Calculator1' was not found

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

    window DialogBox DisplayProperties
     tag "Display Properties"

    void MySYS_Execute(STRING sFileName)
     withoptions
      BindAgentOption (OPT_WINDOW_TIMEOUT, 0)
      MainWin("!!!!!!").Start(sFileName)

    testcase TestStartMethod () appstate none
     MySYS_Execute ("control.exe desk.cpl")

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

  3. Использование Win API функции ShellExecute. Это наиболее гибкий способ открытия любого файла, будь то программа или документ.

    Пример использования функции ShellExecute:

    use "msw32.inc"
    dll "shell32.dll"
     HINSTANCE ShellExecute (in HWND hwnd,in STRING lpOperation,in STRING lpFile,in STRING lpParameters,in STRING lpDirectory, in INT nShowCmd) alias "ShellExecuteA"

    testcase TestStartMethod () appstate none
     ShellExecute (0, "open", "C:\temp.txt", "", "", 1)

    Обратите внимание, что в SilkTest версий International, а также во всех версиях SilkTest, начиная с 8.0 и выше, необходимо использовать другое объявление функции ShellExecute.

    HINSTANCE ShellExecute (in HWND hwnd,in STRING lpOperation,in STRING lpFile,in STRING lpParameters,in STRING lpDirectory, in INT nShowCmd) alias "ShellExecuteW"

    Более подробно узнать о параметрах и возвращаемых значениях функции ShellExecute можно здесь
    http://msdn2.microsoft.com/en-us/library/ms647732.aspx

Естественно, что выбор того или иного метода зависит от конкретной задачи.

Например, если вам необходимо запустить bat-файл, дождаться завершения его выполнения, а затем проверить информацию, которую он выводил во время работы, то наиболее оптимальным способом будет использование функции SYS_Execute.

Если вам надо только запускать исполняемые файлы и при этом обеспечить максимальную совместимость между разными версиями SilkTest, то метод Start - ваш выбор.

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

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