Playwright多测试执行失败:TargetClosedError问题排查与解决
问题场景
作为公司独立QA,近期基于Playwright做自动化测试,完成30个测试用例后用Cucumber测试运行器批量执行,出现如下问题:第一个测试用例正常通过,但后续所有测试均失败,报错信息如下:
Error navigating to URL: Playwright connection closed
Error clicking on element: Error {
message='Target page, context or browser has been closed
name='TargetClosedError
stack='TargetClosedError:Target page, context or browser has been closed
我理解错误含义,也尝试遵循最佳实践在每个测试后关闭Page、Browser、BrowserContext及Playwright实例,但问题依旧。
相关代码实现
PlaywrightDriver类
public class PlaywrightDriver { private static Playwright playwright; private static Browser browser; private static BrowserContext browserContext; private static Page page; public PlaywrightDriver() { playwright = Playwright.create(); } public Page initDriver() { //initializing browser type String browserType = ConfigurationReader.getProperty("browser"); //setting arguments for the session List<String> arguments = new ArrayList<>(); arguments.add("--start-maximized"); switch (browserType.toLowerCase()) { case "chromium": browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setArgs(arguments)); break; } browserContext = browser.newContext(); page = browserContext.newPage(); return page; } public void closeDriver() { if(page != null){ page.close(); } if (browserContext != null) { browserContext.close(); } if (browser != null) { browser.close(); } if (playwright != null) { playwright.close(); } } }
Hooks类
public class Hooks extends Base_StepDef{ private PlaywrightDriver driver; private static Page page; @Before public void setup(Scenario scenario) { driver = new PlaywrightDriver(); page = driver.initDriver(); } @After public void tearDown(Scenario scenario) { softAssert.assertAll(); driver.closeDriver(); } public static Page getPage() { return page; // Provide access to the Page instance } }
BrowserUtils中的navigate方法
public static void navigateTo(String url) { page.navigate(url); }
我的预期是:每个测试用例使用全新的Page和BrowserContext,Playwright实例可在所有测试结束后统一关闭,保证多测试用例正常串行执行。
排查过程
最初尝试移除BrowserUtils中的静态navigateTo方法后,页面能够正常加载,但调用其他BrowserUtils中的方法(如click、getTextFromElement)时,仍然出现相同的TargetClosedError错误。
最终解决方案
问题根源在于BrowserUtils中的静态方法依赖静态Page实例:
我之前在BrowserUtils中定义了静态Page对象,并将其赋值为Hooks类中的静态Page实例。由于静态对象的生命周期与JVM一致,第一个测试用例执行完毕后,该Page实例已被关闭,但后续测试用例仍然尝试复用这个已关闭的静态Page对象,导致报错。
修改方案:移除BrowserUtils中的静态Page依赖,改为通过非静态方式传递或获取当前测试用例对应的Page实例,确保每个测试用例使用自己的Page对象。修改后所有测试用例均可正常执行。
内容的提问来源于stack exchange,提问作者Igor Korpak

