我正在使用Selenium + TestNG执行我的测试用例。我的测试用例分布在多个类中。我想在每个班级都使用同一份webDriver。 (我不想每次登录,然后做其他操作,所以选择调用单独的浏览器每个类都不见了)。 要解决这个问题,现在我正在使用静态webdriver对象继承。但在并行模式下使用硒网格时,它不起作用,因为它使用相同的对象。你能告诉我一种方式,我可以与多个类共享对象或为了在每个“测试”(就像我为每个测试运行单独的Java程序)上创建一个不同的静态实例。TestNG,Selenium如何在多个类中共享对象
回答
当前,您正在跨各种类/测试使用webdriver对象的静态引用。因此,有一个驱动程序实例正在修改代码中的静态资源。但是当你使用网格时,你会为每个节点创建不同的驱动程序实例。这些驱动程序将并行运行,并将访问共享资源(静态变量等),同时更改并覆盖其他驱动程序实例所做的更改,这些更改会导致问题。
编写代码,使资源不共享(最小使用静态)。尝试将您的驱动程序实例传递给方法,以确保所需的驱动程序仅执行那段代码。
感谢Vishal,但这不是解决方案。我知道代码需要写成不共享资源的方式(即没有静态变量)。我想要一种技术实现的方式。 我实现了通过一个类传递给另一个类的参数,但这样我必须通过java代码传递对象,我不能通过testng来完成。如果你知道一种方法,请求你分享。 –
以下是我如何实施解决方案。
我有一个对象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>
这工作完全对我来说硒电网并联和正常的方式。
我们的努力与我们的测试工作类似的情况。我们还希望利用TestNG并行化和Selenium Web驱动程序。不幸的是,在启用任何TestNG并行模式时,管理每个测试类中的Web驱动程序生命周期或试图使用持有Web驱动程序的静态类都不奏效。即。 parallel="tests|classes|methods"
。使用主动TestNG线程和实例化的Web驱动程序来匹配正在测试的类和方法在工作时很难应付。我们花费更多的时间来搞清楚网络驱动程序的生命周期,而不是进行真正的Web应用程序测试。我们找到了更好的方法。我们有一个开源项目,为TestNG/Selenium测试抽象出Web驱动程序生命周期管理。它正确地支持每种TestNG并行模式,为每个被测试的测试类方法提供正确和有效的Web驱动程序。这对我们的测试工作帮助很大。也许它也可以用于你的情况。或者如果没有其他的东西给你一个关于你如何解决它的想法。该项目已在GitHub上发布,名称为Concurrent Selenium TestNG (COSENG)。亲切的问候。
我遇到了类似的问题。这是我做的。
假设:说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");
}
希望这可以帮助别人。
- 1. 如何在Java中共享类对象?
- 2. 在不同的测试类中共享TestNG设置 - Selenium Java
- 3. MMAP共享多个对象
- 4. 多处理共享对象中的共享对象
- 5. 在使用Selenium,TestNG和Cucumber-JVM时共享一个WebDriver实例
- 6. AngularJS - 如何在多个控制器中共享监视对象?
- 7. 在多个进程之间共享共享对象
- 8. C++在多个进程之间共享单个类对象
- 9. 如何在多个对象之间共享一个值? C#
- 10. 在C++中如何在同一个类对象内共享公共元素。
- 11. 如何在共享内存中得到共享对象
- 12. 如何在共享对象库中共享变量
- 13. 如何在多个片段之间共享MediaPlayer对象?
- 14. 如何在几个类之间共享对象
- 15. 组间共享多少个对象?
- 16. 跨多个网格对象共享VBO
- 17. 多个JInternalFrame之间的共享对象
- 18. OLE:为多个OLE对象共享IStorage?
- 19. 在共享对象
- 20. 通过几个类共享对象
- 21. 如何从一个共享对象
- 22. 在php中共享对象
- 23. 在堆中共享对象
- 24. 如何与多个Scalatest套件共享一个对象?
- 25. 链接到另一个共享对象的共享对象
- 26. 如何在多进程中共享大对象?
- 27. 如何在多个操作中共享一个对象的单个实例?
- 28. 如何在类和活动中共享对象和变量
- 29. 共享对象
- 30. 如何在多个portlet中共享jar?
不明确。你想有一个单一的浏览器实例吗?如果那么你想在网格中做什么?您可以使用网格在多个节点上运行多个实体 – Shamik
然后,您没有正确使用TestNg。只需使用testng.xml并行运行测试,就不需要共享同一个对象,或者为此继承这些类。 – Manu