microsoft/playwright-java

[BUG] ParameterResolutionException when tests written in Kotlin

Closed this issue · 3 comments

System info

  • Playwright Version: [1.40.0]
  • Operating System: [Linux RedHat]
  • Browser: [All]
  • Language: Kotlin 1.9.0
  • Java version: 17
  • Other info: Same test in Java just works perfect.

Source code

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>play-jav</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.playwright</groupId>
            <artifactId>playwright</artifactId>
            <version>1.40.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.10.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.10.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.10.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
  • ChromeBrowserPage Extension
open class ChromeBrowserPage : BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback,
    ParameterResolver {

    private lateinit var playwright: Playwright
    private lateinit var browser: Browser
    private lateinit var browserContext: BrowserContext
    private lateinit var page: Page


    override fun beforeAll(p0: ExtensionContext?) {
        playwright = Playwright.create()
    }

    override fun afterAll(p0: ExtensionContext?) {
        playwright.close()
    }

    override fun beforeEach(p0: ExtensionContext?) {
        browser = playwright
            .chromium()
            .launch(BrowserType.LaunchOptions().setHeadless(false))
        browserContext = browser.newContext()
        page = browserContext.newPage()
    }

    override fun afterEach(p0: ExtensionContext?) {
        browserContext.close()
    }

    override fun supportsParameter(parameterContext: ParameterContext?, extensionContext: ExtensionContext?): Boolean {
        return parameterContext?.parameter?.type?.equals(Page::class) == true
    }

    override fun resolveParameter(p0: ParameterContext?, p1: ExtensionContext?): Any {
        return page
    }
}
  • Test class
@ExtendWith(ChromeBrowserPage::class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class LoginPageTest {


    @Test
    fun `to test successful login to hr application`(page: Page) {
        page.navigate("https://opensource-demo.orangehrmlive.com/")
        page.getByPlaceholder("Username").fill("Admin")
        page.getByPlaceholder("Password").fill("admin123")

        page.getByRole(AriaRole.BUTTON, Page.GetByRoleOptions().setName("Login")).click()

        PlaywrightAssertions.assertThat(page).hasTitle("OrangeHRM")

        PlaywrightAssertions.assertThat(page.getByRole(AriaRole.HEADING, Page.GetByRoleOptions().setName("Dashboard")))
            .containsText("Dashboard")
    }

}

Steps

  • Click green test icon and run test on IDE

Expected
Expecting chrome browser opens and navigate and login to open hr webportal.

Actual
As soon as test starts it fails with this error - However same test works without any error with Java.

org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [com.microsoft.playwright.Page arg0] in method [public final void com.hr.app.login.LoginPageTest.to test successful login to hr application(com.microsoft.playwright.Page)].

	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

I hope this much helps; or kindly do let me know any further information.
Thank you

As the exception text suggests, JUnit failed to resolve Page parameter. Most likely supportsParameter returns false for the page parameter. Please refer to JUnit documentation.

You are initializing page inside the beforeEach which happens after parameter resolution. you must initialize page inside the resolveParameter.

FYI, we're building this into playwright-java soon. I'm hoping with the next release it will be there so you won't have to resolve the parameters yourself

Closing per the response above, feel free to open a new issue if it doesn't work.