如何在Selenium-java中将页面对象与代码逻辑分离

如何在Selenium-java中将页面对象与代码逻辑分离,java,selenium,selenium-webdriver,pageobjects,Java,Selenium,Selenium Webdriver,Pageobjects,我正在学习并尝试在selenium中将定位器与实际代码分开。我已经将它们分开了,但我需要更多优化方面的指导,我如何才能对代码进行更多优化?页面对象设计模型是否仅用于存储定位器?或者我们也可以存储他们的方法。有人能解释一下下面的代码吗 链接: 使用LogicTC_01Test.java和Base.java类初始化驱动程序的实际代码 下面是为上述测试用例创建的页面ObjectTC_01.java的代码 回答您的问题-是的,您也可以在PO类中存储方法。此外,这是一个很好的做法。 关于代码优化,最好是表

我正在学习并尝试在selenium中将定位器与实际代码分开。我已经将它们分开了,但我需要更多优化方面的指导,我如何才能对代码进行更多优化?页面对象设计模型是否仅用于存储定位器?或者我们也可以存储他们的方法。有人能解释一下下面的代码吗

链接:

使用LogicTC_01Test.java和Base.java类初始化驱动程序的实际代码

下面是为上述测试用例创建的页面ObjectTC_01.java的代码


回答您的问题-是的,您也可以在PO类中存储方法。此外,这是一个很好的做法。 关于代码优化,最好是表达业务行为,而不是细粒度的技术操作。另外,您可以简单地在PO类中执行这些操作,而不是返回WebElement方法,然后在测试类中单击、发送键等执行操作。 检查下面的代码

    public void enterFirstName() {

        driver.findElement(firstName).sendKeys("abc");
    }

    public void enterLastName() {

        driver.findElement(lastName).sendKeys("qwerty");
    }

    public void pressSubmitButton() {

        driver.findElement(submitButton).click();
    }
// instead of invocation all of these methods above in test class you can simply do this:

    public void loginWithValidCredentials(String firstNameValue, String lastNameValue) {
        driver.findElement(firstName).sendKeys(firstNameValue);
        driver.findElement(lastName).sendKeys(lastNameValue);
        driver.findElement(submitButton).click();
    }

// Thus your test will look like:

@Test
public void loginTest() {
    POclass po = new POclass();
    po.loginWithValidCredentials("yourName", "yourNameABC");
    // some assert() methods...
}
这要简单得多。 顺便说一句,了解和使用PageFactory概念很有用-


注意-阅读责任链模式,但如果你对Java很精通,因为这是一个非常高级的主题。

这很有帮助,只想知道一件事-那么页面对象类文件中是否包括切换到框架、窗口句柄、迭代不同窗口选项卡等方法?@AniketWarade yeah,这将是一个很好的做法。基本上,您需要隐藏PO及其方法中的所有技术细节,因为它只允许您在测试中调用业务逻辑方法。
public class TC_01 {

    WebDriver driver;

    public TC_01(WebDriver driver) {
        this.driver = driver;
    }

    // driver.findElement(By.xpath("//a[@id='get_sign_in']"))

    // mobileNumber= driver.findElement(By.xpath("//input[@id='authMobile']")

    // driver.findElement(By.id("mobileSubmitBtn"))

    // driver.findElement(By.xpath("//div[@class='popContent']/a"))

    By signinLink = By.xpath("//a[@id='get_sign_in']");
    By signupLink = By.xpath("//a[@id='get_sign_up']");
    By mobileNumber = By.xpath("//input[@id='authMobile']");
    By submitButton = By.id("mobileSubmitBtn");
    By closePopup = By.xpath("//div[@class='popContent']/a");

    public WebElement siginLink() {

        return driver.findElement(signinLink);
    }

    public WebElement sigupLink() {

        return driver.findElement(signupLink);
    }

    public WebElement mobileNumber() {

        return driver.findElement(mobileNumber);
    }

    public WebElement submitButton() {

        return driver.findElement(submitButton);
    }

    public WebElement closePopup() {

        return driver.findElement(closePopup);
    }
}
    public void enterFirstName() {

        driver.findElement(firstName).sendKeys("abc");
    }

    public void enterLastName() {

        driver.findElement(lastName).sendKeys("qwerty");
    }

    public void pressSubmitButton() {

        driver.findElement(submitButton).click();
    }
// instead of invocation all of these methods above in test class you can simply do this:

    public void loginWithValidCredentials(String firstNameValue, String lastNameValue) {
        driver.findElement(firstName).sendKeys(firstNameValue);
        driver.findElement(lastName).sendKeys(lastNameValue);
        driver.findElement(submitButton).click();
    }

// Thus your test will look like:

@Test
public void loginTest() {
    POclass po = new POclass();
    po.loginWithValidCredentials("yourName", "yourNameABC");
    // some assert() methods...
}