TestNG,Selenium如何在多个类之间共享对象

时间:2015-07-21 06:48:24

标签: java selenium testng selenium-grid selenium-grid2

我正在使用Selenium + TestNG执行我的测试用例。我的测试用例分布在多个类中。我想在每个类中使用webDriver的相同副本。 (我不想每次都登录然后再做其他操作,所以选择调用单独的浏览器,每个类都消失了)。 为了解决这个问题,我现在正在使用继承与静态webdriver对象。但是当使用具有并行模式的selenium网格时,它不起作用,因为它使用相同的对象。你能告诉我一个方法,我可以用多个类共享对象或者在每个“测试”上创建一个不同的静态实例(就像我为每个测试运行单独的Java程序一样)。

4 个答案:

答案 0 :(得分:2)

目前,您正在跨各种类/测试使用webdriver对象的静态引用。因此,有一个驱动程序实例正在修改代码中的静态资源。但是当你进入网格时,你将为每个节点创建不同的驱动程序实例。这些驱动程序将并行运行,并将访问共享资源(静态变量等),同时更改和覆盖其他驱动程序实例所做的更改,这些更改将导致问题。

编写代码,以便不共享资源(最少使用静态)。尝试将驱动程序实例传递给方法,以确保所需的驱动程序仅执行该段代码。

答案 1 :(得分:2)

以下是我实施解决方案的方法。

我有一个对象myObj,其中包含webDriver对象以及更多内容。我创建了静态对象myObj的静态数组。就像这样

//在其中实现WebDriver的类的一部分。 WebDriver不是静态的。

private static MyClass[] ObjectArr = new MyClass[100];

public static MyClass getInstance(Integer id){
    id = (id==null)? 0 : id;
    if(ObjectArr[id] == null){
        ObjectArr[id] = new MyClass();
    }  
    return ObjectArr[id];
}

现在,当我想在我的testng类中使用它时,我会这样做。

public class x{
MyClass i;

@BeforeClass
@Parameters("instanceId")
public void getInstance(@Optional String instanceId){
    i = MyClass.getInstance(Integer.parseInt(instanceId));
}
}

这是我的testng.xml看起来像。

<test name="FireFox" preserve-order="true">
    <parameter name="instanceId" value="1" />
    <parameter name="browser" value="firefox" />
    <classes>
        <class name="com.app.Login"/>
    </classes>
</test> 

<test name="Chrome" preserve-order="true">
    <parameter name="instanceId" value="2" />
    <parameter name="browser" value="chrome" />
    <classes>
        <class name="com.app.Login"/>
    </classes>
</test> 

对于我来说,这对于我来说是平行且正常的硒网格。

答案 2 :(得分:0)

我遇到了类似的问题。这就是我所做的。

假设:说B类测试取决于A类实例。

@AfterClass(alwaysRun = true)
public void insertValueIntoAttribute(ITestContext ctx) {
    ctx.setAttribute("INSTANCE_OF_A", this); // from inside class A tests
}

然后在B组中,我检索A的这个实例并使用它。

@BeforeClass(alwaysRun=true)
@SuppressWarnings("unchecked")
public void fetchData(ITestContext ctx) {
    A a = (A) ctx.getAttribute("INSTANCE_OF_A");
}

希望这有助于某人。

答案 3 :(得分:-1)

我们在测试工作中遇到了类似情况。我们还希望利用TestNG并行化和Selenium Web驱动程序。遗憾的是,在启用任何TestNG并行模式时,管理每个测试类中的Web驱动程序生命周期或尝试使用保存Web驱动程序的静态类都无效。即。 parallel="tests|classes|methods"。使用活动的TestNG线程和实例化的Web驱动程序匹配测试的类和方法在它工作时很难实现。我们花费更多时间来确定网络驱动程序生命周期,而不是参加真正的Web应用程序测试。我们找到了更好的方法。我们有一个开源项目,它抽象了TestNG / Selenium测试的Web驱动程序生命周期管理。它适当地支持每个TestNG并行模式,为每个测试的测试类方法提供正确和活动的Web驱动程序。它对我们的测试工作有很大帮助。也许它也适用于您的情况。或者,如果没有别的东西让你知道如何以不同的方式解决它。该项目在GitHub上以Concurrent Selenium TestNG (COSENG)结束。亲切的问候。