Как создать общий шаг огурца, который принимает аргумент и проверяет заголовок страницы объекта страницы - PullRequest
0 голосов
/ 28 июня 2019

Я хотел бы проверить последующие страницы после того, как мой тест на огурцы щелкнет по ссылкам, которые ведут на разные страницы.

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

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

Мой тест на огурец:

Scenario Outline: As a not registered User I can visit "<page>"
    When user looks at the webpage
    And user clicks on "<link>" 
    Then user is navigated to "<page>"
    Examples:
      | link                                | page                                                               
      | How to register                     | Registration page                                
      | Questions & Answers                 | Login FAQ's                                    
      | Register Now                        | Create account 
      | Forgot your name or password?       | Reset Password 

Мой шаг выглядит так:

@Then("^user is navigated to \"([^\"]*)\"$")
    public void userIsNavigatedTo(final String pageHeading) throws IOException {
        switch (pageHeading) {
            case "Registration page":
                Assert.assertTrue(
                        howToRegisterPage.getPageHeading().getText()
                                .equalsIgnoreCase(pageHeading)
                );
                break;
            case "Login FAQ's":
                Assert.assertTrue(
                    questionsAndAnswersPage.getPageHeading().getText()
                            .equalsIgnoreCase(pageHeading)
                );
                break;
   //.....//
}

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

P.S. Все мои объекты PageObject являются Spring Beans и могут быть автоматически подключены к классу StepDefinition, но я понятия не имею, как я могу сделать мой "userIsNavigatedTo" в общем, что мне нужно передать в качестве аргумента и как я могу использовать правильный PageObject для каждой итерации.

Ответы [ 3 ]

2 голосов
/ 29 июня 2019

Чтобы избежать переключения, вы можете создать Map<String, YourPageObject>, который отображает заголовок страницы на объект вашей страницы.

public class StepDefinition{
  private final Map<String, YourPageObject> pageObjectsIndex;

  @Autowired
  public StepDefinition(List<YourPageObject> yourPageObjects){
    pageObjectsIndex = yourPageObjects.stream().collect(Collectors.toMap(page -> page.getPageHeading().getText().toUpper(), Function.identity());
  }

  @Then("^user is navigated to \"([^\"]*)\"$")
   public void userIsNavigatedTo(final String pageHeading) throws IOException {
     Assert.assertTrue(pageObjectsIndex.get(pageHeading.toUpper()).isLoaded());
   }
}

Побочным эффектом этой идеи является то, что каждая страница должна иметь свой собственный класс, который реализует интерфейс YourPageObject. Я написал «побочный эффект», потому что я не уверен, является ли это недостатком или преимуществом (возможно, это зависит от случая;)).

0 голосов
/ 03 июля 2019

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

Прежде всего, отсутствие ценности:

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

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

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

Секунда: Хрупкость

Заголовки страниц меняются постоянно, назначение страницы меняется редко.Связывая навигацию с заголовком страницы, вы просто увеличиваете стоимость изменения изменения заголовка страницы.Теперь эта тривиальная задача включает в себя изменение сценариев и работу со сложным тестовым кодом.

В-третьих: неправильное утверждение

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

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

0 голосов
/ 28 июня 2019

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

@FindBy(xpath = "//h1[.='Page Header']"
WebElement pageHeader;

public boolean isLoaded() {
    return pageHeader.isDisplayed();
}

Вы бы все еще делали переключатель / регистр на своем шаге, но он читался бы легче, и вы могли бы напрямую утверждать метод объекта страницы:

Assert.assertTrue(myPage.isLoaded());
...