【问题标题】:How to create generic cucumber step which accepts an argument and verifies page heading of the pageobjects如何创建接受参数并验证页面对象的页面标题的通用黄瓜步骤
【发布时间】:2019-07-03 17:53:27
【问题描述】:

我想在我的黄瓜测试点击指向不同页面的链接后验证后续页面。

我想验证网页上的链接。我的 Cucumber 测试正在解析所有链接并导航到每个链接。我想创建一个通用的黄瓜步骤,它将接受一些参数,我将通过该参数验证是否打开了正确的页面。

到目前为止,我创建了一个通用的黄瓜步骤,它接受页面标题字符串,通过它我验证导航是否指向正确的页面。

我的黄瓜测试:

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;
   //.....//
}

这个开关对我来说看起来很糟糕,而且,我知道它很快就会变得阅读起来太长而且难以维护。

附:我所有的 PageObjects 都是 Spring Bean,可以自动装配到 StepDefinition 类中,但我不知道如何制作我的“userIsNavigatedTo” 通用的,我需要作为参数传递的内容以及如何为每次迭代采用正确的 PageObject。

【问题讨论】:

    标签: java spring cucumber


    【解决方案1】:

    为避免切换大小写,您可以创建一个 Map&lt;String, YourPageObject&gt; 将页面标题映射到您的页面对象。

    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 接口。我写了“副作用”,因为我不确定它是缺点还是优点(可能取决于大小写;))。

    【讨论】:

    • 谢谢!那是我一直在寻找的东西。虽然我无法在 StepDefinition 的构造函数中映射 pageObjectsIndex,但是当您调用 page -> page.getPageHeading() 时,会抛出 NoSuchElementException,因为驱动程序尚未打开该页面以获取标题。只有当线程在 userIsNavigatedTo(final String pageHeading) 方法中时才会打开页面。
    • @pa 嗯,可以推迟调用 getPageHeading()。例如。您可以为页面添加名称并在场景中使用它而不是 pageHeading。您甚至可以为此使用枚举。
    • 是的,我添加了一个页面名称,在场景中,我按页面名称过滤页面,然后验证该页面标题元素。再次感谢您!
    【解决方案2】:

    因为看起来您正在使用页面对象,我建议在每个页面对象类中编写一个方法来检查是否存在元素。我的比我下面展示的要复杂一些,因为我包装了我的页面对象方法来处理异常,但一个基本的例子可能是:

    @FindBy(xpath = "//h1[.='Page Header']"
    WebElement pageHeader;
    
    public boolean isLoaded() {
        return pageHeader.isDisplayed();
    }
    

    你仍然会在你的步骤中做一个 switch/case,但它会更容易阅读,你可以直接断言页面对象方法:

    Assert.assertTrue(myPage.isLoaded());
    

    【讨论】:

    • 是的,我有这个想法,但我仍然想完全摆脱 switch,这就是为什么我在主题中将此方法称为泛型。简而言之,我想将一个 PageObject 类名作为参数传递给我的 step 方法,并且在该方法中,我会按类名调用 spring bean。我只是不知道该怎么做 :) 也许这不是最好的解决方案,所以我愿意接受任何更好的想法。
    【解决方案3】:

    我会争辩说,您正在浪费大量时间来提供价值很小的测试非常脆弱,并且使用错误的断言来证明其有效性

    首先缺乏价值:

    您的测试的唯一价值是您可以导航到特定页面。虽然这可能与您正在导航的页面相关,但要证明您在页面上拥有正确的链接,这是一项相当昂贵的测试。通常导航是要么

    • 行为的一个糟糕的替代品,即去其他页面的能力实际上是起始页面某些特定功能的一部分。因此,您最好通过使用该功能来隐式地证明导航

    • 不是页面特定的东西,即在许多页面、页眉、页脚、侧边栏上共享的菜单

    第二:脆弱

    页面标题一直在变化,页面用途很少改变。通过将导航链接到页面标题,您只是增加了更改页面标题的成本。现在这个微不足道的任务涉及修改场景和处理复杂的测试代码。

    第三:错误断言

    与其使用标题,不如使用 id 来识别页面。

    为页面上出现的每个链接编写单独的场景将很快导致一个非常笨拙的测试套件。最好使用蜘蛛来测试链接,并专注于测试功能,这将隐含地证明重要的导航路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2018-05-19
      相关资源
      最近更新 更多