среда, 28 декабря 2011 г.

Самописный робот на Watin

Что мы делаем, когда нам позарез необходимо заполнить форму с кучей полей для того, чтобы перейти непосрественно к тестируемому модулю?

Обычно мы начинаем вводить во все поля что-то типа "шлмцтал" (танец пьяных пальцев по клавиатуре) и сильно раздражаемся полям, в которых есть ограничения, дата рожения, например. Ну мы же сейчас не эту форму тестируем, нам все это только мешает.

Если мы хотим видеть на выхлопе нормальные данные, а не свои пьяные танцы, то можем использовать копипасту. Однако радости мало каждое поле копировать - вставлять.

Еще варианты? Правильно! Роботы!
Один из самых известных - imacros для мозиллы. Простой, удобный и тд.

Но мы же не ищем легких путей, правда? И вообще, мы хотим видеть разные значения! И еще вооон туда перламутровых пуговиц, пожалуйста.

Тогда на помощь нам приходят... самописные роботы!

Об одном мы с вами и поговорим. Microsoft Visual Studio + Watin преставляют...

Итак. что мы хотим? Хотим заполнить форму. Или две формы. Одинаковые по сути, но разные по смыслу. Ну, например, представим, что у нас везде, на всех сайтах, окно регистрации одно и тоже. И вот мы хотим регистрироваться в Гугле и Яндексе. А формы - одни и те же, поля теже самые. Ну вот захотелось им так.

Что делаем мы? Открываем Microsoft Visual Studio и создаем "Windows Forms Application"
Получаем нашу формочку:



Далее выбираем View - Toolbox
В открывшемся окошке раздриливаем All Windows Forms  и выбираем кнопку:




Перетаскиваем кнопку на нашу формочку.
Справа внизу видим ее свойства, Properties - вбиваем там в поле Text значение "Регистрируемся в Google". Потом добавляем вторую, которая будет - "Регистрируемся в Yandex".

Дабл-клик по кнопке - мы переходим в код, который будет выполнять наша кнопка. Точнее, дизайнер, в котором мы рисовали кнопку, сгенерит событие "нажатие на кнопку". А метод, который мы напишем "в кнопке", будет вызываться при генерации этого события.

Теперь вступает в силу Watin.

Создаем отдельный проект - Class Library, в нем создаем класс "Model"
В модели мы показываем, с кем и как мы имеем дело:
        private WatiN.Core.Browser browser;

        public Model(Browser browser)
        {
            this.browser = browser;
        }

        public void РегистрируемсяВGoogle()
        {
            browser.GoTo(@"http://adress");
        }

        public void ЗадатьФамилию (string lastName)
        {
            browser.TextField(Find.ById("txtLastName")).TypeText(lastName);
        }

        public void ЗадатьИмя (string firstName)
        {
            browser.TextField(Find.ById("txtFirstName")).TypeText(firstName);
        }


Мы сказали, что будем использовать ватиновский браузер, с помощью метода "регистрируемся" будем переходить на ссылку регистрации в гугле (как вариант - потыкаться в некие кнопочки - предусловия вашей формы), остальные методы - это наши поля.

Находим их через FireBug, получаем id, class и тд. По ним и ищем. Просто и быстро)

Вбивать параметры мы можем как? Можем уже в тестах. Можем добавить файл в проект (уже в наш "Windows Forms Application", а не "Class Library").

Если делаем файлом: обавляем в проект файл типа XML File.
Заполняем его своими разными значениями.

<ФормыВвода>
 <Форма lastName="Киселева" firstName="Ольга"
         />
<Форма lastName="Абаев" firstName="Николай"
         />
</ФормыВвода>


Что мы ему сказали? Что у нас есть два вариант заполнения формы - Киселева Ольга и Абаев Николай. Все параметры записываем через пробел, пихаем сколько влезет, как параметров, так и вариантов.

Теперь вернемся к коду робота. Который открывается аблкликом по кнопке на нашей форме.

Что мы пишем в нем?

    public partial class Робот : Form
    {
        public Робот()
        {
            InitializeComponent();
        }

        private void btnHellow_Click(object sender, EventArgs e)
        {
            //открыли браузер
            var rnd = new Random();
            var browser = new IE();
            browser.BringToFront();

            //перешли на нужную форму, прочитав по пути  XML
            var моделька = new Model(browser);
            моделька. РегистрируемсяВGoogle ();
            моделька.ОткрытьФормуРегистрации();
            XmlDocument doc = new XmlDocument();
            doc.Load(Path.GetFullPath("Data.Xml"));

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

            //Присваиваем переменным значения из XML
            string lastName = form.Attributes["lastName"].Value;
            string firstName = form.Attributes["firstName"].Value;
            bool alert = bool.Parse(form.Attributes["alert"].Value);

            //Заполняем формочку
            моделька.ЗадатьФамилию (lastName);
            моделька.ЗадатьИмя (firstName);          

            моделька.ПодтвердитьРегистрацию();
        }

Я туда помимо Фамилии и Имени добавила значение чек-бокс, в котором стоит галка, или не стоит. В XML мы этому параметру присваиваем значение true\false.

Таким образом, что мы имеем? Мы имеем по нажатию на кнопочку заполнение формы любым из приведенных вариантов.

И это самый простой способ. Можно сделать и так, что он каждому полю будет выдавать один из N вариантов, тогда у нас получится не всего 3 варианта заполнения, а N степень вариантов ))))

Также это приложение теперь можно сохранить для тех коллег, у кого нет Студии - включаем режим релиза:



Компилируем наш проект.
(Если хотим исходный код отправить - полезно сделать так: Build - Clean Solution. Так он меньше места занимать будет)

Потом открываем папку с нашим приложением\bin\Release
Удаляем все лишние файлы - с расширениями pdb и xml (кроме того, который используем в проекте).

Потому всю папку Release упаковываем и отсылаем по почте :)

1 комментарий: