英文:
Appium - Could not start a new session on iPad
问题
我正在尝试在真实的iPad设备上自动化iOS应用程序。我的代码在上周之前一直正常工作,但突然从今天开始抛出错误。Xcode
、nodejs
、java
或Appium
都没有升级过。没有任何代码进行了更新。
问题发生在 driver = new IOSDriver(new URL("http://127.0.0.1:4723/"),options);
这一行。
以下是完整的错误消息:
StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
Host info: host: '-MacBook-Air.local', ip: 'fe80:0:0:0:1044:a4fe:6300:fc53%en0'
Build info: version: '4.11.0', revision: '040bc5406b'
System info: os.name: 'Mac OS X', os.arch: 'aarch64', os.version: '13.4.1', java.version: '17.0.6'
Driver info: io.appium.java_client.ios.IOSDriver
Command: [null, newSession {capabilities=[{appium:udid=myudid, appium:xcodeOrgId=myxoceorgid, appium:wdaLaunchTimeout=20000, appium:xcodeSigningId=iPhone Developer, appium:deviceName=iPad, platformName=IOS, appium:automationName=XCuiTest, appium:platformVersion=16.5.1}], desiredCapabilities=Capabilities {appium:automationName: XCuiTest, appium:deviceName: Pritish’s iPad, appium:platformVersion: 16.5.1, appium:udid:dsssddsdssd, appium:wdaLaunchTimeout: 20000, appium:xcodeOrgId: dsdsdsdsdssd, appium:xcodeSigningId: iPhone Developer, platformName: IOS}}]
Capabilities {appium:automationName: XCuiTest, appium:deviceName: my iPad, appium:platformVersion: 16.5.1, appium:udid: sddsdsdsds, appium:wdaLaunchTimeout: 20000, appium:xcodeOrgId: ddsds, appium:xcodeSigningId: iPhone Developer, platformName: IOS}
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:536)
at io.appium.java_client.AppiumDriver.startSession(AppiumDriver.java:229)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:159)
at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:80)
at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:92)
at io.appium.java_client.ios.IOSDriver.<init>(IOSDriver.java:106)
at WebPortal.IOSBaseTest.runOnRealDevice(IOSBaseTest.java:66)
at WebPortal.IOSBaseTest.setup(IOSBaseTest.java:32)
at WebPortal.IOSBaseTest.getDriver(IOSBaseTest.java:25)
at stepDefinitions.TA124_ComprehensiveCI_StepDefinitions.<init>(TA124_ComprehensiveCI_StepDefinitions.java:36)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at io.cucumber.core.runtime.ObjectFactoryServiceLoader$DefaultJavaObjectFactory.cacheNewInstance(ObjectFactoryServiceLoader.java:141)
at io.cucumber.core.runtime.ObjectFactoryServiceLoader$DefaultJavaObjectFactory.getInstance(ObjectFactoryServiceLoader.java:133)
at io.cucumber.java.AbstractGlueDefinition.invokeMethod(AbstractGlueDefinition.java:47)
at io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:29)
at io.cucumber.core.runner.CoreStepDefinition.execute(CoreStepDefinition.java:66)
at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
at io.cucumber.core.runner.ExecutionMode$1.execute(ExecutionMode.java:10)
at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:92)
at io.cucumber.core.runner.TestStep.run(TestStep.java:64)
at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:51)
at io.cucumber.core.runner.TestCase.run(TestCase.java:104)
at io.cucumber.core.runner.Runner.runPickle(Runner.java:73)
at io.cucumber.core.runtime.Runtime.lambda$execute$5(Runtime.java:110)
at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:117)
at io.cucumber.core.runtime.Runtime.lambda$execute$6(Runtime.java:110)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:233)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
at io.cucumber.core.runtime.Runtime.lambda$run$2(Runtime.java:86)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:200)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at io.cucumber.core.runtime.Runtime.run(Runtime.java:87)
at io.cucumber.core.cli.Main.run(Main.java:92)
at cucumber.api.cli.Main.run(Main.java:30)
at cucumber.api.cli.Main.main(Main.java:15)
Caused by: java.lang.NoSuchMethodError: 'java.lang.String org.openqa.selenium.json.Json.toJson(java.lang.Object, int)'
at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:126)
at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:111)
at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:105)
at io.appium.java_client.remote.AppiumProtocolHandshake.createSession(AppiumProtocolHandshake.java:101)
at io.appium.java_client
<details>
<summary>英文:</summary>
I am trying to automate iOS app on real iPad device. My code was working fine till last week and suddenly started throwing error from today. Neither `Xcode`, `nodejs`, `java` or `Appium` has been upgraded. No code has been updated whatsoever.
public AppiumDriver runOnRealDevice() {
try {
XCUITestOptions options = new XCUITestOptions();
options.setDeviceName("my iPad");
options.setPlatformVersion("16.5.1");
options.setWdaLaunchTimeout(Duration.ofSeconds(20));
options.setCapability("xcodeOrgId","......");
options.setCapability("xcodeSigningId","iPhone Developer");
options.setCapability("udid","......");
driver = new IOSDriver(new URL("http://127.0.0.1:4723/"),options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(15));
Map<String,String> params = new HashMap<String,String>();
params.put("bundleId", "com.myapplebundleidentfier");
driver.executeScript("mobile:launchApp",params);
}catch (Exception e) {
System.out.println("Here12 "+e.getLocalizedMessage());
e.printStackTrace();
}
return driver;
}
The issue happens on `driver = new IOSDriver(new URL("http://127.0.0.1:4723/"),options);`
Below is the complete error message
StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
Host info: host: '-MacBook-Air.local', ip: 'fe80:0:0:0:1044:a4fe:6300:fc53%en0'
Build info: version: '4.11.0', revision: '040bc5406b'
System info: os.name: 'Mac OS X', os.arch: 'aarch64', os.version: '13.4.1', java.version: '17.0.6'
Driver info: io.appium.java_client.ios.IOSDriver
Command: [null, newSession {capabilities=[{appium:udid=myudid, appium:xcodeOrgId=myxoceorgid, appium:wdaLaunchTimeout=20000, appium:xcodeSigningId=iPhone Developer, appium:deviceName=iPad, platformName=IOS, appium:automationName=XCuiTest, appium:platformVersion=16.5.1}], desiredCapabilities=Capabilities {appium:automationName: XCuiTest, appium:deviceName: Pritish’s iPad, appium:platformVersion: 16.5.1, appium:udid:dsssddsdssd, appium:wdaLaunchTimeout: 20000, appium:xcodeOrgId: dsdsdsdsdssd, appium:xcodeSigningId: iPhone Developer, platformName: IOS}}]
Capabilities {appium:automationName: XCuiTest, appium:deviceName: my iPad, appium:platformVersion: 16.5.1, appium:udid: sddsdsdsds, appium:wdaLaunchTimeout: 20000, appium:xcodeOrgId: ddsds, appium:xcodeSigningId: iPhone Developer, platformName: IOS}
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:536)
at io.appium.java_client.AppiumDriver.startSession(AppiumDriver.java:229)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:159)
at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:80)
at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:92)
at io.appium.java_client.ios.IOSDriver.<init>(IOSDriver.java:106)
at WebPortal.IOSBaseTest.runOnRealDevice(IOSBaseTest.java:66)
at WebPortal.IOSBaseTest.setup(IOSBaseTest.java:32)
at WebPortal.IOSBaseTest.getDriver(IOSBaseTest.java:25)
at stepDefinitions.TA124_ComprehensiveCI_StepDefinitions.<init>(TA124_ComprehensiveCI_StepDefinitions.java:36)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at io.cucumber.core.runtime.ObjectFactoryServiceLoader$DefaultJavaObjectFactory.cacheNewInstance(ObjectFactoryServiceLoader.java:141)
at io.cucumber.core.runtime.ObjectFactoryServiceLoader$DefaultJavaObjectFactory.getInstance(ObjectFactoryServiceLoader.java:133)
at io.cucumber.java.AbstractGlueDefinition.invokeMethod(AbstractGlueDefinition.java:47)
at io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:29)
at io.cucumber.core.runner.CoreStepDefinition.execute(CoreStepDefinition.java:66)
at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
at io.cucumber.core.runner.ExecutionMode$1.execute(ExecutionMode.java:10)
at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:92)
at io.cucumber.core.runner.TestStep.run(TestStep.java:64)
at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:51)
at io.cucumber.core.runner.TestCase.run(TestCase.java:104)
at io.cucumber.core.runner.Runner.runPickle(Runner.java:73)
at io.cucumber.core.runtime.Runtime.lambda$execute$5(Runtime.java:110)
at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:117)
at io.cucumber.core.runtime.Runtime.lambda$execute$6(Runtime.java:110)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:233)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
at io.cucumber.core.runtime.Runtime.lambda$run$2(Runtime.java:86)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:200)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at io.cucumber.core.runtime.Runtime.run(Runtime.java:87)
at io.cucumber.core.cli.Main.run(Main.java:92)
at cucumber.api.cli.Main.run(Main.java:30)
at cucumber.api.cli.Main.main(Main.java:15)
Caused by: java.lang.NoSuchMethodError: 'java.lang.String org.openqa.selenium.json.Json.toJson(java.lang.Object, int)'
at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:126)
at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:111)
at org.openqa.selenium.remote.NewSessionPayload.create(NewSessionPayload.java:105)
at io.appium.java_client.remote.AppiumProtocolHandshake.createSession(AppiumProtocolHandshake.java:101)
at io.appium.java_client.remote.AppiumCommandExecutor.createSession(AppiumCommandExecutor.java:194)
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:262)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:518)
... 48 more
</details>
# 答案1
**得分**: 1
由于:java.lang.NoSuchMethodError: 'java.lang.String org.openqa.selenium.json.Json.toJson(java.lang.Object, int)'
这意味着您的代码或您正在使用的某个库尝试调用当前加载的库版本中不存在的方法。当库版本不匹配时,经常会看到这种错误。
由于您没有更改代码,而且Appium和其他工具的版本相同,可能是您不小心更新了一些库。检查您项目的依赖项(库/ JAR文件)是否一致并兼容。
- 如果您使用Maven,请检查您的`pom.xml`文件。
- 如果您使用Gradle,请检查您的`build.gradle`文件。
如果您的项目源代码使用Git,请运行`git status`来可视化任何更改。
确保Appium的Java客户端和Selenium的Java客户端版本兼容。
尝试清除缓存并重新安装依赖项。
- 如果使用Maven:
```bash
mvn clean install
- 如果使用Gradle:
./gradlew clean build
如果您只在依赖管理工具中指定了Appium Java客户端,请尝试明确指定兼容的Selenium版本(请参阅兼容矩阵)。Appium的客户端依赖于Selenium,版本之间可能存在兼容性问题。
还要检查您的设备的操作系统版本是否已更新,这可能会影响Appium的行为。
楼主提到通过移除以下内容解决了问题:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-devtools</artifactId>
<version>4.0.0-beta-4</version>
</dependency>
selenium-devtools
依赖项是特定于Chrome和Chrome开发工具协议(CDP)的。它提供了与Chrome的DevTools进行高级自动化任务交互的功能,超出了标准Selenium功能的范围。示例包括操作网络条件、设置断点等。
楼主使用的是版本4.0.0-beta-4
。如果您的其他Selenium依赖项不是相同版本,可能会导致冲突。
selenium-devtools
工件可能已拉入与您项目中的其他依赖项冲突的传递性依赖项。
考虑到楼主的堆栈跟踪显示出现了iOS测试问题(io.appium.java_client.ios.IOSDriver
),Chrome特定的selenium-devtools
依赖项可能是不必要的。Appium iOS测试不使用Chrome DevTools。
由于Java库有时具有相同名称的类,因此可能是selenium-devtools
依赖项引入了与类路径上的其他类冲突的类。
英文:
Caused by: java.lang.NoSuchMethodError: 'java.lang.String org.openqa.selenium.json.Json.toJson(java.lang.Object, int)'
That should mean your code, or one of the libraries you are using, is trying to call a method that does not exist in the version of the library that is currently loaded. It is common to see this error when there are mismatches in library versions.
Since you have not changed your code, and the versions of Appium and other tools are the same, it is possible that you might have inadvertently updated some libraries. Check if your project's dependencies (libraries/jars) are consistent and compatible.
- If you are using Maven, check your
pom.xml
file. - If you are using Gradle, check your
build.gradle
file.
If your project source code with using Git, a git status
should help visualize any change.
Make sure the versions of Appium's Java client and Selenium's Java client are compatible.
Try and clear the cache and reinstall dependencies.
- If using Maven:
mvn clean install
- If using Gradle:
./gradlew clean build
If you are only specifying the Appium Java client in your dependency management tool, try explicitly specifying a compatible Selenium version too (See Compatibility Matrix). Appium's client has a dependency on Selenium, and there might be compatibility issues between versions.
Check also if your device's OS version was updated, it might affect Appium's behavior.
The OP mentions having resolved the issue by removing:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-devtools</artifactId>
<version>4.0.0-beta-4</version>
</dependency>
The selenium-devtools
dependency is specific to Chrome and the Chrome DevTools Protocol (CDP). It provides capabilities to interact with Chrome's DevTools for advanced automation tasks that go beyond the standard Selenium capabilities. Examples include manipulating network conditions, setting breakpoints, etc.
The OP was using version 4.0.0-beta-4
. If your other Selenium dependencies were not of the same version, it might have caused conflicts.
And the selenium-devtools
artifact might have pulled in transitive dependencies that conflicted with other dependencies in your project.
Given the OP's stack trace showed issues with iOS testing (io.appium.java_client.ios.IOSDriver
), the Chrome-specific selenium-devtools
dependency might not have been necessary. Appium iOS testing does not utilize Chrome DevTools.
Since Java libraries sometimes have classes with the same names, it is possible the selenium-devtools
dependency introduced classes that conflicted with others on the classpath.
答案2
得分: 1
我成功解决了我的问题,方法是移除以下依赖项:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-devtools</artifactId>
<version>4.0.0-beta-4</version>
</dependency>
英文:
I managed to resolve my issue by removing following dependency
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-devtools</artifactId>
<version>4.0.0-beta-4</version>
</dependency>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论