【问题标题】:How to design Selenium 2 tests with the Page Object pattern using inheritance如何使用继承设计带有页面对象模式的 Selenium 2 测试
【发布时间】:2012-01-12 18:42:43
【问题描述】:

我们现在正在使用 Selenium 2 (Webdriver) 和 TestNG 编写一个新的测试套件。我们的测试使用页面对象模式,我们对目前的情况非常满意。但是,我们在测试中遇到了设计问题,我们似乎无法找到一个好的解决方案。 让我举一个例子。这是我们的 LoginTestCase:

public class LoginTestCase extends MyTestCase {
    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        DashboardPage dashboardPage = loginPage.loginUser("username", "password");
    }   
}

我们希望扩展需要用户从该测试登录的测试。 理想情况下,我们可以这样写:

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard(DashboardPage dashboardPage) { 
        ...
    }
}

此时用户位于DashboardPage,唯一需要的是在LoginTestCase 中创建的页面对象。

我知道显而易见的解决方案是将该对象存储在一个变量中(在LoginTestCase 中),然后子测试用例将可以访问该变量。然而,这看起来非常难看,并且可能导致该变量的滥用。

对于这个或解决这个设计问题的某种模式有更好的解决方案吗?

【问题讨论】:

    标签: java selenium selenium-webdriver testng pageobjects


    【解决方案1】:

    我认为您应该将页面对象的引用存储在 LoginTestCase 类的私有变量中,并提供一个受保护的 getter,以便子测试可以访问该页面对象。这有助于实现两件事

    1. 在您的 LoginTestCase 中封装变量 with ,这样任何人都不会弄乱它..
    2. 提供受保护的 getter 以确保只有子测试用例可以访问它,这毕竟是您想要的。所以这应该不是问题。

    这就是您的代码在更改后的样子。希望这是有道理的:

    public class LoginTestCase extends MyTestCase {
    
        private dashboardPage;
    
        @BeforeTest
        public void login() {
            HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
            LoginPage loginPage = homepage.login();
            dashboardPage = loginPage.loginUser("username", "password");
        }
    
        protected void getDashBoardPage() {
            return dashboardPage;  
        }
    
    }
    
    public class DashboardTestCase extends LoginTestCase {
        @Test
        public void testDashboard() { 
                DashboardPage dashboardPage = getDashBoardPage();
            ...
        }
    }
    

    【讨论】:

      【解决方案2】:

      我们使用依赖注入和 Guice 和 Guice-berry 来解决这个问题。页面对象被注入到测试方法中,WebDriver被注入到页面对象中。

      作为权衡,我们没有在页面对象之间使用所有这些漂亮的小链接。

      但是当涉及到并行测试执行时,静态和单例是很麻烦的,所以应该避免它们。

      【讨论】:

        【解决方案3】:

        我还没有找到更好的解决方案。我在一个静态类中有一个单一的 WebDriver,我的所有测试用例都可以从中访问 WebDriver。由于登录/会话,我的测试类都需要在同一个 WebDriver 上运行。

        【讨论】:

          猜你喜欢
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 2018-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-12
          相关资源
          最近更新 更多