如何在多个测试中使用相同的页面对象实例

时间:2014-01-28 01:10:03

标签: selenium selenium-webdriver remotewebdriver

我想知道如何在同一个类和不同类的多个测试中使用相同的页面对象实例的不同方法。

对于前: 我正在测试的应用程序主页,主页上有添加员工,修改员工,员工详细信息和公司详细信息的链接..页面

在我的实施中, 页面类 - 包含在页面上执行的常用功能

HomePage类 - 具有与HomePage交互的功能

AddEmployeePage类 - 具有与AddEmployeePage交互的函数

ModifyEmployeePage类 - 具有与ModifyEmployeePage交互的函数

EmployeeDetailsPage类 - 具有与EmployeeDetailsPage交互的函数

CompanyDetailsPage class-具有与CompanyDetailsPage交互的功能

以下所有测试类都扩展了Page class。

HomePageTest类 - 具有主页的所有测试

AddEmployeeTest类 - 具有Add EmployeePage的所有测试

ModifyEmployeeTest类 - 具有Modify EmployeePage的所有测试

EmployeeDetailsTest类 - 具有员工详细信息页面的所有测试

CompanyDetailsTest类 - 具有公司详细信息页面的所有测试

对于与HomePage和其他页面相关的所有测试,我想使用我第一次创建的HomePage对象。

为了实现这一点,目前我在Page类中将所有页面对象声明为静态,然后在测试中引用相同的对象。

这是正确的方法吗?当我在多个浏览器中运行测试时会有什么影响吗?或平行运行测试?请让我知道

先谢谢。

2 个答案:

答案 0 :(得分:0)

你的方法似乎很好。最好在单个类中使用常见的业务登录/功能,例如在你的情况下你有AddEmployeePage,因为你可以有添加员工,编辑和删除等功能。这是很好的方法,因为你不必去每个测试类,用于对您的业务登录或页面源更改/添加新字段等进行微小更改。通过更改单个函数(如添加用户),所有测试类将更新用于添加用户的相同登录。我建议不要扩展类,而是在公共类中使用静态成员函数和变量。它将更容易处理和更新,静态成员可以通过classname在其他测试类中的任何地方调用。 我们在项目中实现了类似的登录,它适用于IE,FF和Chrome等所有浏览器。考虑到并行测试,请确保不要并行运行两个测试类,这会影响并行运行的其他测试类。

答案 1 :(得分:0)

使用静态方法很可能很快会产生任何数量的问题。特别是在将您的共享资源声明为静态时(如webdriver本身)。有几次我尝试将我的webdriver项目编写为静态,每次我完成所有重写。上次是在8月份,看看我对这个here的争论。

最好考虑将页面对象编写为实例并创建嵌套页面对象。有点像,比方说你的主页上有“去添加员工”按钮,点击addempolyeepage后返回。

class HomePage extends LoadableComponent<HomePage>{

    public HomePage(){
        // Construcotr
    }

    @FindBy(id = "buttonAddEmployee")
    private WebElement btnAddEmp;

    @Override
    protected void load() {

    }

    @Override
    protected void isLoaded() throws Error {

    }

    public AddEmployeePage goToAddEmployeePage(){
        btnAddEmp.click();
        return new AddEmployeePage();
}
}

class AddEmployeePage{
    public void addEmployee(){
        // Add 
    }
}

class Test{
     @org.junit.Test
    public void testStuff(){
         new HomePage()
                 .goToAddEmployeePage()
                 .addEmployee();
     }
}