有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

链接:https://www.goibibo.com/

带有逻辑(TC_01Test.java)和基的实际代码。java类初始化驱动程序


public class TC_01Test extends Base {

    WebDriver driver;

    @BeforeTest
    public void initialize() throws IOException {

        driver = initializeDriver();
    }

    // Sign In functionality
    @Test
    public void SignIn() throws InterruptedException {

        TC_01 tc02 = new TC_01(driver);
        tc02.siginLink().click();
        System.out.println(driver.getWindowHandle());
        driver.switchTo().frame("authiframe");
        System.out.println(driver.getWindowHandle());
        tc02.mobileNumber().sendKeys(prop.getProperty("phoneNumber"));
        System.out.println("number entered");
        tc02.submitButton().click();
        System.out.println("button clicked");
        driver.switchTo().defaultContent();
        System.out.println(driver.getWindowHandle());
        tc02.closePopup().click();

    }

    // SignUp functionality
    @Test
    public void SignOut() {
        TC_01 tc01 = new TC_01(driver);
        tc01.sigupLink().click();
        driver.switchTo().frame("authiframe");
        tc01.mobileNumber().sendKeys(prop.getProperty("phoneNumber"));
        tc01.submitButton().click();
        driver.switchTo().defaultContent();
        tc01.closePopup().click();

    }

    @AfterTest
    public void closeBrowser() {
        driver = tearDown();
    }

}

下面是为上述测试用例创建的页面对象(TC_01.java)的代码

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);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    回答您的问题-是的,您也可以在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概念很有用-https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html

    另外,请阅读“责任链”模式,但如果您精通Java,因为这是一个相当高级的主题