Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestNG,Selenium如何在多个类之间共享对象_Java_Selenium_Testng_Selenium Grid_Selenium Grid2 - Fatal编程技术网

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

Java TestNG,Selenium如何在多个类之间共享对象,java,selenium,testng,selenium-grid,selenium-grid2,Java,Selenium,Testng,Selenium Grid,Selenium Grid2,我正在使用Selenium+TestNG执行我的测试用例。我的测试用例分布在多个类中。我想在每个类中使用相同的webDriver副本。(我不想每次登录后再执行其他操作,这样每个类调用单独浏览器的选项就不存在了)。 为了解决这个问题,现在我使用静态webdriver对象的继承。但是,在并行模式下使用selenium网格时,由于它使用相同的对象,所以无法正常工作。你能告诉我一种方法吗,我可以和多个类共享对象,或者在每个“测试”上创建一个不同的静态实例(就像,我为每个测试运行单独的Java程序一样)

我正在使用Selenium+TestNG执行我的测试用例。我的测试用例分布在多个类中。我想在每个类中使用相同的webDriver副本。(我不想每次登录后再执行其他操作,这样每个类调用单独浏览器的选项就不存在了)。
为了解决这个问题,现在我使用静态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");
}