当前位置: 首页 > 知识库问答 >
问题:

在POM设计模式中,哪些方法应该位于页面类内部?

狄珂
2023-03-14

我正在使用POM设计模式创建一个UI测试自动化框架。在阅读了SeleniumHQ页面中的页面对象之后,我开始思考应该在页面对象中创建哪些方法。

让我们举一个登录页面对象的简单例子,该对象由用户名、密码文本框和提交按钮组成。SeleniumHQ link创建了以下方法:

1. typeUsername(String username)
2. typePassword(String password)
3. submitLogin()
4. submitLoginExceptionFailure()
5. loginAs(String username, String password)

看着这些方法,我有点困惑。当我已经在创建loginAs方法时,为什么要创建前3个方法(typeUsername、typePassword、submitLogin)。有什么想法吗?

SeleniumHQ Link-https://github.com/SeleniumHQ/selenium/wiki/PageObjects

粘贴代码页登录页的对象代码:

public class LoginPage {
    private final WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;

        // Check that we're on the right page.
        if (!"Login".equals(driver.getTitle())) {
            // Alternatively, we could navigate to the login page, perhaps logging out first
            throw new IllegalStateException("This is not the login page");
        }
    }

    // The login page contains several HTML elements that will be represented as WebElements.
    // The locators for these elements should only be defined once.
        By usernameLocator = By.id("username");
        By passwordLocator = By.id("passwd");
        By loginButtonLocator = By.id("login");

    // The login page allows the user to type their username into the username field
    public LoginPage typeUsername(String username) {
        // This is the only place that "knows" how to enter a username
        driver.findElement(usernameLocator).sendKeys(username);

        // Return the current page object as this action doesn't navigate to a page represented by another PageObject
        return this;    
    }

    // The login page allows the user to type their password into the password field
    public LoginPage typePassword(String password) {
        // This is the only place that "knows" how to enter a password
        driver.findElement(passwordLocator).sendKeys(password);

        // Return the current page object as this action doesn't navigate to a page represented by another PageObject
        return this;    
    }

    // The login page allows the user to submit the login form
    public HomePage submitLogin() {
        // This is the only place that submits the login form and expects the destination to be the home page.
        // A seperate method should be created for the instance of clicking login whilst expecting a login failure. 
        driver.findElement(loginButtonLocator).submit();

        // Return a new page object representing the destination. Should the login page ever
        // go somewhere else (for example, a legal disclaimer) then changing the method signature
        // for this method will mean that all tests that rely on this behaviour won't compile.
        return new HomePage(driver);    
    }

    // The login page allows the user to submit the login form knowing that an invalid username and / or password were entered
    public LoginPage submitLoginExpectingFailure() {
        // This is the only place that submits the login form and expects the destination to be the login page due to login failure.
        driver.findElement(loginButtonLocator).submit();

        // Return a new page object representing the destination. Should the user ever be navigated to the home page after submiting a login with credentials 
        // expected to fail login, the script will fail when it attempts to instantiate the LoginPage PageObject.
        return new LoginPage(driver);   
    }

    // Conceptually, the login page offers the user the service of being able to "log into"
    // the application using a user name and password. 
    public HomePage loginAs(String username, String password) {
        // The PageObject methods that enter username, password & submit login have already defined and should not be repeated here.
        typeUsername(username);
        typePassword(password);
        return submitLogin();
    }
}

共有2个答案

章睿
2023-03-14

将代码细切成更多的方法可以实现更大的原子化。没有什么可以阻止您将typeUsername()typePassword()submitLogin()分组到login()方法中。

这样做的好处是更准确地知道你的登录失败了,比如输入密码,而不是“在登录页面的某个地方”。

鲜于仰岳
2023-03-14

您可能需要检查是否仅键入用户名,然后单击提交按钮显示正确的错误消息,或者仅显示密码,等等。

我通常查看页面并尝试总结用户在该页面上可以执行的“操作”,每个操作都成为一种方法。不同的行动可能在不同的“层面”。e、 在博客网站上,用户可以输入博客标题和博客内容,这是用户可以做的两个动作,但从另一个抽象层看,用户希望“创建”一篇文章。因此该函数可能会再次调用其他函数。

基本上和其他编程一样,您有多个抽象层,这就是为什么您首先有页面对象。

只需使用迭代开发,创建一个做您想要测试的功能,如果您发现自己在其他功能中重用相同的代码(或标识符),请在新功能中分离这些代码(或标识符)

 类似资料:
  • 1、简单工厂模式 简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。 2、工厂方法模式 应用程序将对象的创建及初始化职责交给工厂对象,工厂Bean。 定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory-method指

  • 本文向大家介绍熟悉哪些设计模式?相关面试题,主要包含被问及熟悉哪些设计模式?时的应答技巧和注意事项,需要的朋友参考一下 按照自己的实际情况回答,当然是越多越好。比如我自己也就熟悉个单例模式。

  • 问题内容: 我设计了10多个站点,但我仍然对“我应该使用正确的单位是什么”有个疑问。无论是px还是em或%。请引导我正确的方向 编辑1:用于版式(特别是对于容器盒) 问题答案: 根据上下文的不同单位。如果有一个最适合每种情况的单位,那么就不会有那么多单位。 按照经验法则: 如果您正在处理屏幕媒体: 使用的字体大小 使用的图像 使用,或表示盒子尺寸 线高使用比例 如果您使用打印介质: 最好避免(无论

  • 问题内容: java web设计模式有哪些? 问题答案: 模型视图控制器模式 你要使用的核心(架构)设计模式是Model-View-Controller模式。该控制器是由一个Servlet其中(在)直接创造来表示/使用特定的模型和视图基于该请求。该模型将由Javabean类表示。在包含动作(行为)的业务模型和包含数据(信息)的数据模型中,这通常可以进一步划分。该视图是由具有对(直接访问JSP文件来

  • 能接触到的常见问法: 项目中有用到什么设计模式?(前端更多点) 重构使用了什么设计模式?(如果你项目强调了重构一般会问) 说说对 XX 模式的理解?(个人接触过的是单例和工厂,这两个比较多) 有接触到哪些?实际用到过哪些?(通用) 除了这些,还有一些不常见的进阶和基础问法,这些直接在下面整理 -- 设计模式这个主题还挺玄乎的,个人直观体验是,自己日常实习那段时间问得挺频繁的,可能是因为没啥好问的。

  • 我正在实现一个工厂,一个负责跨应用程序管理令牌的类。我将在这个简化的示例之后解释我面临的问题: 最后是实现: 现在,在我们的中,我们要创建一个jWTTokenManager实例: TokenManager类型未定义方法aMethodNotDefinedInInterface()