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