selenide / selenide

Concise UI Tests with Java!
http://selenide.org
MIT License
1.81k stars 573 forks source link

Selenide + Appium + Saucelabs: Could not start a new session. Response code 401 #2717

Closed algernon28 closed 5 months ago

algernon28 commented 5 months ago

The problem

I am using Selenide + Cucumber + Appium + Saucelabs. While I'm having no issues in web tests, integrating Selenide into my Appium framework is giving me headaches. Now I am getting this error:

Could not start a new session. Response code 401. Message: failed serving request POST /wd/hub/session: Unauthorized".

This is the complete stacktrace from the @Before:

      org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 401. Message: failed serving request POST /wd/hub/session: Unauthorized 
Host info: host: 'DESKTOP-5LG617I', ip: '172.30.144.1'
Build info: version: '4.19.1', revision: 'abe0ee07dc'
System info: os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '17.0.5'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Command: [null, newSession {capabilities=[Capabilities {acceptInsecureCerts: true, pageLoadStrategy: normal, unhandledPromptBehavior: accept}]}]
Capabilities {acceptInsecureCerts: true, pageLoadStrategy: normal, unhandledPromptBehavior: accept}
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:114)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:75)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:61)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:162)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:518)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:232)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:161)
    at com.codeborne.selenide.webdriver.RemoteDriverFactory.create(RemoteDriverFactory.java:24)
    at com.codeborne.selenide.webdriver.WebDriverFactory.createWebDriverInstance(WebDriverFactory.java:114)
    at com.codeborne.selenide.webdriver.WebDriverFactory.createWebDriver(WebDriverFactory.java:67)
    at com.codeborne.selenide.drivercommands.CreateDriverCommand.lambda$createDriver$0(CreateDriverCommand.java:72)
    at com.codeborne.selenide.logevents.SelenideLogger.wrap(SelenideLogger.java:133)
    at com.codeborne.selenide.logevents.SelenideLogger.get(SelenideLogger.java:113)
    at com.codeborne.selenide.drivercommands.CreateDriverCommand.createDriver(CreateDriverCommand.java:48)
    at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.createDriver(WebDriverThreadLocalContainer.java:189)
    at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.createAndRegisterDriver(WebDriverThreadLocalContainer.java:174)
    at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.getAndCheckWebDriver(WebDriverThreadLocalContainer.java:136)
    at com.codeborne.selenide.WebDriverRunner.getAndCheckWebDriver(WebDriverRunner.java:113)
    at com.codeborne.selenide.logevents.SelenideLogger.lambda$run$0(SelenideLogger.java:105)
    at com.codeborne.selenide.logevents.SelenideLogger.wrap(SelenideLogger.java:133)
    at com.codeborne.selenide.logevents.SelenideLogger.run(SelenideLogger.java:104)
    at com.codeborne.selenide.appium.AppiumNavigator.launchApp(AppiumNavigator.java:19)
    at com.codeborne.selenide.appium.SelenideAppium.launchApp(SelenideAppium.java:35)
    at com.edenred.qa.multiwallet.utils.CucumberHooks.beforeScenario(CucumberHooks.java:52)

And this (but it's just a consequence) it's from the @After:

    java.lang.IllegalStateException: No webdriver is bound to current thread: 1. You need to call open(url) first.
    at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.lambda$currentThreadDriver$1(WebDriverThreadLocalContainer.java:164)
    at java.base/java.util.Optional.orElseThrow(Optional.java:403)
    at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.currentThreadDriver(WebDriverThreadLocalContainer.java:163)
    at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.getWebDriver(WebDriverThreadLocalContainer.java:126)
    at com.codeborne.selenide.WebDriverRunner.getWebDriver(WebDriverRunner.java:95)
    at com.codeborne.selenide.impl.StaticDriver.getWebDriver(StaticDriver.java:51)
    at com.codeborne.selenide.Driver.executeJavaScript(Driver.java:56)
    at com.codeborne.selenide.SelenideDriver.executeJavaScript(SelenideDriver.java:225)
    at com.codeborne.selenide.Selenide.executeJavaScript(Selenide.java:552)
    at com.edenred.qa.multiwallet.utils.CucumberHooks.afterScenario(CucumberHooks.java:76)

It seems that my Webdriverprovider is not being taken in account. I attach here all the relevant files in the zip.

Details

If necessary, describe the problem you have been experiencing in more detail.

Tell us about your environment

asolntsev commented 5 months ago

Yes, if you set property selenide.remote, your WebDriverProvider will not be used. (I agree that it's not obvious, and should be logged/documented/improved).

You need to

  1. remove line selenide.remote=... from selenide.properties, and
  2. replace line nr. 40 in SaucelabsAndroidProvider:
    URL sauceURL = new URL("https://ondemand.eu-central-1.saucelabs.com:443/wd/hub");
algernon28 commented 5 months ago

Thanks I did, but now I'm getting a new error, it's breaking when trying ti instantiate a new AndroidDriver. The URL is correct, I'm confused.

" org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure. Host info: host: 'WEL-CPYFKX3', ip: '192.168.51.99' at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:536) at io.appium.java_client.AppiumDriver.startSession(AppiumDriver.java:268) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:161) at io.appium.java_client.AppiumDriver.(AppiumDriver.java:90) at io.appium.java_client.AppiumDriver.(AppiumDriver.java:102) at io.appium.java_client.android.AndroidDriver.(AndroidDriver.java:109) at com.edenred.qa.multiwallet.configuration.SaucelabsAndroidProvider.createDriver(SaucelabsAndroidProvider.java:42) at com.codeborne.selenide.webdriver.DefaultDriverFactory.createInstanceOf(DefaultDriverFactory.java:37) at com.codeborne.selenide.webdriver.DefaultDriverFactory.create(DefaultDriverFactory.java:26) at com.codeborne.selenide.webdriver.WebDriverFactory.createWebDriverInstance(WebDriverFactory.java:117) at com.codeborne.selenide.webdriver.WebDriverFactory.createWebDriver(WebDriverFactory.java:67) at com.codeborne.selenide.drivercommands.CreateDriverCommand.lambda$createDriver$0(CreateDriverCommand.java:72) at com.codeborne.selenide.logevents.SelenideLogger.wrap(SelenideLogger.java:133) at com.codeborne.selenide.logevents.SelenideLogger.get(SelenideLogger.java:113) at com.codeborne.selenide.drivercommands.CreateDriverCommand.createDriver(CreateDriverCommand.java:48) at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.createDriver(WebDriverThreadLocalContainer.java:189) at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.createAndRegisterDriver(WebDriverThreadLocalContainer.java:174) at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.getAndCheckWebDriver(WebDriverThreadLocalContainer.java:136) at com.codeborne.selenide.WebDriverRunner.getAndCheckWebDriver(WebDriverRunner.java:113) at com.codeborne.selenide.logevents.SelenideLogger.lambda$run$0(SelenideLogger.java:105) at com.codeborne.selenide.logevents.SelenideLogger.wrap(SelenideLogger.java:133) at com.codeborne.selenide.logevents.SelenideLogger.run(SelenideLogger.java:104) at com.codeborne.selenide.appium.AppiumNavigator.launchApp(AppiumNavigator.java:19) at com.codeborne.selenide.appium.SelenideAppium.launchApp(SelenideAppium.java:35) at com.edenred.qa.multiwallet.utils.CucumberHooks.beforeScenario(CucumberHooks.java:53) Caused by: org.openqa.selenium.WebDriverException: java.lang.NoSuchMethodException: org.openqa.selenium.remote.ProtocolHandshake.createSession(org.openqa.selenium.remote.http.HttpHandler,java.util.function.Supplier,long) Build info: version: '4.19.1', revision: 'abe0ee07dc' System info: os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '17.0.9' Driver info: driver.version: AndroidDriver at io.appium.java_client.remote.AppiumProtocolHandshake.createSession(AppiumProtocolHandshake.java:137) at io.appium.java_client.remote.AppiumProtocolHandshake.createSession(AppiumProtocolHandshake.java:102) at io.appium.java_client.remote.AppiumCommandExecutor.createSession(AppiumCommandExecutor.java:176) at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:237) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:518) at io.appium.java_client.AppiumDriver.startSession(AppiumDriver.java:268) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:161) at io.appium.java_client.AppiumDriver.(AppiumDriver.java:90) at io.appium.java_client.AppiumDriver.(AppiumDriver.java:102) at io.appium.java_client.android.AndroidDriver.(AndroidDriver.java:109) at com.edenred.qa.multiwallet.configuration.SaucelabsAndroidProvider.createDriver(SaucelabsAndroidProvider.java:42) at com.codeborne.selenide.webdriver.DefaultDriverFactory.createInstanceOf(DefaultDriverFactory.java:37) at com.codeborne.selenide.webdriver.DefaultDriverFactory.create(DefaultDriverFactory.java:26) at com.codeborne.selenide.webdriver.WebDriverFactory.createWebDriverInstance(WebDriverFactory.java:117) at com.codeborne.selenide.webdriver.WebDriverFactory.createWebDriver(WebDriverFactory.java:67) at com.codeborne.selenide.drivercommands.CreateDriverCommand.lambda$createDriver$0(CreateDriverCommand.java:72) at com.codeborne.selenide.logevents.SelenideLogger.wrap(SelenideLogger.java:133) at com.codeborne.selenide.logevents.SelenideLogger.get(SelenideLogger.java:113) at com.codeborne.selenide.drivercommands.CreateDriverCommand.createDriver(CreateDriverCommand.java:48) at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.createDriver(WebDriverThreadLocalContainer.java:189) at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.createAndRegisterDriver(WebDriverThreadLocalContainer.java:174) at com.codeborne.selenide.impl.WebDriverThreadLocalContainer.getAndCheckWebDriver(WebDriverThreadLocalContainer.java:136) at com.codeborne.selenide.WebDriverRunner.getAndCheckWebDriver(WebDriverRunner.java:113) at com.codeborne.selenide.logevents.SelenideLogger.lambda$run$0(SelenideLogger.java:105) at com.codeborne.selenide.logevents.SelenideLogger.wrap(SelenideLogger.java:133) at com.codeborne.selenide.logevents.SelenideLogger.run(SelenideLogger.java:104) at com.codeborne.selenide.appium.AppiumNavigator.launchApp(AppiumNavigator.java:19) at com.codeborne.selenide.appium.SelenideAppium.launchApp(SelenideAppium.java:35) at com.edenred.qa.multiwallet.utils.CucumberHooks.beforeScenario(CucumberHooks.java:53) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at io.cucumber.java.Invoker.doInvoke(Invoker.java:66) at io.cucumber.java.Invoker.invoke(Invoker.java:24) at io.cucumber.java.AbstractGlueDefinition.invokeMethod(AbstractGlueDefinition.java:47) at io.cucumber.java.JavaHookDefinition.execute(JavaHookDefinition.java:64) at io.cucumber.core.runner.CoreHookDefinition.execute(CoreHookDefinition.java:46) at io.cucumber.core.runner.HookDefinitionMatch.runStep(HookDefinitionMatch.java:21) at io.cucumber.core.runner.ExecutionMode$1.execute(ExecutionMode.java:10) at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:81) at io.cucumber.core.runner.TestStep.run(TestStep.java:53) at io.cucumber.core.runner.TestCase.run(TestCase.java:78) at io.cucumber.core.runner.Runner.runPickle(Runner.java:75) at io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.lambda$runTestCase$4(CucumberEngineExecutionContext.java:112) at io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$5(CucumberExecutionContext.java:136) at io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23) at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:136) at io.cucumber.junit.platform.engine.CucumberEngineExecutionContext.runTestCase(CucumberEngineExecutionContext.java:109) at io.cucumber.junit.platform.engine.NodeDescriptor$PickleDescriptor.execute(NodeDescriptor.java:168) at io.cucumber.junit.platform.engine.NodeDescriptor$PickleDescriptor.execute(NodeDescriptor.java:90) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:76) at org.junit.platform.suite.engine.SuiteLauncher.execute(SuiteLauncher.java:63) at org.junit.platform.suite.engine.SuiteTestDescriptor.execute(SuiteTestDescriptor.java:128) at org.junit.platform.suite.engine.SuiteTestEngine.lambda$execute$0(SuiteTestEngine.java:73) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) 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:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at org.junit.platform.suite.engine.SuiteTestEngine.execute(SuiteTestEngine.java:73) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56) at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184) at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148) at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:122) 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: java.lang.NoSuchMethodException: org.openqa.selenium.remote.ProtocolHandshake.createSession(org.openqa.selenium.remote.http.HttpHandler,java.util.function.Supplier,long) at java.base/java.lang.Class.getDeclaredMethod(Class.java:2675) at io.appium.java_client.remote.AppiumProtocolHandshake.createSession(AppiumProtocolHandshake.java:128)"

files.zip

asolntsev commented 5 months ago

Read your stack trace carefully. You will see the reason there:

java.lang.NoSuchMethodException: org.openqa.selenium.remote.ProtocolHandshake.createSession

Usually it means that you have invalid versions of some dependencies.

algernon28 commented 5 months ago

Thanks, I tried to update Appium from 9.2.0 to 9.2.2 and it seems to work now