2015-07-21 26 views
0

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

+0

不明确。你想有一个单一的浏览器实例吗?如果那么你想在网格中做什么?您可以使用网格在多个节点上运行多个实体 – Shamik

+0

然后,您没有正确使用TestNg。只需使用testng.xml并行运行测试,就不需要共享同一个对象,或者为此继承这些类。 – Manu

回答

2

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

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

+0

感谢Vishal,但这不是解决方案。我知道代码需要写成不共享资源的方式(即没有静态变量)。我想要一种技术实现的方式。 我实现了通过一个类传递给另一个类的参数,但这样我必须通过java代码传递对象,我不能通过testng来完成。如果你知道一种方法,请求你分享。 –

1

以下是我如何实施解决方案。

我有一个对象myObj,它里面有webDriver对象,还有更多的东西。我创建了静态对象myObj的静态数组。它是这样的

//有WebDriver实现的类的一部分。 WebDriver不是静态的btw。

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> 

这工作完全对我来说硒电网并联和正常的方式。

0

我们的努力与我们的测试工作类似的情况。我们还希望利用TestNG并行化和Selenium Web驱动程序。不幸的是,在启用任何TestNG并行模式时,管理每个测试类中的Web驱动程序生命周期或试图使用持有Web驱动程序的静态类都不奏效。即。 parallel="tests|classes|methods"。使用主动TestNG线程和实例化的Web驱动程序来匹配正在测试的类和方法在工作时很难应付。我们花费更多的时间来搞清楚网络驱动程序的生命周期,而不是进行真正的Web应用程序测试。我们找到了更好的方法。我们有一个开源项目,为TestNG/Selenium测试抽象出Web驱动程序生命周期管理。它正确地支持每种TestNG并行模式,为每个被测试的测试类方法提供正确和有效的Web驱动程序。这对我们的测试工作帮助很大。也许它也可以用于你的情况。或者如果没有其他的东西给你一个关于你如何解决它的想法。该项目已在GitHub上发布,名称为Concurrent Selenium TestNG (COSENG)。亲切的问候。

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"); 
} 

希望这可以帮助别人。