如何使用继承使用Page Object模式设计Selenium 2测试

时间:2011-12-04 20:20:22

标签: java selenium selenium-webdriver testng pageobjects

我们现在正在使用 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中),然后由子测试用例访问。然而,这看起来非常难看并且可能导致滥用该变量。

是否有更好的解决方案可以解决此设计问题?

3 个答案:

答案 0 :(得分:3)

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

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

但是当涉及并行测试执行时,静态和单身是痛苦的,所以应该避免它们。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

  1. 在LoginTestCase中封装变量,这样就没有人可以搞砸了它......
  2. 提供受保护的getter确保只有子测试用例可以访问它,这毕竟是你想要的。所以这应该不成问题。
  3. 这是您的代码在更改后的样子。希望有道理:

    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();
            ...
        }
    }