java - 为什么我应该使我的页面对象实例化而不是静态的?

标签 java selenium selenium-webdriver pageobjects

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

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

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

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

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

这是我的 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;
    }
}

最佳答案

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

关于java - 为什么我应该使我的页面对象实例化而不是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870858/

相关文章:

java - 命名 block 限制变量范围 : good idea?

java - Java Simple 需要 `Hello World` 示例

python - 在 Python 中使用 Selenium 定位鼠标悬停元素?

python - Webdriver 忽略等待 - Firefox、Python

java - 使用长度为零的数组

java - 正则表达式从日志条目中获取请求参数的特定部分?

python - 类型错误 : urlopen() got multiple values for keyword argument 'body' while executing tests through Selenium and Python on Kubuntu 14. 04

javascript - 停止 Javascript 执行以阻止 selenium webdriver

html - 将 Selenium HTML 源代码存储到 HTMLDocument 类型的元素中

java - 使用 selenium 将图像添加到 Excel 工作表的单元格