- 环境:macos
- 移动端型号:VIVO X30
- 移动端系统:android 10
- 问题复述:appium测试微信小程序切换context时,频繁出现chrome not reachable, 频率1/2左右。
- 开发语言:java
代码如下
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "10");
capabilities.setCapability("appPackage", "com.tencent.mm");
capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");
capabilities.setCapability("automationName", "appium");
capabilities.setCapability("deviceName", "0000020df6b06a4e");
capabilities.setCapability("fastReset", false);
capabilities.setCapability("fullReset", false);
capabilities.setCapability("noReset", true);//启动app时不要清除app里的原有的数据
capabilities.setCapability("recreateChromeDriverSessions", true);//支持X5内核应用自动化配置
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
String chromeDriverPath = "/Users/wbc/IdeaProjects/pagan-rpa/driver/86/chromedriver";
File chromedriver = new File(chromeDriverPath);
log.info(chromedriver.getAbsolutePath());
capabilities.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, chromedriver
.getAbsolutePath());
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
capabilities.setBrowserName("");//初始化会默认将chrome浏览器打开,需要将Browser置为空
capabilities.setCapability("unicodeKeyboard", true);//使用unicode输入法
capabilities.setCapability("resetKeyboard", true);//重置输入法到初始状态
capabilities.setCapability("sessionOverride", true);// 每次启动时覆盖session,否则第二次后运行会报错不能新建session
capabilities.setBrowserName("");
capabilities.setCapability("newCommandTimeout", "6000");
//第三步:设置adb proxy
//通过自己的adb代理修复chromedriver的bug并解决@xweb_devtools_remote的问题
capabilities.setCapability("adbPort", "5038");
//打印更多chromedriver的log方便定位问题
//capabilities.setCapability("showChromedriverLog", true);
//capabilities.setCapability("autoWebview", true);
try {
driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
} catch (MalformedURLException e) {
e.printStackTrace();
}
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElementByXPath("//*[@text='发现']").click();
driver.findElementByXPath("//*[@text='小程序']").click();
driver.findElementByXPath("//*[contains(@text, 'XXX')]").click();
pause(5);
Set<String> contextHandles = driver.getContextHandles();
for (String contextHandle : contextHandles) {
log.info(contextHandle);
}
pause(1);
//切换到webview的content
driver.context("WEBVIEW_com.tencent.mm:appbrand0");
Set<String> windowHandles = driver.getWindowHandles();
Map<String, String> windowHandleMap = new HashMap<>();
for (String handle : windowHandles) {
driver.switchTo().window(handle);
log.info("切换窗口到" + handle);
String pageSource = driver.getPageSource();
if (pageSource.contains("帮助")) {
driver.findElementByXPath("//*[@class='binding']/wx-view[1]").click();
pause(5);
}
}
错误信息如下
io.appium.java_client.NoSuchContextException: An unknown server-side error occurred while processing the command. Original error: An unknown server-side error occurred while processing the command. Original error: chrome not reachable
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:19:58.91Z'
System info: host: 'wbcdeMacBook-Pro.local', ip: 'fe80:0:0:0:23:ed42:9cab:48af%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.6', java.version: '1.8.0_181'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities {adbPort: 5038, appActivity: com.tencent.mm.ui.LauncherUI, appPackage: com.tencent.mm, automationName: appium, browserName: , chromedriverExecutable: /Users/wbc/IdeaProje..., databaseEnabled: false, desired: {adbPort: 5038, appActivity: com.tencent.mm.ui.LauncherUI, appPackage: com.tencent.mm, automationName: appium, browserName: , chromedriverExecutable: /Users/wbc/IdeaProje..., deviceName: 0000020df6b06a4e, fastReset: false, fullReset: false, goog:chromeOptions: {androidProcess: com.tencent.mm:appbrand0, args: [], extensions: []}, newCommandTimeout: 6000, noReset: true, platformName: android, platformVersion: 10, recreateChromeDriverSessions: true, resetKeyboard: true, sessionOverride: true, unicodeKeyboard: true}, deviceApiLevel: 29, deviceManufacturer: vivo, deviceModel: V1938CT, deviceName: 0000020df6b06a4e, deviceScreenDensity: 480, deviceScreenSize: 1080x2400, deviceUDID: 0000020df6b06a4e, fastReset: false, fullReset: false, goog:chromeOptions: {androidProcess: com.tencent.mm:appbrand0, args: [], extensions: []}, javascriptEnabled: true, locationContextEnabled: false, networkConnectionEnabled: true, newCommandTimeout: 6000, noReset: true, pixelRatio: 3, platform: LINUX, platformName: Android, platformVersion: 10, recreateChromeDriverSessions: true, resetKeyboard: true, sessionOverride: true, statBarHeight: 108, takesScreenshot: true, unicodeKeyboard: true, viewportRect: {height: 2202, left: 0, top: 108, width: 1080}, warnings: {}, webStorageEnabled: false}
Session ID: 407b01c5-5c88-44f7-90eb-57f862037703
at io.appium.java_client.AppiumDriver.context(AppiumDriver.java:201)
at test.WeixinDemo.switchContext(WeixinDemo.java:104)
at test.WeixinDemo.testAppium(WeixinDemo.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: An unknown server-side error occurred while processing the command. Original error: chrome not reachable
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:19:58.91Z'
System info: host: 'wbcdeMacBook-Pro.local', ip: 'fe80:0:0:0:23:ed42:9cab:48af%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.6', java.version: '1.8.0_181'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities {adbPort: 5038, appActivity: com.tencent.mm.ui.LauncherUI, appPackage: com.tencent.mm, automationName: appium, browserName: , chromedriverExecutable: /Users/wbc/IdeaProje..., databaseEnabled: false, desired: {adbPort: 5038, appActivity: com.tencent.mm.ui.LauncherUI, appPackage: com.tencent.mm, automationName: appium, browserName: , chromedriverExecutable: /Users/wbc/IdeaProje..., deviceName: 0000020df6b06a4e, fastReset: false, fullReset: false, goog:chromeOptions: {androidProcess: com.tencent.mm:appbrand0, args: [], extensions: []}, newCommandTimeout: 6000, noReset: true, platformName: android, platformVersion: 10, recreateChromeDriverSessions: true, resetKeyboard: true, sessionOverride: true, unicodeKeyboard: true}, deviceApiLevel: 29, deviceManufacturer: vivo, deviceModel: V1938CT, deviceName: 0000020df6b06a4e, deviceScreenDensity: 480, deviceScreenSize: 1080x2400, deviceUDID: 0000020df6b06a4e, fastReset: false, fullReset: false, goog:chromeOptions: {androidProcess: com.tencent.mm:appbrand0, args: [], extensions: []}, javascriptEnabled: true, locationContextEnabled: false, networkConnectionEnabled: true, newCommandTimeout: 6000, noReset: true, pixelRatio: 3, platform: LINUX, platformName: Android, platformVersion: 10, recreateChromeDriverSessions: true, resetKeyboard: true, sessionOverride: true, statBarHeight: 108, takesScreenshot: true, unicodeKeyboard: true, viewportRect: {height: 2202, left: 0, top: 108, width: 1080}, warnings: {}, webStorageEnabled: false}
Session ID: 407b01c5-5c88-44f7-90eb-57f862037703
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:231)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:548)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at io.appium.java_client.AppiumDriver.context(AppiumDriver.java:198)
... 26 more
appium日志如下
[HTTP] --> POST /wd/hub/session/407b01c5-5c88-44f7-90eb-57f862037703/context
[HTTP] {"name":"WEBVIEW_com.tencent.mm:appbrand0"}
[W3C (407b01c5)] Calling AppiumDriver.setContext() with args: ["WEBVIEW_com.tencent.mm:appbrand0","407b01c5-5c88-44f7-90eb-57f862037703"]
[AndroidDriver] Getting a list of available webviews
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e shell cat /proc/net/unix'
[AndroidDriver] Parsed 2 active devtools sockets: ["@xweb_devtools_remote_8348","@xweb_devtools_remote_9589"]
[AndroidDriver] Collecting CDP data of 2 webviews
[AndroidDriver] Forwarding remote port xweb_devtools_remote_8348 to a local port in range 10900..11000
[AndroidDriver] You could use the 'webviewDevtoolsPort' capability to customize the starting port number
[AndroidDriver] Forwarding remote port xweb_devtools_remote_9589 to a local port in range 10900..11000
[AndroidDriver] You could use the 'webviewDevtoolsPort' capability to customize the starting port number
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e forward tcp:10900 localabstract:xweb_devtools_remote_8348'
[ADB] Removing forwarded port socket connection: 10900
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e forward --remove tcp:10900'
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e forward tcp:10900 localabstract:xweb_devtools_remote_9589'
[ADB] Removing forwarded port socket connection: 10900
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e forward --remove tcp:10900'
[AndroidDriver] CDP data collection completed
[AndroidDriver] WEBVIEW_8348 mapped to pid 8348
[AndroidDriver] Getting process name for webview 'WEBVIEW_8348'
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e shell ps -A'
[AndroidDriver] Got process name: 'com.tencent.mm:appbrand0'
[AndroidDriver] WEBVIEW_9589 mapped to pid 9589
[AndroidDriver] Getting process name for webview 'WEBVIEW_9589'
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e shell ps -A'
[AndroidDriver] Got process name: 'com.tencent.mm:appbrand2'
[AndroidDriver] Found 2 webviews: ["WEBVIEW_com.tencent.mm:appbrand0","WEBVIEW_com.tencent.mm:appbrand2"]
[AndroidDriver] Available contexts: ["NATIVE_APP","WEBVIEW_com.tencent.mm:appbrand0","WEBVIEW_com.tencent.mm:appbrand2"]
[AndroidDriver] Connecting to chrome-backed webview context 'WEBVIEW_com.tencent.mm:appbrand0'
[AndroidDriver] A port was not given, using random free port: 8000
[AndroidDriver] Passing web view details to the Chromedriver constructor: {
[AndroidDriver] "info": {
[AndroidDriver] "Android-Package": "com.tencent.mm",
[AndroidDriver] "Browser": "Chrome/86.0.4240.99",
[AndroidDriver] "Protocol-Version": "1.3",
[AndroidDriver] "User-Agent": "Mozilla/5.0 (Linux; Android 10; V1938CT Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/3209 MMWEBSDK/20220204 Mobile Safari/537.36",
[AndroidDriver] "V8-Version": "8.6.395.13",
[AndroidDriver] "WebKit-Version": "537.36 (@002668237e13d38aabd6d11c2d216dd22b736ff2)",
[AndroidDriver] "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/browser"
[AndroidDriver] },
[AndroidDriver] "process": {
[AndroidDriver] "name": "com.tencent.mm:appbrand0",
[AndroidDriver] "id": "8348"
[AndroidDriver] }
[AndroidDriver] }
[AndroidDriver] Merging 'goog:chromeOptions' into 'chromeOptions'. This may cause unexpected behavior
[AndroidDriver] Precalculated Chromedriver capabilities: {
[AndroidDriver] "androidPackage": "com.tencent.mm",
[AndroidDriver] "androidUseRunningApp": true,
[AndroidDriver] "androidProcess": "com.tencent.mm:appbrand0",
[AndroidDriver] "androidDeviceSerial": "0000020df6b06a4e"
[AndroidDriver] }
[AndroidDriver] The following Chromedriver capabilities cannot be overridden by the provided chromeOptions:
[AndroidDriver] androidProcess ("com.tencent.mm:appbrand0")
[AndroidDriver] Before starting chromedriver, androidPackage is 'com.tencent.mm'
[Chromedriver] Changed state to 'starting'
[Chromedriver] Set chromedriver binary as: /Users/wbc/IdeaProjects/pagan-rpa/driver/86/chromedriver
[Chromedriver] Killing any old chromedrivers, running: pkill -15 -f "/Users/wbc/IdeaProjects/pagan-rpa/driver/86/chromedriver.*--port=8000"
[Chromedriver] No old chromedrivers seem to exist
[Chromedriver] Cleaning this device's adb forwarded port socket connections: 0000020df6b06a4e
[ADB] List forwarding ports
[ADB] Running '/Users/wbc/Library/Android/sdk/platform-tools/adb -P 5038 -s 0000020df6b06a4e forward --list'
[Chromedriver] Spawning chromedriver with: /Users/wbc/IdeaProjects/pagan-rpa/driver/86/chromedriver --url-base=wd/hub --port=8000 --adb-port=5038 --verbose
[Chromedriver] Chromedriver version: '86.0.4240.22'
[WD Proxy] Matched '/status' to command name 'getStatus'
[WD Proxy] Proxying [GET /status] to [GET http://127.0.0.1:8000/wd/hub/status] with no body
[WD Proxy] connect ECONNREFUSED 127.0.0.1:8000
[WD Proxy] Matched '/status' to command name 'getStatus'
[WD Proxy] Proxying [GET /status] to [GET http://127.0.0.1:8000/wd/hub/status] with no body
[WD Proxy] Got response with status 200: {"value":{"build":{"version":"86.0.4240.22 (398b0743353ff36fb1b82468f63a3a93b4e2e89e-refs/branch-heads/4240@{#378})"},"message":"ChromeDriver ready for new sessions.","os":{"arch":"x86_64","name":"Mac OS X","version":"10.13.6"},"ready":true}}
[Chromedriver] Starting W3C Chromedriver session with capabilities: {
[Chromedriver] "capabilities": {
[Chromedriver] "alwaysMatch": {
[Chromedriver] "goog:chromeOptions": {
[Chromedriver] "androidPackage": "com.tencent.mm",
[Chromedriver] "androidUseRunningApp": true,
[Chromedriver] "androidProcess": "com.tencent.mm:appbrand0",
[Chromedriver] "androidDeviceSerial": "0000020df6b06a4e",
[Chromedriver] "args": [],
[Chromedriver] "extensions": []
[Chromedriver] },
[Chromedriver] "goog:loggingPrefs": {
[Chromedriver] "browser": "ALL"
[Chromedriver] }
[Chromedriver] }
[Chromedriver] }
[Chromedriver] }
[WD Proxy] Matched '/session' to command name 'createSession'
[WD Proxy] Proxying [POST /session] to [POST http://127.0.0.1:8000/wd/hub/session] with body: {"capabilities":{"alwaysMatch":{"goog:chromeOptions":{"androidPackage":"com.tencent.mm","androidUseRunningApp":true,"androidProcess":"com.tencent.mm:appbrand0","androidDeviceSerial":"0000020df6b06a4e","args":[],"extensions":[]},"goog:loggingPrefs":{"browser":"ALL"}}}}
[WD Proxy] Got response with status 500: {"value":{"error":"chrome not reachable","message":"chrome not reachable","stacktrace":"0 chromedriver 0x0000000104fc0c29 chromedriver + 2464809\n1 chromedriver 0x00000001055fb6f3 chromedriver + 8996595\n2 chromedriver 0x0000000104e05bc6 chromedriver + 650182\n3 chromedriver 0x0000000104df59df chromedriver + 584159\n4 chromedriver 0x0000000104d7f9a9 chromedriver + 100777\n5 chromedriver 0x0000000104d79aa0 chromedriver + 76448\n6 chromedriver 0x0000000104dab326 chromedriver + 279334\n7 chromedriver 0x0000000104da83f3 chromedriver + 267251\n8 chromedriver 0x0000000104d82230 chromedriver + 111152\n9 chromedriver 0x0000000104d831a7 chromedriver + 115111\n10 chromedriver 0x0000000104f93830 chromedriver + 2279472\n11 chromedriver ...
[W3C] Matched W3C error code 'chrome not reachable' to UnknownError
[Chromedriver] UnknownError: An unknown server-side error occurred while processing the command. Original error: chrome not reachable
[Chromedriver] at errorFromW3CJsonCode (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/protocol/errors.js:785:23)
[Chromedriver] at ProxyRequestError.getActualError (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/protocol/errors.js:663:14)
[Chromedriver] at JWProxy.command (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/jsonwp-proxy/proxy.js:272:19)
[Chromedriver] at processTicksAndRejections (internal/process/task_queues.js:85:5)
[Chromedriver] Chromedriver exited unexpectedly with code null, signal SIGTERM
[Chromedriver] Changed state to 'stopped'
[Chromedriver] An unknown server-side error occurred while processing the command. Original error: chrome not reachable
[W3C (407b01c5)] Encountered internal error running command: Error: An unknown server-side error occurred while processing the command. Original error: chrome not reachable
[W3C (407b01c5)] at Object.errorAndThrow (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-support/lib/logging.js:94:35)
[W3C (407b01c5)] at Chromedriver.start (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-chromedriver/lib/chromedriver.js:541:11)
[W3C (407b01c5)] at AndroidUiautomator2Driver.setupNewChromedriver (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/lib/commands/context.js:472:3)
[W3C (407b01c5)] at AndroidUiautomator2Driver.startChromedriverProxy (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/lib/commands/context.js:221:10)
[W3C (407b01c5)] at AndroidUiautomator2Driver.switchContext (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/lib/commands/context.js:128:5)
[W3C (407b01c5)] at AndroidUiautomator2Driver.setContext (/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-android-driver/lib/commands/context.js:54:3)
[HTTP] <-- POST /wd/hub/session/407b01c5-5c88-44f7-90eb-57f862037703/context 500 61426 ms - 793