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

- Функция 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.
- Метод 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")Конечно, эту функцию можно и нужно улучшить (например, добавить проверку существования файла), однако это не является темой данного поста.
- Использование 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.
