Watin - как написать робота? |
27.02.2013 10:35 |
Автор: Киселева Ольга Начнем с основ - что вообще такое робот и зачем он нужен? Робот - это приложение, которое выполняет какую-то работу за нас. Но не всю - он делает маленький кусочек, а остальное проверяет тестировщик вручную. Такая полуавтоматизация.
Зачем она нужна? Затем, что автоматизировать можно не всякий проект. Хотя бы потому, что у вас, начинающего автоматизатора, просто нет нужных знаний и опыта. А тестировать нужно здесь и сейчас. А проект у вас всего на пару-тройку месяцев. И помимо него еще целая куча разных дел. В таком случае вкладываться в автоматизацию просто бессмысленно - пока вы настроите нормальный тестовый фреймворк, напишите все тесты, которые хотели - уже все. Проект сдан, тесты больше не нужны, пойдем по новой. Но ведь автоматизировать хочется. И даже не столько потому, чтобы навык приобрести, сколько потому, что без робота работа превращается в рутину. Только представьте себе - чтобы проверить логику внутри вашего приложения, вам почти на каждый чих, на каждое действие нужно выполнить предусловие по созданию какого-то объекта, чаще всего карточки - карточки клиента, карточки здания, карточки чего-то еще... Создаем карточку раз, создаем карточку два, создаем карточку три... создаем карточку одна тысяча сто восемьдесят шесть... И каждый раз заполняем одни и те же поля. И вот здесь нам и поможет наш робот - заполняем карточку один раз, пока пишем программу, а потом робот это делает за нас! Заманчиво, не правда ли? А ведь это еще и легко осуществимо! Для создания робота не надо владеть знаниями языка на уровне младшего разработчика. Достаточно знать простые основы. И инструменты, которые помогут нам решить проблему. Сегодня я хочу показать возможности инструмента Watin, добавив его в вашу копилку знаний. Watin - Web Application Testing in .Net. Последователь Watir - Web Application Testing in Ruby, созданный для того, чтобы писать простые и понятные, легко-читабельные тесты на языке .Net. Имеющий свои недостатки, но, тем не менее, отлично подходящий для такой работы, как быстрая помощь себе в написании робота. Возьмем конкретный пример - демо-сайт гипермаркета, форму обратной связи. Допустим, мы разрабатываем внутреннее приложение для данного гипермаркета. И когда пользователь заполняет данную форму, в нашей системе заводится новая карточка. Которую можно двигать по статусам - новая, в процессе, ожидает чего-то, выполнено, отклонено итд. Чтобы тестировать движение по статусам, нам надо заполнять эту форму, создавая, таким образом, в своей системе новую карточку. Допустим также, что наше приложение пишется на C# и у нас уже есть Microsoft Visual Studio, в которой работают наши разработчики. Давайте напишем простенького робота с использованием Watin, который будет заполнять форму обратной связи корректными данными (что важно! Если заполнять какими попало данными, это уже проще и вполне можно сделать вручную) за нас. Итак, открываем Microsoft Visual Studio и начинаем делать робота: 1. Создаем новый проект. File - New - Project - Windows Forms Application. Открывается форма нашего приложения
2. Добавим на эту форму кнопку, которая будет инициировать заполнение нашей формы обратной связи. Таким образом, если в наше приложение попадают запросы на обратную связь с разных сайтов, мы можем сделать заполнение форм на всех сайтах в одном роботе, а потом просто запускать его и выбирать, форму какого сайта мы хотим заполнить в данный момент. View (находится в панели инструментов) - Toolbox - All Windows Forms - Button
Перетаскиваем Button на форму нашего приложения, зажав левую кнопку мыши. Теперь мы можем изменить ее размеры и задать ей любое имя в окне Properties - параметр Text.
3. Дабл-клик по кнопке - открывается метод button1_Click, который будет выполняться при нажатии на эту кнопку. Метод будет написан с использованием Watin, поэтому переходим к следующему шагу. 4. Подлючаем NuGet. Tools - Extention Manager - Online Gallery - NuGet Package Manager. NuGet нужен для того, чтобы иметь возможность находить, устанавливать и обновлять библиотеки (Watin - это тоже библиотека, которая подключается к нашему приложению и позволяет писать автоматизированные тесты или, в нашем случае, робота) прямо из Microsoft Visual Studio. После установки приложения пользователю предлагается перезапустить студию - перезапускаем, сохраняя все внесенные в нее ранее изменения. 5. Подключаем Watin. Tools - Library Package Manager - Manage NuGet Packages for Solution... Открывается NuGet Manager - вбиваем в строку поиска "Watin" и устанавливаем его Во время установки NuGet спросит, для каких проектов подключать данную библиотеку - выбираем наш проект, единственный. 6. Настраиваем приложение Чтобы наше приложение могло работать с Watin, нам необходимо изменить его фреймворк. Нажимаем на названии нашего приложения и открываем его свойства. Giper - Properties. Видим, что по умолчанию используется .Net 4.0 Client Profile Меняем это значение на .Net 4.0. Так как Watin не умеет работать с Client Profile и без данной настройки робот просто не запустится. 7. Настраиваем Watin Чтобы запустить робота, необходимо будет собрать проект. Когда проект собирается, библиотеки копируются в директорию bin. Если этого не происходит - то во время вызова методов, для которых нужна нескопировавшаяся библиотека, приложение падает с ошибкой. Чтобы библиотеки Watin копировались в папку bin, их надо настроить. Всего у данного инструмента 3 библиотеки:
Watin.Core настроена правильно, а у двух других необходимо установить параметр Copy Local = True. Устанавливая данный параметр, мы позволяем копировать библиотеки. Но, чтобы выставить данный параметр (который заблокирован), надо исправить другой, Imbed Interop Types на значение False. Итого - для настройки Watin необходимо у двух библиотек
Установить следующие параметры
8. Подключаем App.config App.config - конфигурационный файл, в котором прописано, что наше приложение будет в режиме STA (Single Tread Apartment) взаимодействовать с COM (Component Object Model). Зачем он нужен? Так как Watin поддерживает только Internet Explorer (и firefox младших версий), а Internet Explorer работает только в режиме STA. Содержимое файла App.config всегда можно посмотреть на сайте http://watin.org/. Щелкаем по названию проекта правой кнопкой мыши - Add - New Item... Добавляем файл, устанавливаем у него в настройках значение Copy to Output Directory = Copy always. Аналогично библиотекам Watin, данный файл должен быть доступен для копирования в директорию bin. 9. Пишем код! Конечно, описание настроек может показаться пугающим, но на самом деле это все выполняется очень быстро, и мы можем переходить к основной части - к написанию робота. Что должен делать робот? Открыть в браузере определенную страницу, заполнить текстовые поля какими-то значениями и нажать на кнопку "Очистить поля" (мы не будем нажимать "отправить", чтобы не рассылать спам, у нас ведь просто тестовое приложение). Какими значениями будем заполнять поля? Ну, какими-то надо... Крайне нежелательно "зашивать" такие значения прямо в код - слишком сложно потом будет это изменять. Поэтому добавляем в наш проект еще один файл (формата XML) по уже известному сценарию Назовем его Data.xml. Сразу установим у него свойство Copy to Output Directory = Copy always. Добавляем в наш файл информацию, которой мы хотим заполнять наши поля <?xml version="1.0" encoding="utf-8" ?> Общая структура данного файла:
Данный файл можно заполнить сразу, можно заполнять постепенно, во время написания кода. Возвращаемся к методу button1_Click. В первую очередь необходимо открыть браузер. Так и пишем: //открыли браузер Мы обозначили, что в качестве браузера будем использовать Watin-овский браузер IE. И что, открыв его, мы выведем его на передний план (метод BringToFront), чтобы видеть все, что делает робот. Дальше нам нужно открыть страницу обратной связи, которую мы будем заполнять. Можно заодно еще и XML прочитать, тот самый Data.xml, из которого мы будем забирать данные //перешли на нужную форму, прочитав по пути XML Здесь мы уже используем стандартный класс XmlDocument, который позволяет работать с документами заданного формата. Метод load подгружает данные из файла. Конструкция Path.GetFullPath позволяет указывать не полный путь к файлу, а относительный – относительно нашего проекта. Так как файл находится в корневом каталоге проекта, то можно просто указать его название. Далее, чтобы заполнить поля, нам нужно выбрать значение, которым мы заполним данное поле. В файле Data.xml можно указать хоть 100 различных вариантов, так какой из них выбрать? Конечно, рандомный! //Получаем рандомные значения из XML В данном куске кода мы считали из файла Data.xmlдочерние элементы (то есть теги <Форма/>), получив массив значений – и выбрали рандомное значение из этого массива. Считать значения мы считали, но, чтобы их использовать, необходимо присвоить неким переменным данные значения. Записываем все строки в виде string firstName = form.Attributes["firstName"].Value; То есть в параметр firstName, который является строкой, мы записываем значение из выбранной рандомной формы form. Какое значение? Значение параметра firstName. Все! Параметры у нас есть, теперь можно заполнить форму: browser.TextField(Find.ByName("firstname")).TypeText(firstName); Все текстовые поля мы находим по имени (используя fairbug, планиг для firefox, мы можем найти любой элемент и получить значение его параметра name). Ввод текста – функция TypeText. Что именно вводим? Значение, хранящееся в параметре firstName, которому мы недавно присвоили значение из файла Data.xml. Особое внимание хочу уделить списку выбора стран и полю email. Список стран – это уже не текстовое поле, а список выбора, SelectList. Находим его точно также, по имени, а потом просто указываем параметр, который хотим выбрать. Почему же email заслуживает отдельного внимания? А потому, что если мы напишем browser.TextField(Find.ByName("email")).TypeText(email); То робот оставит поле email пустым. Воспользуемся плагином Firefinder и найдем все текстовые поля. И что же мы видим? На форме есть два поля с name = email. Но робот – не человек, ему что сказали, то он и делает. Сказали найти по имени? Нашел и попытался заполнить. Первый попавшийся элемент. Дальше робот не пойдет, поэтому его надо направить, точно указав, что мы хотим заполнить именно второе поле с name = email. browser.TextField(Find.ByName("email") && Find.ByIndex(1)).TypeText(email); Вот так найдет, вот так заполнит. А мы идем дальше. Заполнив формочку, нажимаем «Очистить поля» - это кнопка, то есть Button, нам надо ее найти, а потом на нее нажать: browser.Button(Find.ByValue(" Очистить поля ")).Click(); Вот и все! Робот готов. Сохраняем проект и собираем его – Ctrl + Shift + S, Ctrl + Shift + B. Нажимаем F5 – и видим, как Watin выполняет всю нудную работу самостоятельно. Ну а мы можем сходить и налить себе кофе, ведь еще столько всего протестировать надо будет! В осенней автоконфетке я показала, как создавать такого робота, наглядно, уложившись в 20 минут. Потратьте один раз пол часика-час на создание робота, а потом сосредоточьтесь на более важных заданиях, нежели заполнение одной и той же формы. Если перед Вами встанет подобная задача – помните, что всегда можно найти инструменты, которые облегчат Вам жизнь. Ну а если Вы хотите больше узнать про инструмент Watin и его применение для «полноценной» автоматизации (без участия человека) – приходите на «Базовый курс по Watin» Код робота, созданного в статье, можно скачать отсюда. |