当前位置: 首页 > 面试题库 >

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

方宏富
2023-03-14
问题内容

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

问题答案:

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




 类似资料:
  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 问题内容: 我已经开始学习用于Android应用程序开发的Java语言。 根据我对静态类的理解,我们无法实例化静态类的对象。 但是,为什么在随后的情况下允许实例化静态嵌套类对象? 如果将内部类的对象标记为静态,为什么我们可以创建它呢? 问题答案: 根据我对静态类的理解,我们无法实例化静态类的对象。 您对“静态类”的含义的理解不正确。基本上, Java中 的“静态类” 是嵌套类,它没有对包含类的实例

  • 问题内容: 对于有关辅助程序/实用程序类的这些简单问题,我从未找到好的答案: 为什么我要创建一个单例(无状态)而不使用静态方法? 如果对象没有状态,为什么需要一个对象实例? 问题答案: 通常,单例用于向应用程序引入某种 全局状态 。(说实话,通常不是很必要,但这是另一个话题。) 但是,在一些极端情况下,甚至 无状态 单例也可能有用: 您希望在可预见的将来用状态扩展它。 由于某些特定的 技术 原因,

  • 但是为什么在下面的情景中允许静态嵌套类对象的实例化呢? 为什么我们可以创建内部类的对象,如果它被标记为静态的?

  • 问题内容: 我正在一个JavaScript项目上,只是想知道为什么对象实例不继承和其他方法,而不必调用超类(superobject?)方法。 我看过了MDN文档,实际上有“非标准”属性方法。 但这些已被弃用。为什么要转向方法? 在我看来,类似的东西比更好。对于其他一些Object方法,我也会说同样的话。 问题答案: 这是为了避免发生冲突-通常情况下,对象的问题不具有所需值的属性。 JS中的对象通常

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。