Java TestNG,Selenium如何在多个类之间共享对象
我正在使用Selenium+TestNG执行我的测试用例。我的测试用例分布在多个类中。我想在每个类中使用相同的webDriver副本。(我不想每次登录后再执行其他操作,这样每个类调用单独浏览器的选项就不存在了)。Java TestNG,Selenium如何在多个类之间共享对象,java,selenium,testng,selenium-grid,selenium-grid2,Java,Selenium,Testng,Selenium Grid,Selenium Grid2,我正在使用Selenium+TestNG执行我的测试用例。我的测试用例分布在多个类中。我想在每个类中使用相同的webDriver副本。(我不想每次登录后再执行其他操作,这样每个类调用单独浏览器的选项就不存在了)。 为了解决这个问题,现在我使用静态webdriver对象的继承。但是,在并行模式下使用selenium网格时,由于它使用相同的对象,所以无法正常工作。你能告诉我一种方法吗,我可以和多个类共享对象,或者在每个“测试”上创建一个不同的静态实例(就像,我为每个测试运行单独的Java程序一样)
为了解决这个问题,现在我使用静态webdriver对象的继承。但是,在并行模式下使用selenium网格时,由于它使用相同的对象,所以无法正常工作。你能告诉我一种方法吗,我可以和多个类共享对象,或者在每个“测试”上创建一个不同的静态实例(就像,我为每个测试运行单独的Java程序一样) 当前,您正在跨各种类/测试使用webdriver对象的静态引用。因此,只有一个驱动程序实例在修改代码中的静态资源。但当您使用网格时,您将为每个节点创建不同的驱动程序实例。这些驱动程序将并行运行,并将访问共享资源(静态变量等),同时更改和覆盖其他驱动程序实例所做的更改,这些更改将导致问题
编写代码时不要共享资源(至少使用static)。尝试将您的驱动程序实例传递给方法,以确保所需的驱动程序仅执行该段代码。以下是我如何实现该解决方案的 我有一个对象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的样子
这对我来说非常适用于selenium grid的并行和正常方式。我们在测试工作中遇到了类似的情况。我们还希望利用TestNG并行化和Selenium web驱动程序。不幸的是,在启用任何TestNG并行模式时,在每个测试类中管理web驱动程序生命周期或尝试使用保存web驱动程序的静态类都是无效的。例如,
parallel=“tests | class | methods”
。将测试中的类和方法与活动的TestNG线程和实例化的web驱动程序进行匹配是非常困难的。我们花了更多的时间来了解web驱动程序的生命周期,而不是进行真正的web应用程序测试。我们找到了更好的办法。我们有一个开源项目,它将web驱动程序生命周期管理抽象为TestNG/Selenium测试。它正确地支持每个TestNG并行模式,为测试中的每个测试类方法提供正确和活动的web驱动程序。这对我们的测试工作帮助很大。也许它对你的情况也有用。或者,如果没有其他东西可以让你知道如何以不同的方式处理它。该项目已在GitHub上完成。亲切的问候。我遇到了类似的问题。这就是我所做的
假设:假设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");
}
希望这对某人有所帮助。不清楚。您是否想要浏览器的单个实例?若这样,你们想在网格中做什么?您使用网格在多个节点上运行多个ISNTANCE,那么您没有正确使用TestNg。只需使用testng.xml并行运行测试,就无需共享同一对象,也无需继承类。谢谢Vishal,但这不是解决方案。我知道代码需要以不共享资源(即没有静态变量)的方式编写。我想要一种技术实现的方法。我实现了通过一个类向另一个类传递参数,但这样我必须通过java代码传递对象,我不能仅通过testng来实现。如果你知道一个方法,请你分享。
@BeforeClass(alwaysRun=true)
@SuppressWarnings("unchecked")
public void fetchData(ITestContext ctx) {
A a = (A) ctx.getAttribute("INSTANCE_OF_A");
}