【问题标题】:Why should I be making my page objects instantiated rather than static?为什么我应该让我的页面对象实例化而不是静态的?
【发布时间】:2015-01-08 08:29:44
【问题描述】:

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

【问题讨论】:

  • 这更像是一个一般性的编程问题,实际上与 Selenium 无关。更多的是“如果我可以在所有地方都使用静态变量,那么 OO 的意义何在?”.....programmers.stackexchange.com/questions/98083/… ....考虑屏幕上是否有两个对话框。两者有何不同?
  • 我想我的问题实际上是关于页面对象的情况。在此应用程序中,如果您可以访问给定页面,它看起来几乎相同,定位器不会改变。如果您不是管理员,即使没有显示按钮,我也希望能够使用定位器检查并确保它不存在。如果我的方法不依赖于任何实例特定的变量,我总是被告知要使我的方法成为静态的。你会让你的定位器实例变量而不是静态变量吗?
  • 我认为将页面对象设为静态会在您与不同浏览器并行运行测试时产生问题,因为在多线程操作中静态不会在两个/多个线程之间共享。只需尝试使用不同的浏览器(驱动程序)并行运行相同的测试并检查。例如:当您使用静态 WebDriver 驱动程序并稍后更改它时 driver = chrome in one thread and driver = firefox 可能会产生问题。

标签: java selenium selenium-webdriver pageobjects


【解决方案1】:

据我所知,到处使用 static 会消除面向对象编程的大部分好处。例如,继承和拥有同一个类的多个对象的能力现在不能很好地工作。但是,如果它按照您的方式工作,我认为这应该不是问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2019-02-04
          • 2020-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-08
          • 2013-05-12
          • 2015-10-15
          • 1970-01-01
          相关资源
          最近更新 更多