Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
Сценарии WSH как XML-документы. Схема WS XML
Примеры сценариев с разметкой XML
Приведем примеры сценариев, иллюстрирующие основные свойства WS-файлов.
Несколько заданий в одном файле
Каждое отдельное задание в WS-файле должно находиться внутри элементов <job> и </job>. В свою очередь, все элементы <job> являются дочерними элементами контейнера <package>.
В качестве примера рассмотрим сценарий multijob.wsf, приведенный в листинге 9.7. Здесь описываются два задания с идентификаторами "VBS" (сценарий на языке VBScript) и "JS" (сценарий на языке JScript).
<package> <job id="VBS"> <!-- Описываем первое задание (id="VBS") --> <runtime> <description> Имя: multijob.wsf Описание: Первое задание из multijob.wsf </description> </runtime> <script language="VBScript"> WScript.Echo "Первое задание (VBScript)" </script> </job> <job id="JS"> <!-- Описываем второе задание (id="JS") --> <runtime> <description> Имя: multijob.wsf Описание: Второе задание из multijob.wsf </description> </runtime> <script language="JScript"> WScript.Echo("Второе задание (JScript)"); </script> </job> </package>Листинг 9.7. Файл multijob.wsf
Для того чтобы выполнить первое задание сценария multijob.wsf, которое выведет на экран строку "Первое задание (VBScript)", нужно выполнить одну из следующих команд:
cscript //job:"VBS" multijob.wsf cscript multijob.wsf wscript //job:"VBS" multijob.wsf wscript multijob.wsf
Для запуска второго задания, выводящего на экран строку "Второе задание (JScript)", нужно явно указывать идентификатор этого задания, поэтому используется одна из двух команд:
cscript //job:"JS" multijob.wsf wscript //job:"JS" multijob.wsf
Использование констант внешних объектов
Для того чтобы в сценарии обращаться по имени к константам, определенным во внешних объектах, не создавая экземпляров самих объектов, необходимо сначала получить ссылку на эти объекты с помощью элемента <reference>.
В листинге 9.8 приведен сценарий refer.wsf, в котором с помощью элемента <reference> производится доступ к трем константам объекта FileSystemObject ( ForReading, ForWriting и ForAppending ), которые определяют режим работы из сценария с внешним текстовым файлом. В результате выполнения сценария refer.wsf на экран выведется диалоговое окно с информацией о значениях констант объекта FileSystemObject.
<job id="Example"> <runtime> <description> Имя: refer.wsf Описание: Использование констант внешних объектов </description> </runtime> <!-- Получаем ссылку на объект FileSystemObject --> <reference object="Scripting.FileSystemObject"/> <script language="JScript"> var s; s="Значения констант объекта FileSystemObject:\n\n"; //Получаем значение константы ForReading s+="ForReading="+ForReading+"\n"; //Получаем значение константы ForWriting s+="ForWriting="+ForWriting+"\n"; //Получаем значение константы ForAppending s+="ForAppending="+ForAppending; //Выводим полученные строки на экран WScript.Echo(s); </script> </job>Листинг 9.8. Использование в сценарии констант внешних объектов (файл refer.wsf)
Подключение внешних файлов
К WS-файлу можно подключать "обычные" JScript- или VBScript-сценарии, которые находятся во внешних файлах. Для этого нужно указать путь к этому внешнему файлу в атрибуте src элемента <script>.
Для примера создадим файл inc.js, содержащий строку
WScript.Echo("Здесь выполняется сценарий inc.js");
и файл main.wsf, содержание которого приведено в листинге 9.9.
<job id="Example"> <runtime> <description> Имя: main.wsf Описание: Подключение сценария, находящегося во внешнем файле </description> </runtime> <!-- Подключаем сценарий из файла inc.js --> <script language="JScript" src="inc.js"/> <!-- Определяем основной сценарий --> <script language="JScript"> WScript.Echo("Здесь выполняется основной сценарий"); </script> </job>Листинг 9.9. Подключение внешнего сценария (файл main.wsf)
Если запустить main.wsf с помощью cscript.exe, то на экран выведутся две строки:
Здесь выполняется сценарий inc.js Здесь выполняется основной сценарий
Различные языки внутри одного задания
Ни в WSH, ни в JScript нет метода или функции, которые позволяли бы в графическом режиме создать диалоговое окно для ввода текста. Однако в языке VBScript имеется функция InputBox, предназначенная как раз для этой цели; используя разметку XML, мы можем легко использовать эту функцию в сценариях JScript. Соответствующий пример приведен в сценарии multilang.wsf (листинг 9.10).
Сначала в этом сценарии на языке VBScript описывается функция InputName, которая возвращает строку, введенную с помощью функции InputBox:
<script language="VBScript"> Function InputName InputName = InputBox("Введите Ваше имя:", "Окно ввода VBScript") End Function </script>
Затем в следующем разделе <script> приводится JScript-сценарий, в котором происходит вызов функции InputName и сохранение возвращаемого ею значения в переменной s:
var s; s = InputName();
Значение полученной таким образом переменной s выводится затем на экран:
WScript.Echo("Здравствуйте, "+s+"!");
<job id="Example"> <runtime> <description> Имя: multilang.wsf Описание: Использование функции InputBox в JScript-сценарии </description> </runtime> <script language="VBScript"> Function InputName ' Описываем функцию на языке VBScript ' Вводим имя в диалоговом окне InputName = InputBox("Введите Ваше имя:", "Окно ввода VBScript") End Function </script> <script language="JScript"> var s; s = InputName(); //Вызываем функцию InputName //Выводим значение переменной s на экран WScript.Echo("Здравствуйте, "+s+"!"); </script> </job>Листинг 9.10 . пользование различных языков внутри одного задания (файл multilang.wsf)