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

如何在Playwright Java中动态更新ITestContext的最新Page值

解决方案:动态更新ITestContext中的Page引用

问题核心是:你在@BeforeClass中仅给ITestContext设置了一次初始Page引用,但后续测试方法里直接修改page变量只是改变了实例变量的指向,并未同步更新ITestContext中存储的引用,导致监听器拿到的始终是旧的Page对象。

以下两种方法可解决该问题:

方法一:每次切换Page时手动更新ITestContext

在测试方法中注入ITestContext,每次替换page后主动调用setAttribute更新上下文里的引用:

@Test(description = "Testing Screenshot by Overriding Practice")
public void navDishLandPage(ITestContext context) {
    page.goTo("https://github.com/");
    Page originalPage = page;
    
    // 替换为新Page后立即更新上下文
    page = getPage("User");
    context.setAttribute("Page_Reference", page);
    
    page.goTo("https://github.com/cbeust/testng/issues/2905");
    
    // 切回原Page时同步更新上下文
    page = originalPage;
    context.setAttribute("Page_Reference", page);
    
    System.out.println(page.getTitle());
    Assert.assertEquals(page.getTitle(), "TTT");
}

方法二:封装Page的setter方法(推荐)

在BaseClass中封装setPage方法,统一更新实例变量和ITestContext的逻辑,避免重复代码:

首先在BaseClass中注入并持有ITestContext,实现setter:

public class BaseClass {
    protected Page page;
    private ITestContext testContext;

    @BeforeClass
    public void init(ITestContext iTestContext) {
        this.testContext = iTestContext;
        // 初始化时用setter设置初始Page
        setPage(createInitialPage()); // 替换为你创建初始Page的实际逻辑
    }

    protected void setPage(Page newPage) {
        this.page = newPage;
        if (testContext != null) {
            testContext.setAttribute("Page_Reference", newPage);
        }
    }

    // 你的现有封装方法
    protected Page getPage(String key) {
        // 原有的Page创建逻辑
        return new Page();
    }
}

测试方法中直接调用setPage替换Page对象即可:

@Test(description = "Testing Screenshot by Overriding Practice")
public void navDishLandPage() {
    page.goTo("https://github.com/");
    Page originalPage = page;
    
    // 用封装的setPage替换直接赋值
    setPage(getPage("User"));
    page.goTo("https://github.com/cbeust/testng/issues/2905");
    
    // 切回原Page时同样调用setPage
    setPage(originalPage);
    
    System.out.println(page.getTitle());
    Assert.assertEquals(page.getTitle(), "TTT");
}

这样无论测试方法中如何切换Page,ITestContext里的引用都会自动同步更新,监听器在onTestFailure中就能拿到当前活跃的Page对象进行截图。

内容的提问来源于stack exchange,提问作者Kasun Herath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:52:42