Selenium+TestNG基于TestBase运行多测试WebDriver实例异常求解
Selenium+TestNG多会话并行测试异常解决方案
问题场景
基于Java技术栈使用Selenium与TestNG开展自动化测试时,通过multisession.xml配置运行单个测试类下的多个测试用例:
- 初始方案在每个测试方法内单独创建WebDriver实例,多测试运行正常,单方法内实例化代码如下:
System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe"); WebDriver driver; driver = new ChromeDriver();
- 为消除代码冗余,抽离TestBase基类封装公共初始化逻辑,让测试类继承基类复用逻辑后,multisession.xml配置下同一时间仅能执行单个测试,抛出如下异常:
org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
附出问题的TestBase核心代码:
public class TestBase { public static WebDriver driver; public static WebDriverWait wait; public static Properties config; public static Properties testdata;
基类初始化方法核心逻辑:
public static void initialization() { String url = config.getProperty("URL"); String browser = config.getProperty("browser"); String pageLoadTimeout = config.getProperty("pageLoadTimeout"); String windowsMaximize = config.getProperty("windowsMaximize"); String deleteAllCookies = config.getProperty("deleteAllCookies"); String waitTimeout = config.getProperty("waitTimeout"); switch (browser) { case "chrome": System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/src/main/resources/chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.addArguments("--incognito"); driver = new ChromeDriver(options); break; case "firefox": System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir") + "/src/main/resources/geckodriver.exe"); driver = new FirefoxDriver(); break; case "msedge": System.setProperty("webdriver.edge.driver", System.getProperty("user.dir") + "/src/main/resources/msedgedriver.exe"); driver = new EdgeDriver(); break; case "opera": System.setProperty("webdriver.opera.driver", System.getProperty("user.dir") + "/src/main/resources/operadriver.exe"); driver = new OperaDriver(); break;
问题根因
TestBase中WebDriver、WebDriverWait实例被定义为static静态变量:静态变量属于类级别资源,全局仅存在一份实例。多会话并行执行测试时,所有测试线程会共享同一个静态driver实例,某一个测试线程启动新driver会覆盖其他线程正在使用的driver引用,导致其他线程持有的页面元素引用和实际driver会话不匹配,触发stale元素异常,同时无法支持多测试并行执行。
修复方案
- 移除TestBase中WebDriver、WebDriverWait实例的
static修饰符,将两个对象调整为实例级变量;只读的Properties配置类可保留静态修饰,不存在线程安全问题。调整后的TestBase变量定义参考:
public class TestBase { public WebDriver driver; public WebDriverWait wait; public static Properties config; public static Properties testdata; }
- 移除
initialization()初始化方法的static修饰符,将其调整为实例方法,保证每个测试类实例调用初始化逻辑时,会为自身的实例变量赋值独立的WebDriver对象,不会和其他并行测试的实例产生冲突。 - 基于TestNG生命周期注解管理driver生命周期:使用
@BeforeMethod注解标注初始化方法,保证每个测试方法执行前都会生成独立的driver实例;使用@AfterMethod注解标注driver退出逻辑,每个测试方法执行完成后关闭对应绑定的driver实例,避免资源泄漏。 - 配置multisession.xml时,将并行执行粒度设置为
methods,配置合理的线程数,保证每个测试方法运行在独立线程中、持有专属的driver实例,彻底避免实例覆盖导致的异常。 - 额外约束:页面对象类中不要将WebDriver定义为静态变量,所有和单次测试会话绑定的对象都要保持线程隔离,禁止全局静态共享。
内容的提问来源于stack exchange,提问作者vandee
相关产品推荐
相关产品推荐

