一尘不染

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

selenium

我是一个相对较新的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;
    }
}

阅读 378

收藏
2020-06-26

共1个答案

一尘不染

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

2020-06-26