Совместим ли Ruby со строгим шаблоном объекта страницы?

Я создал различные схемы автоматизации тестирования, используя шаблон объекта страницы с Java (https://code.google.com/p/selenium/wiki/PageObjects).

Два из моих больших преимуществ:

1) Вы можете видеть, какие методы доступны, когда у вас есть экземпляр страницы (например, ввод homepage. покажет мне все действия/методы, которые вы можете вызывать с домашней страницы)

2) Поскольку методы навигации (например, goToHomepage()) возвращают экземпляр следующей страницы (например, домашняя страница), вы можете перемещаться по своим тестам просто, написав код и увидев, где он вас принимает.

например.

WelcomePage welcomePage = loginPage.loginWithValidUser(validUser);
PaymentsPage paymentsPage = welcomePage.goToPaymentsPage();

Эти преимущества отлично работают с Java, поскольку тип объекта (или страница в этом случае) известен IDE.

Однако, с Ruby, тип объекта не фиксируется в какой-либо точке и часто неоднозначен для среды IDE. Поэтому я не могу понять, как вы можете реализовать эти преимущества для набора автоматизации, построенного с использованием Ruby (например, с помощью Cucumber).

Может ли кто-нибудь показать мне, как использовать Ruby с шаблоном Object Object, чтобы получить эти преимущества?

Ответы

Ответ 1

Из некоторого дальнейшего исследования, похоже, что первоначальное требование может быть выполнено с использованием переменных экземпляра:

Given(/^I am on the launch page$/) do
  @launch_page ||= LaunchPage.new
end

When(/^I open the set alarm time page$/) do
  @set_alarm_page = @launch_page.goto_set_alarm_page
end

When(/^I open our apps from the home page$/) do
  @launch_page.navigation_toolbar.open_our_apps
end

Then(/^I should see the homepage alarm time is (\d+)$/) do |alarm_time|
  alarm_time_actual = @launch_page.get_alarm_time
  assert_equal(alarm_time, alarm_time_actual)
end

До тех пор, пока где-то в классе определения шага вы явно создаете новый объект страницы (в приведенном выше примере: LaunchPage.new), тогда появятся все последующие страницы и предоставят значения метода/свойства intellisense.

Ответ 2

Я использую Spinach вместо Cucumber - он почти идентичен, но этапы заключены в класс, который уникален для этого файла функций, - поэтому нет утечки объектов за пределами текущей области.

https://github.com/codegram/spinach

Ответ 3

Из беседы с коллегами я подозреваю, что лучшим решением может быть следующее (но, пожалуйста, отправьте альтернативный ответ, если существует лучшее решение):

When(/^I buy a movie from the movie page$/) do
  movie_page = MoviePage.new
  movie_page.buyMovie("Test Movie")
  purchase_page = PurchasePage.new
  purchase_page.confirmPurchase
end

Итак, в приведенном выше примере мы не возвращаем экземпляры следующей страницы при навигации по странице (поскольку возвращаемая страница просто будет неизвестным типом объекта). Кроме того, нам нужно создать новый экземпляр любой страницы, на которой мы находимся (с использованием ".new" ), чтобы, по крайней мере, мы могли получить преимущества intellisense от ввода "movie_page". и видя, какие действия/методы доступны на этой странице.

Есть ли у кого-нибудь лучшие решения?