Пошаговое руководство. Автоматизация тестирования Блокнота Windows с помощью Node.js
В этой статье показано, как создать скрипт автоматизации для Блокнота Windows 10 с помощью Node.js и Cucumber.js. Вы также узнаете, как создать объектную модель для вашего приложения Windows и как использовать API-интерфейсы автоматизации Windows в CukeTest для написания сценария.
В этом пошаговом руководстве мы:
- Создайте сценарии BDD, описывающие шаги автоматизации.
- Элементы управления Spy Notepad и добавление тестовых объектов в объектную модель
- Реализовать код автоматизации
- Отладьте и запустите скрипт, чтобы получить отчет
Мы создали видео о том, как это сделать, смотрите его на YouTube
Чтобы сделать это шаг за шагом самостоятельно, пожалуйста, сначала установите Node.js а также CukeTest как средства разработки.
1. Создать проект
Откройте CukeTest, нажмите «Файл» -> «Новый проект».
Установите «NotepadTesting» в качестве имени проекта и выберите шаблон проекта «Windows», также укажите путь к проекту и нажмите «Создать», чтобы создать проект.
2. Пишите сценарии
Чтобы написать сценарий автоматизации, основанный на поведении, всегда нужно начинать с написания тестовых случаев, которые вы хотите автоматизировать, в виде файлов функций. Открытым feature1.feature
файл, в визуальном представлении введите содержимое в соответствии со следующим рисунком.
В представлении «Текст» вы найдете содержимое файла функции:
Feature: Notepad Application Automation
Automate Windows 10 Notepad application for testing
Scenario: Edit content and save
Given Notepad application is opened
When input text "hello world" in the Notepad
And select [File] -> [Save] to show the file save dialog
And enter the file name "helloworld.txt" and click [OK]
Then the file should be saved successfully
Scenario: Change Notepad font
Given Notepad application is opened
When select [format] -> [font] to open font dialog
And select [Arial] font from the Font dropdown box
Then Click [OK] button to dismiss the Font dialog
С созданными сценариями теперь очень ясно, что нужно реализовать.
3. Шпионский контроль
При автоматизации приложения Windows «тестовые объекты» используются для идентификации элементов управления Windows. каждый тестовый объект содержит набор свойств и правил, используемых для обнаружения элемента управления. Информация о тестовом объекте хранится в файле объектной модели (или, сокращенно, «файле модели»), который заканчивается на «.tmodel». Диспетчер моделей в CukeTest используется для создания и управления файлом модели. Вот краткая инструкция о том, как шпионить и добавлять объекты в модель:
Нажмите «Добавить объект». кнопку, чтобы начать отслеживание элемента, щелкните элемент управления, который вы хотите добавить, если элемент управления успешно отслежен, он покажет элементы управления, которые вы хотите добавить, и их свойства. Затем вы нажимаете «Добавить в модель».
кнопку, чтобы добавить его в объектную модель.
Теперь выполните следующие шаги для создания модели:
Нажмите
step_definitions\model1.tmodel
файл, чтобы открыть его в диспетчере моделей.Откройте Блокнот, просмотрите следующий список элементов управления и добавьте их в модель, а также дайте им имена в качестве столбца «Имя объекта» ниже:
Текст Тип управления Имя объекта «Файл» Пункт меню Файл «Сохранять» Пункт меню Сохранить1 «Формат» Пункт меню Формат «Шрифт…» Пункт меню Шрифт… «» Документ Текстовый редактор Один совет о шпионаже, чтобы шпионить за кнопкой «Сохранить», сначала нажмите клавишу Ctrl при нажатии меню «Файл», чтобы этот щелчок не вызывал появление диалогового окна шпионажа, а затем отпустите клавишу Ctrl, когда вы нажимаете «Сохранить».
Откройте диалоговое окно «Шрифт», щелкнув меню «Формат» -> «Шрифт…», просмотрите и добавьте следующий список элементов управления и добавьте их в модель.
Текст Тип управления Имя объекта «Ариал» пункт списка Ариал «ХОРОШО» Кнопка ХОРОШО Откройте диалоговое окно «Сохранение файла», просмотрите и добавьте следующий список элементов управления и добавьте их в модель.
Текст Тип управления Имя объекта «» Редактировать Имя файла:1 «ХОРОШО» Кнопка ХОРОШО После добавления всех этих элементов ваша модель должна выглядеть следующим образом:
4. Начать реализацию сценариев
Открытым
step_definations\definitions1.js
файла, нажимайте серые кнопки на каждом шаге, чтобы сгенерировать заглушку кода определения шага.обратите внимание, что теперь кнопка рядом с текстом шага оранжевого цвета, что означает, что шаги имеют соответствующие функции определения шагов, но они еще не реализованы.
Вы также можете заметить, что в этот файл уже добавлен код загрузки модели, поэтому в коде при создании проекта вы можете напрямую использовать эту переменную модели для доступа к этим объектам.
Теперь вы можете открыть
model1.tmodel
файл, выберите объект из дерева модели, выберите вкладку «Действия/Свойства», а затем скопируйте метод из списка и добавьте их в скрипт.Чтобы реализовать определения шагов, сначала выполните шаг «Данный Открыто приложение «Блокнот», вы можете использовать API «Util.launchProcess» для запуска процесса «Блокнот»:
Given(/^Notepad application is opened$/, async function () { if (!await model.getWindow("Notepad").exists(0)) { Util.launchProcess('c:\\Windows\\notepad.exe'); } });
После написания кода вы можете протестировать его, щелкнув шаг правой кнопкой мыши и нажав кнопку «Выполнить этот шаг» на панели инструментов шага:
это просто запустит шаг для отладки, и в случае успеха ваш блокнот должен быть запущен.
Прежде чем выполнять остальные шаги, мы должны добавить функции ловушек, чтобы свернуть окно CukeTest при запуске скрипта и восстановить окно CukeTest после завершения запуска, мы можем добиться этого в
BeforeAll
а такжеAfterAll
крючки. Для получения дополнительной информации о хуках вы можете прочитать BDD Web Automation 04: Hooks and TimeOut. Добавьте файл «support/hooks.js» и поместите следующее содержимое:const {BeforeAll, AfterAll, setDefaultTimeout} = require('cucumber') const cuketest = require('cuketest'); setDefaultTimeout(20 * 1000); BeforeAll(async function() { await cuketest.minimize(); await cuketest.delay(1000); }) AfterAll(async function () { await cuketest.delay(1000); await cuketest.maximize(); })
В hooks.js мы установили время ожидания шага равным 20 секундам вместо 5 секунд по умолчанию, что немного меньше для скрипта автоматизации Windows. Также в
BeforeAll
мы сворачиваем окно CukeTest перед запуском любых сценариев, ждем 1 секунду, пока минимизация действительно не вступит в силу, чтобы она не мешала пользовательскому интерфейсу тестируемого приложения при выполнении автоматических операций.
5. Реализуйте все шаги автоматизации
Теперь мы можем реализовать второй шаг:
When input text "hello world" in the Notepad
В этом подразделе функции определения шага измените имя параметра на «текст» и перетащите объект «Текстовый редактор» из диспетчера моделей в функцию, выберите
set
метод и заполняем в нем параметр text, код такой:When(/^input text "([^"]*)" in the Notepad$/, async function (text) { await model.getDocument("Text Editor").set(text); });
Предположим, вы открыли Блокнот, теперь вы можете щелкнуть правой кнопкой мыши текст шага и выбрать «Выполнить этот шаг», как вы сделали для первого шага, он свернет CukeTest, установите содержимое Блокнота как «hello world», а затем восстановить окно CukeTest. Если этот шаг выполнен успешно, вы можете добавить остальные шаги аналогичным образом.
Чтобы сохранить абзац, я вставляю весь приведенный ниже код Definitions1.js:
const { Given, When, Then } = require('cucumber'); const { TestModel } = require('leanpro.win'); const { Util } = require('leanpro.common'); const fs = require('fs'); const cuketest = require('cuketest') const assert = require('assert') let model = TestModel.loadModel(__dirname + "/model1.tmodel"); Given(/^Notepad application is opened$/, async function () { if (!await model.getWindow("Notepad").exists(0)) { Util.launchProcess('c:\\Windows\\notepad.exe'); } }); When(/^input text "([^"]*)" in the Notepad$/, async function (text) { await model.getDocument("Text Editor").set(text); }); When(/^select \[File\] \-> \[Save\] to show the file save dialog$/, async function () { await model.getMenuItem("File").click(); await model.getMenuItem("Save1").click(); }); When(/^enter the file name "([^"]*)" and click \[OK\]$/, async function (fileName) { this.fileName = __dirname + '\\' + fileName; if (fs.existsSync(this.fileName)) { fs.unlinkSync(this.fileName); } await cuketest.delay(1000) await model.getEdit("File name:1").set(this.fileName); await model.getButton("Save").click(); }); Then(/^the file should be saved successfully$/, async function () { await cuketest.delay(1000) assert.ok(fs.existsSync(this.fileName), `${this.fileName} should exists`); }); When(/^select \[format\] \-> \[font\] to open font dialog$/, async function () { await model.getMenuItem("Format").click(); await model.getMenuItem("Font...").click(); await cuketest.delay(1000); }); When(/^select \[Arial\] font from the Font dropdown box$/, async function () { await model.getList("Font:1").select('Arial'); await cuketest.delay(1000); }); Then(/^Click \[OK\] button to dismiss the Font dialog$/, async function () { await model.getButton("OK").click(); });
чтобы убедиться, что он успешно работает при повторном запуске, он удалит существующий файл перед сохранением.
6. Беги
Нажмите кнопку запуска, он запустит эти два сценария, а затем откроет отчет о тестировании, как показано ниже:
Резюме
В этой статье мы успешно создали сценарий BDD, который может автоматизировать Блокнот и генерировать отчет о тестировании. Благодаря тестовой модели, управляющей тестовыми объектами, код упрощается и его легче поддерживать. CukeTest предоставляет возможность отладки, которая может выполнять сценарий шаг за шагом.
В следующей статье мы поговорим о том, как организовать объектные модели в Менеджере моделей, чтобы сделать их более организованными. Также мы поговорим о том, как обновить свойства тестового объекта, чтобы он мог работать в Windows с другим языком отображения.
Некоторые другие материалы об автоматизации Windows с использованием Node.js: