首先;如果我下面使用的一些与代码相关的语言没有多大意义,我深表歉意,因为我对 Java 还比较陌生。
我有一个用于生成随机测试数据的 Java 类,并且最近添加了一个使用 Java
Faker
类生成一定数量字符的新方法。这最初用于在输入的字符数大于字符限制时断言错误消息。
public class GenerateTestData() {
public static String charactersToBeEntered;
public String characterLimitValidation(int numberOfCharacters) {
charactersToBeEntered =
faker.lorem().characters(numberOfCharacters);
return charactersToBeEntered;
}
}
我在单个网页的另一个类中有一个方法,该方法调用此方法,但是我想将其移至“公共”类中,以便其他页面可以使用它。为了这篇文章的目的,我将这个类称为
FirstPage
。
public class FirstPage {
GenerateTestData generateTestData;
static by FIRST_PAGE_INPUT = new By.ById("firstPageLocator");
public void exceedCharacterLimit() {
$(FirstPage.FIRST_PAGE_INPUT).sendKeys(
generateTestData.characterLimitValidation(301));
}
}
这由
FirstPageStepDefinitions
类用来创建 Cucumber 步骤:
public class FirstPageStepDef {
@When("I exceed the character limit")
public void iExceedTheCharacterLimit() {
firstPage.exceedCharacterLimit();
}
}
上面的代码适用于该单独的页面,测试通过,因为当提交超过 300 个字符时,会显示我在功能文件上指定的错误消息。但是,我希望使
FirstPage
类上的方法可重用,以便我可以从代码库中的其他页面(即 SecondPage
和 ThirdPage
类)调用它。
如上所述,我理想情况下希望移动该方法,并将相应的步骤定义步入名为
CommonPage
和 CommonStepDef
的类中;但是,我在重新格式化 exceedCharacterLimit
类上的 CommonPage
方法(以前在 FirstPage
类上)时遇到问题,以便它允许从 FirstPage
、SecondPage
提供动态页面定位器和 ThirdPage
课程。
本质上,我只需要了解如何使下面的
$(CommonPage.COMMON_PAGE_INPUT)
片段动态化即可实现此目的:
public class CommonPage {
GenerateTestData generateTestData;
public void exceedCharacterLimit(int numberOfCharacters) {
$(CommonPage.COMMON_PAGE_INPUT).sendKeys(
generateTestData.characterLimitValidation(numberOfCharacters));
}
}
我猜这就像在方法的第一行添加一个名为
String
的 pageLocator
,然后再声明它? - 即:
public class CommonPage {
GenerateTestData generateTestData;
public void exceedCharacterLimit(String pageLocator, int numberOfCharacters) {
String pageLocator = ?
pageLocator.sendKeys(generateTestData.characterLimitValidation(numberOfCharacters));
}
}
...这样我就可以去
FirstPage
、SecondPage
和ThirdPage
课程并做这样的事情:
public class FirstPage {
CommonPage commonPage;
static by FIRST_PAGE_INPUT = new By.ById("firstPageLocator");
public void exceedFirstPageCharacterLimit() {
commonPage.exceedCharacterLimit(
$(FirstPage.FIRST_PAGE_INPUT), 301)
}
}
到目前为止,我对该方法所做的唯一更改是,我将
numberOfCharacters
值替换为 int
,这允许我为将使用此方法的任何页面指定此值,但请这样做如果这看起来不正确,请告诉我。
感谢您提前提供的支持。
如果我理解正确的话,您想在多个页面中使用您的 exceptCharacterLimit() 方法。 为什么您需要动态告知您的测试正在使用哪个页面?无论哪种方式,您都必须定义黄瓜步骤,并且在步骤定义类中,您无论如何都会实例化正确的页面对象。 (也许我遗漏了一些东西,那部分不是很清楚)。
首先,你不能在cucumber中扩展StepDefinition类: https://stackoverflow.com/questions/69882615/youre-not-allowed-to-extend-classes-that-define-step-definitions-or-hooks#:~:text=Cucumber%20creates%20a,can% 20使用%20成分.
其次,您在页面对象模型中创建 CommonPage 或类似的内容是正确的。
我会做什么:
抽象 CommonPage ->超出限制(int limit)方法
PageA 扩展了 CommonPage
PageB 扩展了 CommonPage
等等
如果不同页面的流程略有不同,您当然可以覆盖该方法,但据我了解,您不需要这样做。
然后在 PageAStepDef 中,您将实例化 PageA 类并使用正确的参数调用该方法。