我为什么要使我的页面对象实例化而不是静态?

时间:2014-11-11 17:31:37

标签: java selenium selenium-webdriver pageobjects

我是一名相对较新的QA工程师,致力于学习Selenium(Java),我想使用页面对象来模拟我的页面。

目前,我正在这样做,我的页面对象类是静态变量(用于定位页面元素的对象)和静态方法(用于获取By对象和执行页面函数)的集合。这对我来说似乎是最简单的方法,因为我的方法不需要依赖任何实例变量,只需要依赖定位器。

我只是在我的测试代码中调用这些方法。

然而,我读到的关于页面对象的所有内容都涉及实例化它们并让方法返回页面对象。这似乎让一切变得更加复杂。例如,我没有一个登录方法,而是需要两个,一个用于登录成功,一个用于登录失败。

我知道它似乎是公认的最佳做法,但我想了解原因。感谢。

这是我的pageObject代码,我的测试调用方法为LoginPage.login(username, password);

package pageObjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;


public class LogInPage {
    private static By emailTxtB = By.id("user_email");
    private static By passwordTxtB = By.id("user_password");
    private static By logInButton = 
                                 By.xpath("/html/body/div/div[2]/form/div[2]/div[2]/div/button"); 
    private static By signUpButton = By.xpath("/html/body/div/div[2]/form/div[2]/div[2]/div/a");
    private static By valErrorMessage = By.id("flash_alert");

    public static void logIn(WebDriver driver, String email, String password){      
        //Fill out form
        driver.findElement(emailTxtB).sendKeys(email);
        driver.findElement(passwordTxtB).sendKeys(password);

       //Submit form
       driver.findElement(logInButton).click();
    }


    public static void goToSignUp(WebDriver driver){
        driver.findElement(signUpButton).click();
    }

    public static String getValErrorMessage(WebDriver driver){
        return driver.findElement(valErrorMessage).getText();
    }

    public By getEmailTxtB(){
        return emailTxtB;
    }

    public By getPasswordTxtB(){
        return passwordTxtB;
    }

    public By getLogInButton(){
        return logInButton;
    }

    public By getSignUpButton(){
        return signUpButton;
    }
}

4 个答案:

答案 0 :(得分:2)

2个月前我开始使用Selenium和Page Objects。我也很好奇这个话题。大约一个月前我决定使用类和静态方法。但随着代码库的成长,我开始考虑切换到对象实例。 主要原因 - 对象可以有状态。在对象中,我可以检查我是否真的使用了正确的页面。对于类,我只能假设当前的html与类匹配(或者在页面对象的每个静态方法中使用断言使我的代码膨胀)。 另一个原因 - 自动完成。静态方法鼓励测试人员使用类,而不是类变量。因此,找到正确的类来调用方法变得越来越难。对于对象,如果要调用任何方法,则必须声明变量。因此,您可以使用您可以调用的内容进行限制。使用类和静态方法,您可以随时调用任何方法(并且测试失败导致预期的html不可用,例如)。当您尝试教您的团队成员使用您的代码时,它开始成为一个问题。只要你是唯一的测试作者,它就可以了。

答案 1 :(得分:1)

如果您不在页面对象类中创建实例方法,则无法将驱动程序寿命从测试类传递给页面对象类(通过在创建对象时将驱动程序传递给构造函数)

答案 2 :(得分:0)

据我所知,在整个地方使用静态可以摆脱面向对象编程的大部分好处。例如,继承和具有相同类的多个对象的能力现在将无法很好地工作。但如果它按照你的方式工作,我认为它不应该是一个问题。

答案 3 :(得分:0)

使用静态变量将意味着您无法获得使用构造函数的好处,例如等待页面加载或断言页面已加载。