使用页面对象模型在Cucumber中创建动态代码

时间:2019-12-04 19:51:13

标签: selenium cucumber cucumber-jvm cucumber-java

有没有一种方法可以使用Cucumber动态执行动作?

示例:

功能文件:

Scenario: Click all the boxes
    Given On the checkbox page
    When Click checkboxA
    And Click checkboxB

步骤定义:

@When("Click checkboxA")
public void clickCheckBoxA()
{
   pageObject.checkBoxA.click();
}

@And("Click checkboxB")
public void clickCheckBoxB()
{
   pageObject.checkBoxB.click();
}

在这种情况下,有两个非常相似的步骤定义。之所以有两个不同的定义,是因为每个WebElement是在pageObject类中定义的。有没有一种方法可以动态传递我们要单击的复选框,而不是让两个单独的方法执行相同的操作?

我想做到这一点的唯一方法是在功能步骤中将选择器作为参数传递,并在步骤定义方法中实例化webElement。但这对我来说似乎是一种坏习惯。

2 个答案:

答案 0 :(得分:1)

Click是您的步骤。对于您可能要单击的每个项目,它不应是唯一的。您应使用正则表达式匹配要单击的内容。以下将您的两个步骤合为一体。

@When("^Click (.*)$")
public void clickElement(String elementToClick) {
  switch (elementToClick) {
  case "checkBoxA":
    pageObject.checkBoxA.click();
  case "checkBoxB":
    pageObject.checkBoxB.click();
  }
}

我建议使用更智能的正则表达式匹配(这是懒惰和草率的),您还可以为要单击的元素创建一个新变量,将其值分配给每个case中的现有元素,并在click()语句之后,只需调用switch

关于“动态”执行此操作的问题,您不能在Java中执行(我想您在上面给出的示例中pageObject.elementToClick.click();中考虑过一行吗?),因为它是一种编译的编程语言;您的代码无法在运行时更改。

答案 1 :(得分:1)

我更喜欢使用@mike的解决方案,但是在某些情况下,我倾向于在POM中将定位符创建为字符串,以便减少步骤定义中的代码行。

功能文件:

Scenario: Click all the boxes
  Given On the checkbox page
  When Click checkbox A
  And Click checkbox B

POM:

private String checkBox = "//input[text()='checkBox%s']";

步骤定义:

@When("Click checkbox (.*)")
public void handleCheckBox(String checkBoxName) {
    driver.findElement(By.xpath(String.format(checkBox, checkBoxName))).click();
}