javatestngplaywright-java

How to get the latest Page Value for the iTestContext attributes in Playwright Java (By Overriding)


Overview

Hi In ItestContexts.setAttribute() the method Page Object does not get overridden by the new pages created , I want to dynamically update the the page value in ItestContext on run time

Question

I'm using Playwright with Java to develop a wrapper framework and I have created a custom listener class implementing ITestListener to take screenshot on failure using playwright methods, I only use one Page object in my test class which I overrides with new pages as wanted , but the ItestContext page reference does not get overridden by the latest page value I have set in my test method , how can I achieve ItestContext.setAttribute to update the latest page value on run time, as per my Test Method line 3

@BeforeClass
    public void init(ITestContext iTestContext) {
        iTestContext.setAttribute("Page_Reference", page); //page comes from my inherited BaseClass
    }


@Test(description = "Testing Screenshot by Overriding Practice")
    public void navDishLandPage() {
        page.goTo("https://github.com/"); //page reference comes from my base class - 1
        Page originalPage = page; //stores page reference to later access - 2
        page = getPage("User"); //Overrides the previous page reference by new Page ; getPage("Key") is a wrapper method -3
        page.goTo("https://github.com/cbeust/testng/issues/2905");
        page = originalPage; //switching back to the stored page reference
        System.out.println(page.getTitle());
        Assert.assertEquals(page.getTitle(), "TTT");
    }

Inside My onTestFailureMethod

        Page page = (Page) iTestResult.getTestContext().getAttribute("Page_Reference");
        byte[] bufferImage=page.screenShot();

Solution

  • You need to do the following:

    public Page getPage(String text) {
        Page page; //Your logic goes here to find the page to be returned.
        
        //Get the currently running "@Test" method's result
        ITestResult itr = Reporter.getCurrentTestResult();
    
        // override the attribute with a reference to the latest page object being returned
        itr.setAttribute("Page_Reference", page);
        return page;
    }