日志信息
2021-08-02 20:10:48.447 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][AndroidDriver] Screen already unlocked, doing nothing
2021-08-02 20:10:48.448 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][UiAutomator2] Starting 'com.seewo.screensharepro.server/com.seewo.easiair.server.activity.MainActivity and waiting for 'com.seewo.screensharepro.server/com.seewo.easiair.server.activity.MainActivity'
2021-08-02 20:10:48.449 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [ADB] Running '/Users/sai/android-sdk/android-sdk-macosx/platform-tools/adb -P 5037 -s 172.20.214.201\:1379 shell am start -W -n com.seewo.screensharepro.server/com.seewo.easiair.server.activity.MainActivity -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000'
2021-08-02 20:11:08.467 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [UiAutomator2] Deleting UiAutomator2 session
2021-08-02 20:11:08.467 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [UiAutomator2] Deleting UiAutomator2 server session
2021-08-02 20:11:08.468 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [WD Proxy] Matched '/' to command name 'deleteSession'
2021-08-02 20:11:08.468 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [WD Proxy] Proxying [DELETE /] to [DELETE http://127.0.0.1:8200/wd/hub/session/06921094-d944-4d44-a5c7-c298b3479009] with no body
2021-08-02 20:11:08.512 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [WD Proxy] Got response with status 200: {"sessionId":"06921094-d944-4d44-a5c7-c298b3479009","value":null}
2021-08-02 20:11:08.512 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [ADB] Running '/Users/sai/android-sdk/android-sdk-macosx/platform-tools/adb -P 5037 -s 172.20.214.201\:1379 shell am force-stop com.seewo.screensharepro.server'
2021-08-02 20:11:08.605 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [Logcat] Stopping logcat capture
2021-08-02 20:11:08.609 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [ADB] Removing forwarded port socket connection: 8200
2021-08-02 20:11:08.609 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [ADB] Running '/Users/sai/android-sdk/android-sdk-macosx/platform-tools/adb -P 5037 -s 172.20.214.201\:1379 forward --remove tcp\:8200'
2021-08-02 20:11:08.619 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][UiAutomator2] Restoring hidden api policy to the device default configuration
2021-08-02 20:11:08.620 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [ADB] Running '/Users/sai/android-sdk/android-sdk-macosx/platform-tools/adb -P 5037 -s 172.20.214.201\:1379 shell 'settings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy''
2021-08-02 20:11:08.772 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [BaseDriver] Event 'newSessionStarted' logged at 1627906268771 (20:11:08 GMT+0800 (China Standard Time))
2021-08-02 20:11:08.793 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [W3C] Encountered internal error running command: Error: Cannot start the 'com.seewo.screensharepro.server' application. Visit https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md for troubleshooting. Original error: Error executing adbExec. Original error: 'Command '/Users/sai/android-sdk/android-sdk-macosx/platform-tools/adb -P 5037 -s 172.20.214.201\:1379 shell am start -W -n com.seewo.screensharepro.server/com.seewo.easiair.server.activity.MainActivity -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000' timed out after 20000ms'. Try to increase the 20000ms adb execution timeout represented by 'adbExecTimeout' capability
2021-08-02 20:11:08.793 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [W3C] at ADB.startApp (/usr/local/lib/node_modules/appium/node_modules/appium-adb/lib/tools/apk-utils.js:177:11)
2021-08-02 20:11:08.802 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][debug] [W3C] Destroying socket connection
2021-08-02 20:11:08.802 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][HTTP] <-- POST /wd/hub/session 500 28272 ms - 1813
2021-08-02 20:11:08.803 INFO 64725 --- [c Stream Pumper] com.daxiang.utils.Terminal : [Terminal][HTTP]
从上述的日志可以看出来,提示的信息是adbExecTimeout 执行超时了,并且提示是增加超时的时间,但是这个配置明显是不合适的,还是得真正分析出来超时的原因到底是什么。而且还有一个重要的信息就是,实际上应用是已经完成启动了,只是看日志的描述是 am start 没有返回值导致的。
分析
我们可以看到真正超时的原因是因为执行这条命令然后超时了。
adb -P 5037 -s 172.20.214.201\:1379 shell am start -W -n com.seewo.screensharepro.server/com.seewo.easiair.server.activity.MainActivity -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000
那我们就先手动去执行下看看是否有啥表现的现象吧。
结果发现实际也发生了一样的情况。也就是am start 以后迟迟没有返回的结果
找相应的开发了解到,当对应的activity完成启动以后,会启动service后自己就完成了退出的操作了,service会会进行绘制window的窗口来展示画面,而不是通过我们一直了解的activity进行绘制画面。
以上的逻辑就会导致一个问题,就是am start 以后就会去等待对应的activity是否真正的完成启动的动作,但是实际上要完成启动的activity已经退出了,这就导致了实际上应用已经起来了,但是确没有等到对应的activity。
解决
那针对这个有解决的方法吗? 答案肯定是有的。
我们找到一篇官方的wiki 说明的很详细了
Appium 需要知道包和活动名称才能正确初始化被测应用程序。此信息应在驱动程序功能中提供,包括以下键: appActivity: 主要应用活动的名称 appPackage: 应用程序包的标识符 appWaitActivity:要等待的应用程序活动的名称/哪个开始第一个 appWaitPackage: 要等待的应用程序包的 id/哪个开始第一个 appWaitDuration: 等待appWaitActivity焦点的最大持续时间,以毫秒为单位(默认为 20000) appWaitForLaunch: 是否等待活动管理器将控制权返回给调用进程。默认情况下,驱动程序总是等到appWaitDuration过期。将此功能设置为false有效取消此等待并在am成功触发启动活动的命令后立即解除对服务器循环的阻塞。
命令“…”在 X 毫秒后超时 如果您已仔细检查活动名称是否正确,但启动仍然超时,则尝试增加appWaitDuration功能的值。通常,默认 20 秒对于大多数应用程序来说就足够了,但是,一些较大的应用程序可能需要更多时间来启动和显示第一个活动。请不要创建这样的应用程序。 也可能存在活动根本不将控制权返回给调用进程的情况,因此am start调用永远独立于 的值而阻塞appWaitDuration,从而导致超时。在这种情况下设置appWaitForLaunch到false可能有助于解决这个问题。尽管通过选择此选项,驱动程序无法确保活动已完全启动,因此由客户端代码来验证初始 UI 状态是否符合预期。
所以解决上述的问题 其实比较简单,直接在appium的capabilities中将 appWaitForLaunch 设置为false即可解决了。
|