AT.info ПОСИДЕЛКИ  vKontakte   facebook группа  
Page Object

Автоматизация Ajax с помощью Selenium, BDD и Page Object

Одна сложность, с  которой сталкиваются тестеры, когда они начинают управлять браузерами с помощью Cucumber, - как управлять сайтами, которые содержат множество Ajax вызовов.

Они пишут скрипты, которые предполагают, что элементы на странице существуют, и очень удивлены, когда тесты не проходят, потому что они пытаются получить доступ к тому, чего еще не было на странице.

В этой статье я напишу простой сценарий, который демонстрирует асинхронные действия обработки Page Object gem. Я также кратко ознакомлю Вас с новым Gem, который я использую для создания моих новых проектов. Я сделаю все это написанием  сценария, который использует один из примеров, который Google предоставила для демонстрации GWT библиотеки. Для тех из вас, которые посетили один из моих уроков, вы уже знакомы с этим примером, но, возможно есть еще несколько новых вещей для вас для изучения. Давайте начнем писать код!

Создание проекта

Первое, что мне нужно сделать, - это создать структуру моего  проекта. Я думаю, я буду использовать Page Object gem с  Selenium. Давайте использовать testgen gem для запуска. Если у вас нет установленного  gem, вы можете просто выполнить gem install testgen. Вот команда, которую я использовал для создания своего проекта:

testgen project ajax_example --pageobject-driver=selenium

Это создает всю структуру проекта. Давайте быстро проверим, все ли в порядке. Первое, что нужно сделать, это убедиться, что все gem установлены. Testgen создал Gemfile файл для нас, теперь все, что нужно нам сделать, - это изменить на вновь созданные ajax_example каталог и выполнить bundle install.

Теперь, когда мы уверены, что у нас все gem установлены,  пришло время для запуска Сucumber. Testgen создал Rakefile для нас, чтобы сделать это легко. Просто введите rake команду в ajax_example каталоге. Вы должны увидеть следующее:

Using the default profile...

0 scenarios

0 steps

0m0.000s

Теперь мы готовы к написанию сценария.

Написание сценария

Мы будем использовать пример DynaTable с сайта GWT. Вот эта страница. На этой странице выберите checkbox «день», а затем классы, предлагаемые на этот день, отображаются в строке с именем  профессора. Давайте попробуем написать сценарий.

Я начинаю с создания файла в каталоге функций. Вот содержание:

Feature: Displaying class schedules

I need to be able to display the class schedule for professors.  When I
select a day the page should display all of the class taught by professors
on that day as well as the time for the classes.

  Scenario: Displaying classes offered by professors
    Given I am on the google dynamic table page
    When I view the schedule for "Monday"
    Then I should see that "Inman Mendez" offers a class at "Mon 9:45-10:35"
    When I view the schedule for "Tuesday"
    Then I should see that "Inman Mendez" offers a class at "Tues 2:15-3:05"
    And I should see that "Teddy Gibbs" offers a class at "Tues 10:00-10:50"

Заметьте, что я ничего не сказал о нажатии кнопок или checkboxes. Также заметьте, что я никоим образом не указал, как находятся или отображаются на странице класс или имя инструктора. Как вы думаете, почему я это сделал? В будущих статьях у меня  будет намного больше, что рассказать об этом.

Мой следующий шаг заключается в создании шага определений. Для этого я снова выполню команду ‘rake’. Cucumber достаточно хорош для создания шагов ожидания.

Given /^I am on the google dynamic table page$/ do
  pending # express the regexp above with the code you wish you had
end

When /^I view the schedule for "([^\"]*)"$/ do |arg1|
  pending # express the regexp above with the code you wish you had
end

Then /^I should see that "([^\"]*)" offers a class at "([^\"]*)"$/ do |arg1, arg2|
  pending # express the regexp above with the code you wish you had
end

Я знаю, что  собираюсь создать объект страницы, но в первую очередь я хочу подумать о том, как этот объект будет выглядеть. Я думаю, что я напишу код, который я бы хотел иметь через пару определений. Вот то, что я получил:

When /^I view the schedule for "([^\"]*)"$/ do |day|
  page.select_schedule_for day
end

Then /^I should see that "([^\"]*)" offers a class at "([^\"]*)"$/ do |name, expected|
  page.schedule_for(name).include? expected
end

Да. Я думаю, что именно так я хочу взаимодействовать со страницей объекта. Эти шаги определений незавершенные. Я только что написал достаточно, чтобы понять, что мне нужно добавить на страницу объект, который  я собираюсь писать. Теперь, давайте писать.

RSS-материал