发现在安卓 7.0 上对权限的管理变严格了,在用 appium 写自动化 case 的时候发现,安卓 7.0 上在 APP 第一次安装后,在进行权限相关操作时会询问用户是否给予相关权限。
弹出权限窗口时可以用过基本的定位元素进行点击允许的操作,但是点击后就无法继续对 APP 进行操作了,请问有什么办法可以在允许权限后继续 app 的操作?
不想绕过请求权限这个步骤,因为这个地方也会产生相关的流程 case
修改下 appium 在安装的时候 用 grant all
“但是点击后就无法继续对 APP 进行操作了”,比如?
最好 show me the code
adb install [-lrtsdg] <file>
- push this package file to the device and install it
(-l: forward lock application)
(-r: replace existing application)
(-t: allow test packages)
(-s: install application on sdcard)
(-d: allow version code downgrade (debuggable packages only))
(-g: grant all runtime permissions)
public void plus()throws InterruptedException {
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElementById("com. :id/btnLoginSelection").click();
driver.findElementById("com. :id/btnLoginPhone").click();
driver.findElementById("com. :id/positiveButton").click();
driver.findElementById("com.android.packageinstaller:id/permission_allow_button").click();
在进行最后一条命令后,即点击屏幕中允许权限对话框之后便无法对 APP 继续进行操作了
后续操作的代码呢
目前这些没看出有什么问题
appium 我们这边的做法是把 appium 所需要安装的东西全部拿出来,自己写了个 uiautomator 脚本来点击的允许安装或者授权安装,并把 appium 所有 adb 操作都注释掉,麻烦的就是需要针对不同手机需要多做几个不同的字段判断。目前大多数手机都能安装相关的应用。
刚刚在 apk-utils.js 里面找到了
apkUtilsMethods.install = function callee$0$0(apk) {
var replace = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];
var timeout = arguments.length <= 2 || arguments[2] === undefined ? 60000 : arguments[2];
return _regeneratorRuntime.async(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
if (!replace) {
context$1$0.next = 5;
break;
}
context$1$0.next = 3;
return _regeneratorRuntime.awrap(this.adbExec(['install', '-r', apk], { timeout: timeout }));
case 3:
context$1$0.next = 15;
break;
case 5:
context$1$0.prev = 5;
context$1$0.next = 8;
return _regeneratorRuntime.awrap(this.adbExec(['install', apk], { timeout: timeout }));
case 8:
context$1$0.next = 15;
break;
case 10:
context$1$0.prev = 10;
context$1$0.t0 = context$1$0['catch'](5);
if (!(context$1$0.t0.message.indexOf('INSTALL_FAILED_ALREADY_EXISTS') === -1)) {
context$1$0.next = 14;
break;
}
throw context$1$0.t0;
case 14:
_loggerJs2['default'].debug('Application \'' + apk + '\' already installed. Continuing.');
case 15:
case 'end':
return context$1$0.stop();
}
}, null, this, [[5, 10]]);
};
driver.findElementById("com. :id/id_reg_phone").sendKeys("1340000000");
接下来是这个操作
依然看不出问题来,尝试升级 appium 到最新,然后用 uiautomator2
appium 用的客户端 版本是 1.6.5
uiautomator 就用 android sdk 自带的工具 uiautomator2 是?
同样的元素定位与操作 之前 6.0 都 OK 的 到了 7.0 出现权限确认,允许权限后就无法继续操作了
capabilities.setCapability("automationName","uiautomator2")
用了 uiautomator2 后 在允许权限后,可以继续操作 APP 了 但是又有出现新的问题
APP 在进行操作后 会突然闪退 试过两台 7.0 设备 均在不同操作点出现闪退在 appium log 上是这样表现的
抓 log,报 bug 给 appium