Подтвердить что ты не робот

Связана ли компоновка объектной модели страницы с огурцом?

С помощью модели объектной модели тестирования мы свяжемся с страницами следующим образом:

WebDriver driver = new WebDriver()
HomePage homePage = new HomePage(driver);
LoginPage loginPage = homePage.GoToLoginPage();
WelcomePage welcomePage = loginPage.Login();
etc
etc

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

Однако с Охотником, каждая строка выше должна составлять отдельный "Шаг" и, следовательно, отдельный метод. Поэтому, как это можно сделать?

Является единственным способом разместить экземпляры классов объектов страницы (например, homePage, loginPage и т.д.) в хранилище стойких перекрестных узоров (например, как потоки POCO или "Мир" )?

4b9b3361

Ответ 1

Хорошо, поэтому, обратившись к многочисленным разработчикам и специалистам по автоматизации тестирования, кажется, что решение продолжать соединять [e.g. WelcomePage welcomePage = loginPage.loginWithValidUser(validUser)] - это путь.

Чтобы сохранить экземпляр объектов страницы на разных этапах (например, welcomePage в примере выше), вы можете использовать инструмент инъекции зависимостей (создание функциональности, аналогичной расширениям World в Ruby, реализация огурца).

Вот дополнительная информация: https://cukes.info/docs/reference/java-di

Однако большинству проектов будет полезен модуль Injection Dependency лучше упорядочить ваш код и разделить состояние между Step Определения.

Дополнительная информация от SpecFlow (официальная реализация огурца .net):

http://specflow.org/getting-started/beyond-the-basics/

И, наконец, я создал целый блог в этой области, который может помочь людям, поскольку взаимодействие с объектом gherkin/page object вызывает у меня большой интерес:

http://www.seligmanventures.com/dev-blog/test-automation-page-object-model-with-gherkin

Ответ 2

Когда дело доходит до большинства веб-сайтов (где может использоваться URL-адрес), на мой взгляд, лучше всего использовать URL-адрес вместо действия, чтобы получить тот же URL-адрес.

Например:

# Suggested by OP:
driver = Selenium::Webdriver.for :chrome, prefs: prefs
homepage = Homepage.new(driver)
login = homepage.go_to_login
welcome = login.log_in_as('dave4429')

# My Suggestion:
homepage = Url.new('/')
login = Url.new('/login')
welcome = Url.new('/welcome')

Это означает, что вы начинаете с URL-адреса вместо того, чтобы начинать работу на главной странице для каждого теста. У вас все еще есть методы, которые вы предложили, но они будут использоваться в других областях, чтобы убедиться, что пользователь может получить доступ к странице с помощью других средств, кроме URL.

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

"Объекты страниц сами по себе никогда не должны делать проверки или утверждения. Это часть вашего теста и всегда должна быть в коде тестов, а не в объекте страницы". - Selenium HQ

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

google = Project::Pages::Google.new

google.search_for('Hello, World!')
expect(google.found_result?).to_equal(true)

Edit

В дополнение к этому у вас, похоже, есть неправильное представление о том, как Огурцы работают с Геркиным.

Вы можете иметь несколько строк кода на каждый шаг, так как сам шаг представляет собой описание действий на шаге.

Например:

Given I am logged in as "dave4429"
When I have submitted the "Contact Us" form with the following data:
   | [email protected] | David McBlaine | I want to find out more about your Data Protection services, can I talk to a staff member or get a PDF? |
Then an email should be sent to "[email protected]" with the details specified

Определение для "Когда" может выглядеть так:

When(/^I have submitted the "Contact Us" form with the following data:$/) do |table|
  rows = table.raw
  row = rows[0]

  contact_us.fill_form({email: row[0], username: row[1], message: row[2]})
  contact_us.submit_message
  expect(browser.title).to_equal("Message Sent!")
end

Все зависит от того, насколько вы нарушите шаги в определении.

Изменить # 2

Мне также ясно, что вы хотите сделать цепочку методов, что-то вроде contact_us.fill_form({email: row[0], username: row[1], message: row[2]}).submit_message, что опять же не может быть и речи при использовании методов, которые я предлагаю, но вопрос о том, эта цепочка должна быть для каждой отдельной страницы, или все должно быть включено в один класс или модуль, на которые могут отвечать только ваши потребности.

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

Ответ 3

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