使用selenium在java中使用testng进行并行测试

问题描述 投票:1回答:1

实际上,我正在创建一个框架,但在创建它时我只想将它用于串行执行,但现在我想对方法进行并行测试。问题是我已经将驱动程序实例声明为静态,并且因为静态第二个线程无法更改其值。

我在一个单独的类中创建驱动程序并使用getter方法获取它。

现在的问题是,如果我将Webdrive变为非静态,那么我就无法在其他类中使用该驱动程序。

即使我尝试扩展类(我在创建驱动程序实例的地方),它也会传递一个空值。

所以,基本上我想隔离所有实例但我不能在本地创建实例。我尝试删除静态变量,但在执行并行执行时,会打开2个浏览器实例,但是在一个浏览器中执行所有测试用例并且太平行

我怎样才能做到这一点?

java testing selenium-webdriver automation testng
1个回答
1
投票

您必须为您的应用程序创建类似Driver Pool的内容。您可以从此池中为您的测试用例启动一堆驱动程序。

另外,请考虑如何取消静态驱动程序实例。

我过去尝试过类似的东西:

public class DriverPool {

    public static final int MAX_NUMBER = 5;

    private static final Object waitObj = new Object();
    private static AtomicInteger counter = new AtomicInteger(0);
    private static Logger log = Logger.getLogger(DriverPool.class);

    private static volatile ThreadLocal<WebDriver> instance = ThreadLocal
            .withInitial(DriverManager::getInstance);

    public static synchronized WebDriver getDriver() {
        try {
            while (counter.get() > MAX_NUMBER) {
                synchronized (waitObj) {
                    waitObj.wait();
                }
            }
            counter.getAndIncrement();
        } catch (InterruptedException e) {
            log.error(e);
        }

        return instance.get();
    }

    public static synchronized void closeDriver() {
        WebDriver driver = instance.get();

        driver.close();
        driver.quit();

        instance.remove();
        counter.decrementAndGet();
        synchronized (waitObj) {
            waitObj.notifyAll();
        }
    }
}

我希望它会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.