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

Java 为什么我要使我的页面对象实例化而不是静态的?,java,selenium,selenium-webdriver,pageobjects,Java,Selenium,Selenium Webdriver,Pageobjects,我是一名相对较新的QA工程师,致力于学习Selenium(Java),我想使用页面对象来建模我的页面 目前,按照我的方式,我的页面对象类是静态变量(按对象定位页面元素)和静态方法(按对象获取对象和执行页面功能)的集合。对我来说,这似乎是最简单的方法,因为我的方法不需要依赖任何实例变量,只需要定位器 我只是在测试代码中需要时调用这些方法 然而,我读到的关于页面对象的所有内容都是关于实例化它们和让方法返回页面对象。这似乎让一切变得更加复杂。例如,我需要两种登录方法,一种用于登录成功,另一种用于登录失

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

目前,按照我的方式,我的页面对象类是静态变量(按对象定位页面元素)和静态方法(按对象获取对象和执行页面功能)的集合。对我来说,这似乎是最简单的方法,因为我的方法不需要依赖任何实例变量,只需要定位器

我只是在测试代码中需要时调用这些方法

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

我知道这似乎是公认的最佳实践,但我想了解原因。谢谢

这是我的pageObject代码,我的测试调用方法是
LoginPage.login(用户名、密码)


据我所知,到处使用静态会使面向对象编程的大部分好处消失。例如,继承和拥有同一类的多个对象的能力现在不会很好地发挥作用。但是如果你这样做的话,我认为这不应该是个问题

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

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

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

这更像是一个一般编程问题,与Selenium无关。这更多的是一个问题,“如果我可以到处使用静态变量,那么OO有什么意义?”。。。。考虑屏幕上是否有两个对话框。你认为这两者有什么不同?我想我的问题实际上是关于页面对象的情况。在这个应用程序中,如果您可以访问给定的页面,那么它看起来几乎相同,定位器不会改变。即使一个按钮没有出现,如果你不是管理员,我希望能够使用定位器来检查,并确保它不在那里。我总是被告知,如果我的方法不依赖于任何特定于实例的变量,就要使它们成为静态的。你会让你的定位器成为实例变量而不是静态的吗?我认为当你在多线程操作中用不同的浏览器并行运行你的测试时,把页面对象变成静态会产生问题静态不会在两个或更多的线程之间共享。只需尝试使用不同的浏览器(驱动程序)并行运行相同的测试,然后进行检查。例如:当您使用静态WebDriver驱动程序并在一个线程中更改它时,driver=chrome和driver=firefox可能会产生问题。
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;
    }
}