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

