serenity-bdd / serenity-core

Serenity BDD is a test automation library designed to make writing automated acceptance tests easier, and more fun.
http://serenity-bdd.info
Other
719 stars 516 forks source link

Lambdatest plugin - Mobile iOS Safari - Handshake response does not match any supported protocol #3287

Closed mihai60beans closed 11 months ago

mihai60beans commented 11 months ago

What happened?

I cannot run tests on LambdaTest using latest 4.x serenity versions. I could do that in the serenity 3.x versions.

The error is:

net.thucydides.core.webdriver.DriverConfigurationError: Could not instantiate class org.openqa.selenium.remote.RemoteWebDriver
        at net.thucydides.core.webdriver.WebDriverFacade.newDriverInstance(WebDriverFacade.java:181)
        at net.thucydides.core.webdriver.WebDriverFacade.newProxyDriver(WebDriverFacade.java:169)
        at net.thucydides.core.webdriver.WebDriverFacade.getProxiedDriver(WebDriverFacade.java:120)
        at net.thucydides.core.webdriver.WebDriverFacade.get(WebDriverFacade.java:209)
        at tests.A_LambdaTest.loginTest(A_LambdaTest.java:11)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at net.serenitybdd.junit.runners.SerenityStatement.evaluate(SerenityStatement.java:33)
        at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
        at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
        at net.serenitybdd.junit.runners.SerenityRunner.performRunChild(SerenityRunner.java:445)
        at net.serenitybdd.junit.runners.SerenityRunner.runChild(SerenityRunner.java:419)
        at net.serenitybdd.junit.runners.SerenityRunner.runChild(SerenityRunner.java:58)
        at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
        at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
        at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
        at net.serenitybdd.junit.runners.SerenityRunner.run(SerenityRunner.java:229)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
        at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
Caused by: net.thucydides.core.webdriver.DriverConfigurationError: WebDriver was unable to create a new instance of type class org.openqa.selenium.remote.RemoteWebDriver
WebDriver reported the following message: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure. 

        at net.thucydides.core.webdriver.WebDriverFactory.newWebdriverInstance(WebDriverFactory.java:152)
        at net.thucydides.core.webdriver.WebDriverFacade.newDriverInstance(WebDriverFacade.java:178)
        ... 34 more
Caused by: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure. 

Build info: version: '4.14.1', revision: '03f8ede370'
System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '12.3.1', java.version: '21'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Command: [null, newSession {capabilities=[Capabilities {LT:Options: {accessKey: .......<removed>........., build: myBuild, deviceName: iPhone 12, isRealMobile: false, name: myName, project: myProject, projectName: Serenity BDD Test Suite, selenium_version: 4.0.0, tags: [feature:tests/A_LambdaTest], user: , username: <removed>, w3c: true}, browserName: Safari, browserVersion: latest, build: Serenity BDD Test Suite - 2..., name: A_LambdaTest - Login test, platformName: IOS, projectName: Serenity BDD Test Suite}]}]
Capabilities {LT:Options: {accessKey: ....<removed>..., build: myBuild, deviceName: iPhone 12, isRealMobile: false, name: myName, project: myProject, projectName: Serenity BDD Test Suite, selenium_version: 4.0.0, tags: [feature:tests/A_LambdaTest], user: , username: <removed>, w3c: true}, browserName: Safari, browserVersion: latest, build: Serenity BDD Test Suite - 2..., name: A_LambdaTest - Login test, platformName: IOS, projectName: Serenity BDD Test Suite}
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:620)
        at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:236)
        at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:163)
        at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:143)
        at net.serenitybdd.core.webdriver.driverproviders.RemoteDriverProvider.newInstance(RemoteDriverProvider.java:82)
        at net.thucydides.core.webdriver.WebDriverFactory.createWebDriver(WebDriverFactory.java:164)
        at net.thucydides.core.webdriver.WebDriverFactory.newWebdriverInstance(WebDriverFactory.java:142)
        ... 35 more
Caused by: java.lang.IllegalArgumentException: Illegal key values seen in w3c capabilities: [build, name, projectName]
        at org.openqa.selenium.remote.NewSessionPayload.lambda$validate$4(NewSessionPayload.java:184)
        at java.base/java.util.stream.ReferencePipeline$15$1.accept(ReferencePipeline.java:540)
        at java.base/java.util.stream.ReferencePipeline$15$1.accept(ReferencePipeline.java:541)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.stream.ReferencePipeline$15$1.accept(ReferencePipeline.java:541)
        at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at org.openqa.selenium.remote.NewSessionPayload.validate(NewSessionPayload.java:188)
        at org.openqa.selenium.remote.NewSessionPayload.<init>(NewSessionPayload.java:91)
        at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:127)
        at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:111)
        at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:67)
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:163)
        at org.openqa.selenium.remote.TracedCommandExecutor.execute(TracedCommandExecutor.java:51)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:602)
        ... 41 more

What did you expect to happen?

I can run tests on LambdaTest for mobile iOS Safari using serenity latest version.

Serenity BDD version

4.0.15

JDK version

21

Execution environment

MacOS or Windows

How to reproduce the bug.

Using Java Junit Serenity and LambdaTest plugin

pom.xml

<serenity.version>4.0.15</serenity.version>
<selenium.version>4.14.1</selenium.version>
<selenium.remote.version>4.13.0</selenium.remote.version>

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-remote-driver</artifactId>
            <version>${selenium.remote.version}</version>
        </dependency>
        <dependency>
            <groupId>net.serenity-bdd</groupId>
            <artifactId>serenity-core</artifactId>
            <version>${serenity.version}</version>
        </dependency>
        <dependency>
            <groupId>net.serenity-bdd</groupId>
            <artifactId>serenity-junit</artifactId>
            <version>${serenity.version}</version>
        </dependency>
        <dependency>
            <groupId>net.serenity-bdd</groupId>
            <artifactId>serenity-shutterbug1x</artifactId>
            <version>${serenity.version}</version>
        </dependency>
        <dependency>
            <groupId>net.serenity-bdd</groupId>
            <artifactId>serenity-model</artifactId>
            <version>${serenity.version}</version>
        </dependency>
        <dependency>
            <groupId>net.serenity-bdd</groupId>
            <artifactId>serenity-lambdatest</artifactId>
            <version>${serenity.version}</version>
        </dependency>

serenity.conf

environments {
    lambdatest_safari_mobile {
        webdriver {
            driver = remote
            remote.url = "https://<myUser>:<myAccessKey>@hub.lambdatest.com/wd/hub"
            capabilities {
                browserName = "Safari"
                browserVersion = "latest"
                platformName = "ios"
                "LT:Options" {
            deviceName = "iPhone 12"
                    isRealMobile = "false"
                }
            }
        }
    }

Command to run the tests: mvn clean test -Dtest=A_LambdaTest -Denvironment=lambdatest_safari_mobile

How can we make it happen?

Add it to the Serenity BDD backlog and wait for a volunteer to pick it up

wakaleo commented 11 months ago

"Illegal key values seen in w3c capabilities: [build, name, projectName]". Your configuration is incorrect. See https://github.com/serenity-bdd/screenplay-pattern-todomvc and https://github.com/serenity-bdd/screenplay-pattern-todomvc/blob/master/src/test/resources/serenity.conf for an example of a correctly configured LambdaTest test suite.

mihai60beans commented 11 months ago

My configuration for Chrome Web works also. The configuration for LambdaTest: Chrome mobile android or Safari mobile ios does not work.

I took your project and changed the serenity.conf and the same result: Chrome Web works but Safari iOS or Chrome android does not work.

I am running mvn clean verify -Ppageobjects

This is the error I receive for Safari iOS:

[ERROR] LearnAboutTheApplication.should_see_how_to_begin_with_page_objects:24 » DriverConfiguration WebDriver was unable to create a new instance of type class org.openqa.selenium.remote.RemoteWebDriver WebDriver reported the following message: Could not start a new session. Handshake response does not match any supported protocol. Response payload: {"sessionId":"SZHCI-LB4DU-OVLVR-6FHPU","status":0,"value":{"browserName":"Safari","databaseEnabled":false,"deviceName":"iPhone 12","deviceReadyTimeout":120,"fullReset":false,"headless":false,"javascriptEnabled":true,"launchTimeout":300,"locationContextEnabled":false,"locationServicesAuthorized":true,"nativeWebScreenshot":true,"networkConnectionEnabled":false,"newCommandTimeout":910,"performance":false,"platform":"ANY","platformName":"ios","platformVersion":"14.2","shutdownOtherSimulators":true,"takesScreenshot":true,"udid":"","useNewWDA":true,"waitForQuiescence":false,"wdaLaunchTimeout":120000,"webStorageEnabled":false}}

serenity.conf


  base.url = "http://todomvc.com/examples/angularjs/#/"
  driver = chrome
  capabilities {
    browserName = "chrome"
    acceptInsecureCerts = true
    unhandledPromptBehavior = accept
    "goog:chromeOptions" {
      args = ["test-type", "ignore-certificate-errors", "--window-size=1000,800",
        "--remote-allow-origins=*","incognito", "disable-infobars", "disable-gpu",
        "disable-default-apps", "disable-popup-blocking"]
    }
  }
}
headless.mode = false

serenity {
  project.name = "Serenity BDD TodoMVC"
  test.root = "net.serenitybdd.demos.todos"
  tag.failures = "true"
  linked.tags = "issue"
  restart.browser.for.each = scenario
  logging = verbose
  #
  # Use these options to reduce the size of the reports
  #
  # Report on test durations
  report.test.durations = true
  # Store HTML source for each page
  # (can be: ALWAYS, FAILURES or NEVER)
//  store.html = FAILURES
}

// Default page configuration
home.page = "http://todomvc.com/examples/angularjs/#/"

environment = lambdatest
environments {
  local {
    home.page = "http://localhost:8080/angularjs/#/"
  }
  prod {
    home.page = "http://todomvc.com/examples/angularjs/#/"
  }
  chrome {
    webdriver {
      driver = chrome
      autodownload = true
      capabilities {
        browserName = "chrome"
        acceptInsecureCerts = true
        "goog:chromeOptions" {
          args = ["test-type", "ignore-certificate-errors", "headless", "--window-size=1000,800"
            "incognito", "disable-infobars", "disable-gpu", "disable-default-apps", "disable-popup-blocking"]
        }
      }
    }
  }

   lambdatest {
      home.page = "http://todomvc.com/examples/angularjs/#/"
      #
      # You define the Lambdatest credentials either in the LT_USERNAME and LT_ACCESS_KEY environment variables, or by
      # setting the following properties:
      #
      # lt.user = your.username
      # lt.key = your.access.key
      #
      # You can also override the Lambdatest grid url by setting the following property.
      # lt.grid="hub.lambdatest.com"
      webdriver {
        driver = remote
        remote.url = "https://myusername:mypassword@hub.lambdatest.com/wd/hub"
        capabilities {
          #appium.browserName = "Safari"
          #browserName = "Chrome"
          browserName = "Safari"
          #browserVersion = "latest"
          "LT:options" {

            #appium.browserName = "Safari"
            #appium.automationName = "XCUITest"
            #appium.platformName = "ios"
            #appium.deviceName = "iPhone 12"

            #browserName = "Safari"
            #automationName = "XCUITest"

            platformName = "ios"
            deviceName = "iPhone 12"

            #platformName = "ios"
            #deviceName = "iPhone 12"

            #appium.platformName = "android"
            #appium.deviceName = "Galaxy S22 Ultra 5G"
            #platformName = "android"
            #deviceName = "Galaxy S22 Ultra 5G"

            isRealMobile = "false"
          }
        }
      }

#   webdriver {
#           driver = remote
#           remote.url = "https://myusername:mypassword@hub.lambdatest.com/wd/hub"
#           capabilities {
#             browserName = "chrome"
#             "goog:chromeOptions" {
#               args = ["test-type", "no-sandbox", "ignore-certificate-errors", "--window-size=1000,800",
#                 "incognito", "disable-infobars", "disable-gpu", "disable-default-apps", "disable-popup-blocking"]
#             }
#             "LT:options" {
#               platformName = "Windows 10"
#             }
#           }
#         }
    }
}```
wakaleo commented 11 months ago

I don't use the Safari driver very often but you will need to find the right combination of W3C properties to work with Safari on LambdaTest. If it works with Chrome it isn't a Serenity issue (Serenity just sends the W3C options you provide it), so you should ask the LambdaTest folk.

This configuration worked for me:

    webdriver {
      driver = remote
      remote.url = "https://"${LT_USERNAME}":"${LT_ACCESS_KEY}"@hub.lambdatest.com/wd/hub"
      capabilities {
        browserName = "Safari"
        "LT:options" {
          platformName = "Mac OS X"
        }
      }
mihai60beans commented 11 months ago

Safari Web works indeed, Safari mobile iOS doesn't work with serenity 4.x.x versions but it did work with serenity 3.6.7 version.

Below worked for Safari mobile iOS with serenity 3.6.7.

environments {
    lambdatest_safari_mobile {
        webdriver {
            driver = remote
            remote.url = "https://myusername:mypassword@hub.lambdatest.com/wd/hub"
            capabilities {
                browserName = "Safari"
                browserVersion = "latest"
                "LT:Options" {
                    platformName = "ios"
                    deviceName = "iPhone 12"
                    isRealMobile = "false"
                }
            }
        }
    }

I will ask also LambdaTest team if you say it's not a Serenity plugin issue.

wakaleo commented 11 months ago

You will want to ask them about any modifications you need to do to your capabilities for Selenium 4.x, as the latest versions of Serenity use the latest versions of Selenium which have a number of breaking changes.

mihai60beans commented 11 months ago

sure, will do. thanks! I will close this then.