首页 > 解决方案 > 使用页面对象模型在 Cucumber 中制作动态代码

问题描述

有没有办法使用 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。但这对我来说似乎是不好的做法。

标签: seleniumcucumbercucumber-jvmcucumber-java

解决方案


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();?),因为它是一种编译的编程语言;您的代码不能在运行时更改。


推荐阅读