Разделы портала

Онлайн-тренинги

.
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
  • Interop.SHDocVw.dll
  • Microsoft.mshtml.dll

Watin.Core настроена правильно, а у двух других необходимо установить параметр Copy Local = True. Устанавливая данный параметр, мы позволяем копировать библиотеки. Но, чтобы выставить данный параметр (который заблокирован), надо исправить другой, Imbed Interop Types на значение False.

Итого - для настройки Watin необходимо у двух библиотек

  • Interop.SHDocVw.dll
  • Microsoft.mshtml.dll

Установить следующие параметры

  • Imbed Interop Types = False
  • Copy Local = True

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" ?>
<ФормыВвода>
<
Форма lastName="Киселева" firstName="Ольга" email=" Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript "
phone="89261234433" address1="Москва" address2="Санкт-Петербург" city="Москва"
country="Албания" info="Перезвоните, пожалуйста, опишу проблему подробнее"
/>
<
Форма lastName="Абаев" firstName="Николай" email=" Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript "
phone="84998887766" address1="Санкт-Петербург" address2="Москва" city="Москва"
country="Аргентина" info="Не звонить с 10 утра до 5 вечера!!!"

/>
</
ФормыВвода>

Общая структура данного файла:

  • Общий тег <ФормыВвода></ФормыВвода>, в котором будут перечислены различные примеры заполнения нашей формы.
  • Тег <Форма/>, который содержит в себе один конкретный пример заполнения формы.
  • Параметры <Форма/> тега, содержащие значение, которое будет подставлено роботом в форму ввода. Например, lastName="Абаев"

Данный файл можно заполнить сразу, можно заполнять постепенно, во время написания кода.

Возвращаемся к методу button1_Click.

В первую очередь необходимо открыть браузер. Так и пишем:

//открыли браузер
var browser = new IE();
browser.BringToFront();

Мы обозначили, что в качестве браузера будем использовать Watin-овский браузер IE. И что, открыв его, мы выведем его на передний план (метод BringToFront), чтобы видеть все, что делает робот.

Дальше нам нужно открыть страницу обратной связи, которую мы будем заполнять. Можно заодно еще и XML прочитать, тот самый Data.xml, из которого мы будем забирать данные

//перешли на нужную форму, прочитав по пути XML
browser.GoTo(@"http://giper.amirostudio.ru/contacts.html");
XmlDocument doc = new XmlDocument();
doc.Load(Path.GetFullPath("Data.Xml"));

Здесь мы уже используем стандартный класс XmlDocument, который позволяет работать с документами заданного формата. Метод load подгружает данные из файла.

Конструкция Path.GetFullPath позволяет указывать не полный путь к файлу, а относительный – относительно нашего проекта. Так как файл находится в корневом каталоге проекта, то можно просто указать его название.

Далее, чтобы заполнить поля, нам нужно выбрать значение, которым мы заполним данное поле. В файле Data.xml можно указать хоть 100 различных вариантов, так какой из них выбрать? Конечно, рандомный!

//Получаем рандомные значения из XML
var rnd = new Random();
var forms = doc.DocumentElement.ChildNodes;
var randomIndex = rnd.Next(forms.Count);
var form = forms[randomIndex];

В данном куске кода мы считали из файла Data.xmlдочерние элементы (то есть теги <Форма/>), получив массив значений – и выбрали рандомное значение из этого массива.

Считать значения мы считали, но, чтобы их использовать, необходимо присвоить неким переменным данные значения. Записываем все строки в виде

string firstName = form.Attributes["firstName"].Value;

То есть в параметр firstName, который является строкой, мы записываем значение из выбранной рандомной формы form. Какое значение? Значение параметра firstName.

Все! Параметры у нас есть, теперь можно заполнить форму:

browser.TextField(Find.ByName("firstname")).TypeText(firstName);
browser.SelectList(Find.ByName("country")).Select(country);

Все текстовые поля мы находим по имени (используя 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»

Код робота, созданного в статье, можно скачать отсюда.
Запустить Giper.sln, подключить Watin - см п.4 и п.5 статьи - все! Все остальное уже готово и настроено.
Можно нажать Debug (обычно f5) и смотреть, как робот работает!