用法
- 在option里加autoAcceptAlerts: true后,就会自动关闭系统弹窗
const iosStuOpts = {
platformName: 'iOS',
autoAcceptAlerts: true,
reuse: 2,
udid: 'xxxxxxx',
bundleId: 'xxxxxxx',
};
const androidOpts = {
platformName: 'Android',
autoAcceptAlerts: true,
reuse: 2,
isWaitActivity: true,
package: 'xxxxxx',
activity: 'xxxxxx'
};
问题一
- 发现有时候关闭系统弹窗的左边选项,有时候关闭系统弹窗的右边选项
- 找到源码:
- 可以看到是发了一个请求 给xctestwd 然后由xctestwd处理的,再去打开xctestwd
- 搜索刚才看到的那个请求的url 然后一步一步可以走到真正处理弹窗的地方
- 发现如果是alert类型,就点第二个(比如允许权限之类的)
- 否则第一个(dialog、view之类的)
问题二
- 不是所有弹窗都会被点掉
- 遇到一个安卓“我知道了”弹窗不能被点掉,这类弹窗则需要找到元素手动点掉
问题三
-
将 iOS 的 aotuoAcceptAlerts 设置成 false,iOS首次安装应用后启动app会请求系统权限弹窗“不允许”“好”之类的元素用elementByName(‘好’)找不到的问题
-
用appium 试了一下,driver.findElementByAccessibilityId(“好”) 可以点击"好",用tap试了一下,那为什么macaca找不到系统弹窗上的“好”呢?
-
最终发现为什么 autoAcceptAlerts 可以找到系统弹窗上的“好”呢?因为它自己创建了一个单独的application,叫 “com.apple.springboard” 应该就是那个弹窗,而 elementByxxxx 找的时候找的是被测试的 application 所以找不到系统弹窗“好”
问题四
- 对于不想设置 autoAcceptAlerts: true 又想将系统弹窗关闭的 iOS设备怎么办?
- 使用acceptAlert(),并加上try catch,如果没有弹窗时程序也不中断
- 如果弹窗个数多,可以增加一个for循环
// 关闭系统弹窗
async function closeSystemDialog(driver) {
try {
await driver.acceptAlert()
}
catch (error) {
console.log(error)
}
}