Appium如何切换应用焦点,获取拨号器号码后返回测试应用
问题原因
报错的核心原因是activateApp方法依赖monkey命令启动目标应用的Launcher入口,触发了两个问题:
- 不同厂商定制的安卓系统中,系统拨号器的包名不一定是通用的
com.android.phone,高版本原生安卓、小米、三星等定制系统的拨号器包名多为com.google.android.dialer、com.samsung.android.dialer等 - 系统拨号器的主Activity可能没有声明
android.intent.category.LAUNCHER类别,导致monkey命令无法找到启动入口,返回退出码252
另外你的测试逻辑存在冗余:点击应用按钮已经主动拉起了系统拨号器,不需要主动调用activateApp启动拨号器,此时拨号器已经处于前台或后台运行状态。
解决方案
步骤1:确认测试设备拨号器的真实信息
拨号器处于前台时,在本地终端执行以下adb命令获取当前应用信息:
adb shell dumpsys window | grep mCurrentFocus
返回结果示例:
mCurrentFocus=Window{432a1f u0 com.google.android.dialer/com.google.android.dialer.DialtactsActivity}
其中com.google.android.dialer是拨号器真实包名,com.google.android.dialer.DialtactsActivity是主Activity名。
同时可以通过UIAutomatorViewer工具确认拨号器号码输入框的真实资源ID,避免digis不匹配的问题。
步骤2:优化测试逻辑
删除多余的activateApp启动拨号器逻辑,点击按钮后直接添加显式等待,等待拨号器元素加载即可:
// 原有点击测试应用按钮拉起拨号器的逻辑 xxxButton.click(); // 显式等待拨号器号码输入框加载,最多等待10秒 WebDriverWait wait = new WebDriverWait(androidDriver, 10); WebElement digisInput = wait.until(ExpectedConditions.visibilityOfElementLocated(MobileBy.id("你查到的真实输入框ID"))); System.out.println(digisInput.getText()); // 切回测试应用 androidDriver.activateApp("com.app.test");
步骤3:主动唤醒拨号器的替代方案
如果拨号器被系统放到后台,确实需要主动唤醒,不要使用activateApp,改用startActivity直接启动拨号器Activity即可:
// 替换为你查到的拨号器包名和Activity名 androidDriver.startActivity(new Activity("com.google.android.dialer", ".DialtactsActivity"));
内容的提问来源于stack exchange,提问作者Ido Aricha
相关产品推荐
相关产品推荐

