Kobiton设备农场运行Appium自动化测试时遇W3C会话异常
问题:Kobiton设备农场Appium测试抛出W3C会话支持异常
此前在Kobiton设备农场运行Appium自动化测试一切正常,近期突然抛出异常:Could not start a new session. Only W3C sessions are supported. Please make sure your server is up to date.,更换测试应用或设备后问题依旧,自动生成的RunApplication类未做修改。
错误日志
FAILED CONFIGURATION: @BeforeClass *RunApplication org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Only W3C sessions are supported. Please make sure your server is up to date. Host info: host: '', ip: '127.0.0.1' Build info: version: '4.6.0', revision: '79f1c02ae20' System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '12.6', java.version: '18.0.1.1' Driver info: io.appium.java_client.android.AndroidDriver Command: [null, newSession {capabilities=[{appium:app=kobiton-store:v528820, appium:captureScreenshots=true, appium:deviceGroup=KOBITON, appium:deviceName=Galaxy*, appium:deviceOrientation=portrait, platformName=ANDROID, appium:platformVersion=1*, appium:sessionDescription=, appium:sessionName=Automation test session}], desiredCapabilities=Capabilities {app: kobiton-store:v528820, captureScreenshots: true, deviceGroup: KOBITON, deviceName: Galaxy*, deviceOrientation: portrait, platformName: ANDROID, platformVersion: 1*, sessionDescription: , sessionName: Automation test session}}] Capabilities {} at io.appium.java_client.remote.AppiumCommandExecutor.createSession(AppiumCommandExecutor.java:154) at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:180) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:541) at io.appium.java_client.AppiumDriver.startSession(AppiumDriver.java:224) at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:157) at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:79) at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:87) at io.appium.java_client.android.AndroidDriver.<init>(AndroidDriver.java:116) at Testy.BaseConfiguration.AppiumAndroidDoctor.RunApplication(AppiumAndroidDoctor.java:42) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:69) at org.testng.internal.invokers.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:361) at org.testng.internal.invokers.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:296) at org.testng.internal.invokers.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:180) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:122) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.testng.TestRunner.privateRun(TestRunner.java:806) at org.testng.TestRunner.run(TestRunner.java:601) at org.testng.SuiteRunner.runTest(SuiteRunner.java:433) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:427) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:387) at org.testng.SuiteRunner.run(SuiteRunner.java:330) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256) at org.testng.TestNG.runSuitesLocally(TestNG.java:1176) at org.testng.TestNG.runSuites(TestNG.java:1099) at org.testng.TestNG.run(TestNG.java:1067) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
当前使用的Desired Capabilities代码
package Testy.BaseConfiguration; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.time.Duration; import java.util.Properties; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeTest; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; public class AppiumAndroidDoctor { public AndroidDriver driver; @BeforeClass public void RunApplication() throws IOException { String kobitonServerUrl = "myKobitonServerUrl"; DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("sessionName", "Automation test session"); capabilities.setCapability("sessionDescription", ""); capabilities.setCapability("deviceOrientation", "portrait"); capabilities.setCapability("captureScreenshots", true); capabilities.setCapability("app", "kobiton-store:v528820"); capabilities.setCapability("deviceGroup", "KOBITON"); capabilities.setCapability("deviceName", "Galaxy*"); capabilities.setCapability("platformVersion", "1*"); capabilities.setCapability("platformName", "Android"); driver = new AndroidDriver(new URL(kobitonServerUrl),capabilities); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(20)); } @AfterClass public void tearDown() { driver.quit(); } }
解决方案
问题核心是旧的DesiredCapabilities类不支持W3C标准会话格式,而Kobiton的Appium服务已升级为仅支持W3C会话,需按以下方式修改:
替换
DesiredCapabilities为UiAutomator2Options
代码已导入UiAutomator2Options,直接用它配置参数,自动生成符合W3C标准的会话请求。修改后的代码示例
package Testy.BaseConfiguration; import java.io.IOException; import java.net.URL; import java.time.Duration; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; public class AppiumAndroidDoctor { public AndroidDriver driver; @BeforeClass public void RunApplication() throws IOException { String kobitonServerUrl = "myKobitonServerUrl"; UiAutomator2Options options = new UiAutomator2Options(); options.setCapability("sessionName", "Automation test session"); options.setCapability("sessionDescription", ""); options.setCapability("deviceOrientation", "portrait"); options.setCapability("captureScreenshots", true); options.setCapability("app", "kobiton-store:v528820"); options.setCapability("deviceGroup", "KOBITON"); options.setCapability("deviceName", "Galaxy*"); options.setCapability("platformVersion", "1*"); options.setPlatformName("Android"); driver = new AndroidDriver(new URL(kobitonServerUrl), options); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(20)); } @AfterClass public void tearDown() { driver.quit(); } }
- 额外注意事项
- 确保Appium Java客户端版本与Selenium 4.6.0兼容
- Kobiton服务端已淘汰旧的JSON Wire协议会话,必须使用W3C标准请求格式
内容的提问来源于stack exchange,提问作者Krzysztof Potoczek
相关产品推荐
相关产品推荐

