UiAutomator 在 UiAutomator 测试脚本无法启动指定 app

杨! · 2017年02月20日 · 最后由 迪文 回复于 2017年06月09日 · 3447 次阅读

在 Uiautomator 测试脚本中,添加启动指定 app 的脚本命令 Runtime.getRuntime().exec("am start xx.xxx.xxxx/.xxx.Activity");
如图

选中 testclass,右键运行后,代码没报错,但对应的 app 也没有启动成功,请问这是为什么呢?
说明:手机是小米,android6.0 系统,没有 root 过的,对应的启动命令我在终端中执行运行是能成功的。

共收到 9 条回复 时间 点赞

直接调用 API 去起不行么?非要用 shell
Context context = InstrumentationRegistry.getInstrumentation().getContext();
Intent intent = context.getPackageManager().getLaunchIntentForPackage(appPackageName);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);

楼上正解!

—— 来自 TesterHome 官方 安卓客户端

#1 楼 @264768502 你好,用这个方法是不是 app 一定要有在后台运行?我在后台杀死进程后,执行脚本,没报错,但 app 也没启动起来

理论上,从系统上来说不需要,起 activity 不需要目标 app 已启动,除非目标 APP 自己设了限制
如果可以的话,看看 logcat,看看启动后 logcat 是否有显示目标 app 的相关打印来确定问题
另外,adb shell am start XXX 如果也启动不了,可以看看打印是什么

#4 楼 @264768502 如果不启动 app 执行,后台输出这个 log
No JSBridge.
java.lang.ClassNotFoundException: android.support.test.espresso.web.bridge.JavaScriptBridge
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:324)
at java.lang.Class.forName(Class.java:285)
at android.support.test.runner.MonitoringInstrumentation.tryLoadingJsBridge(MonitoringInstrumentation.java:612)
at android.support.test.runner.MonitoringInstrumentation.access$100(MonitoringInstrumentation.java:88)
at android.support.test.runner.MonitoringInstrumentation$3.run(MonitoringInstrumentation.java:223)
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1904)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5441)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.test.espresso.web.bridge.JavaScriptBridge" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/miu.qfdapptest.test-2/base.apk", zip file "/data/app/miu.qfdapptest-1/base.apk"],nativeLibraryDirectories=[/data/app/miu.qfdapptest.test-2/lib/arm64, /data/app/miu.qfdapptest-1/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at java.lang.Class.classForName(Native Method) 
at java.lang.Class.forName(Class.java:324) 
at java.lang.Class.forName(Class.java:285) 
at android.support.test.runner.MonitoringInstrumentation.tryLoadingJsBridge(MonitoringInstrumentation.java:612) 
at android.support.test.runner.MonitoringInstrumentation.access$100(MonitoringInstrumentation.java:88) 
at android.support.test.runner.MonitoringInstrumentation$3.run(MonitoringInstrumentation.java:223) 
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1904) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5441) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 
Suppressed: java.lang.ClassNotFoundException: android.support.test.espresso.web.bridge.JavaScriptBridge
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 15 more

#4 楼 @264768502 好像还跟机器有关,我用小米就一定要先启动 app 后才能调出来,换一台 htc 就不用

至少标准的安卓系统是不会阻止直接启动某个 Activity 的
但是国内这些魔改版就很难说了,就像你遇到的那样.

#7 楼 @264768502 估计小米、魅族这些就会有

我也遇到了这个问题,但我却不知道 我怎么神奇的解决了。 貌似只是修改了包引用

compile 'com.android.support:appcompat-v7:23.1.1'
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册