Selenium-Java:如何动态指定页面定位器?

问题描述 投票:0回答:1

首先;如果我下面使用的一些与代码相关的语言没有多大意义,我深表歉意,因为我对 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
,这允许我为将使用此方法的任何页面指定此值,但请这样做如果这看起来不正确,请告诉我。

感谢您提前提供的支持。

java selenium-webdriver element pageobjects faker
1个回答
0
投票

如果我理解正确的话,您想在多个页面中使用您的 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 类并使用正确的参数调用该方法。

© www.soinside.com 2019 - 2024. All rights reserved.