有没有一种方法可以使用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。但这对我来说似乎是一种坏习惯。
答案 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();
}