如何通过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
相关产品推荐
相关产品推荐

