Java 如何创建接受参数并验证pageobjects的页面标题的通用Cumber步骤

Java 如何创建接受参数并验证pageobjects的页面标题的通用Cumber步骤,java,spring,cucumber,Java,Spring,Cucumber,我想在我的cucumber测试点击指向不同页面的链接后验证后续页面 我想做一个网页上的链接验证。我的Cucumber测试正在解析所有链接并导航到每个链接。我想创建一个通用的Cumber步骤,该步骤将接受一些参数,通过这些参数我将验证是否打开了正确的页面 到目前为止,我创建了一个通用的Cumber步骤,它接受页面标题字符串,通过该字符串我可以验证导航是否指向正确的页面 我的黄瓜测试: Scenario Outline: As a not registered User I can visit "&

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

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

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

我的黄瓜测试:

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 
这个开关在我看来很糟糕,而且,我知道很快它将太长而难以阅读和维护

另外,我所有的PageObjects都是Springbean,可以自动连接到StepDefinition类中,但我不知道如何使我的“userIsNavigatedTo”成为
泛型,我需要传递什么作为参数,以及如何为每次迭代获取正确的PageObject。

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

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

public boolean isLoaded() {
    return pageHeader.isDisplayed();
}
您仍然可以在步骤中执行switch/case,但这样会更容易阅读,并且您可以直接断言page object方法:

Assert.assertTrue(myPage.isLoaded());

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

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

public boolean isLoaded() {
    return pageHeader.isDisplayed();
}
您仍然可以在步骤中执行switch/case,但这样会更容易阅读,并且您可以直接断言page object方法:

Assert.assertTrue(myPage.isLoaded());

为了避免切换,您可以创建一个
映射
,将页面标题映射到页面对象

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());
   }
}
公共类定义{
私人最终地图页面ObjectsIndex;
@自动连线
公共步骤定义(列出页面对象){
pageObjectsIndex=yourPageObjects.stream().collect(Collectors.toMap(page->page.getPageHeading().getText().toUpper(),Function.identity());
}
@然后(“^user被导航到“\”([^\“]*)\“$”)
public void userIsNavigatedTo(最终字符串页面标题)引发IOException{
Assert.assertTrue(pageObjectsIndex.get(pageHeading.toUpper()).isLoaded());
}
}

这些想法的副作用是,每个页面都需要有自己的类来实现PageObject接口。我写了“副作用”,因为我不确定这是缺点还是优点(可能取决于大小写;)。

为了避免切换大小写,可以创建一个
映射
,将页面标题映射到页面对象

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());
   }
}
公共类定义{
私人最终地图页面ObjectsIndex;
@自动连线
公共步骤定义(列出页面对象){
pageObjectsIndex=yourPageObjects.stream().collect(Collectors.toMap(page->page.getPageHeading().getText().toUpper(),Function.identity());
}
@然后(“^user被导航到“\”([^\“]*)\“$”)
public void userIsNavigatedTo(最终字符串页面标题)引发IOException{
Assert.assertTrue(pageObjectsIndex.get(pageHeading.toUpper()).isLoaded());
}
}

这些想法的副作用是每个页面都需要有自己的类来实现您的PageObject接口。我写了“副作用”,因为我不确定这是缺点还是优点(可能是大小写相关的;)

我认为,你在浪费大量时间进行一项价值很小的测试,而这项测试非常脆弱,并且使用了错误的断言来证明它的有效性

首先是价值的缺失:

测试的唯一价值是可以导航到特定页面。虽然这可能与您正在浏览的页面有一些关联,但要证明您在页面上有正确的链接,这是一个相当昂贵的测试。一般来说,导航是

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

  • 非页面特定的内容,即在多个页面、页眉、页脚、侧边栏上共享的菜单

第二:脆弱性

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

第三:错误断言

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


总体而言,为页面上出现的每个链接编写单独的场景将很快导致非常笨拙的测试套件。您最好使用spider来测试链接,并将重点放在测试功能上,这将隐含地证明重要的导航路径。

我认为您是在浪费大量时间进行一个价值很小的测试,它非常脆弱,并且使用错误的断言来证明它的有效性

首先是价值的缺失:

测试的唯一价值是可以导航到特定页面。虽然这可能与您正在浏览的页面有一些关联,但要证明您在页面上有正确的链接,这是一个相当昂贵的测试。一般来说,导航是

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

  • 不是爸爸的东西