You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Selenium WebDriver实现多浏览器并行测试?现有方案未生效

解决TestNG多浏览器并行测试串行执行的问题

我明白你的困扰——明明配置了parallel="tests",但三个浏览器还是依次执行,没有并行跑起来。别担心,咱们一步步调整就能搞定!

问题根源分析

你的TestNG配置方向是对的,但缺少线程池配置,而且Java代码里的WebDriver是类的实例变量,多线程环境下会被共享,容易导致冲突,同时也没做浏览器的清理工作。

解决方案步骤

1. 完善TestNG配置文件

在<suite>标签里添加thread-count属性,指定同时运行的线程数(这里设为3,对应三个浏览器):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="3">
    <test name="FirefoxTest">
        <parameter name="browser" value="Firefox"/>
        <classes>
            <class name="parallel_script.Demo_parallel_script"/>
        </classes>
    </test>
    <test name="ChromeTest">
        <parameter name="browser" value="chrome"/>
        <classes>
            <class name="parallel_script.Demo_parallel_script"/>
        </classes>
    </test>
    <test name="IETest">
        <parameter name="browser" value="IE"/>
        <classes>
            <class name="parallel_script.Demo_parallel_script"/>
        </classes>
    </test>
</suite>

2. 修改Java代码,保证线程安全

把WebDriver改成ThreadLocal<WebDriver>,让每个线程拥有独立的driver实例,避免多线程冲突;同时添加@AfterTest注解来关闭浏览器,释放资源:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.WebDriverException;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class Demo_parallel_script {
    // 使用ThreadLocal保证每个线程有独立的WebDriver实例
    private ThreadLocal<WebDriver> driver = new ThreadLocal<>();
    String baseURL = "http://www.google.com/";

    @Parameters({ "browser" })
    @Test
    public void openBrowser(String browser) {
        try {
            if (browser.equalsIgnoreCase("Firefox")) {
                System.setProperty("webdriver.gecko.driver","D:\\selenium driver\\geckodriver.exe");
                driver.set(new FirefoxDriver());
            } else if (browser.equalsIgnoreCase("chrome")) {
                System.setProperty("webdriver.chrome.driver", "D:\\selenium driver\\chromedriver.exe");
                driver.set(new ChromeDriver());
            } else if (browser.equalsIgnoreCase("IE")) {
                System.setProperty("webdriver.ie.driver", "D:\\selenium driver\\IEDriverServer.exe");
                driver.set(new InternetExplorerDriver());
            }
        } catch (WebDriverException e) {
            System.out.println("浏览器启动失败:" + e.getMessage());
        }

        WebDriver currentDriver = driver.get();
        currentDriver.navigate().to(baseURL);
        String title_name = currentDriver.getTitle();
        System.out.println("[" + browser + "] 页面标题:" + title_name);
        currentDriver.findElement(By.xpath("//input[@id='lst-ib']")).sendKeys("selenium");
        currentDriver.findElement(By.xpath("(//input[@type='submit'])[1]")).click();
    }

    // 每个测试结束后关闭浏览器,清理资源
    @AfterTest
    public void tearDown() {
        WebDriver currentDriver = driver.get();
        if (currentDriver != null) {
            currentDriver.quit();
            driver.remove(); // 移除ThreadLocal中的实例
        }
    }
}

关键改动说明

  • thread-count="3":告诉TestNG同时启动3个线程来执行<test>节点,这样三个浏览器就会同时启动了。
  • ThreadLocal<WebDriver>:解决多线程下WebDriver实例共享的问题,每个线程的操作都不会影响其他线程的浏览器。
  • @AfterTest:确保每个测试完成后关闭对应的浏览器,避免资源泄漏。

现在你再运行这个配置,应该就能看到Firefox、Chrome、IE三个浏览器同时打开并执行测试用例啦!

内容的提问来源于stack exchange,提问作者Krishna Sagar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:05