Appium appium +python 怎么处理手机弹窗的权限获取 (有的手机有,有的手机没有需要一套代码去兼容)

无痕 · 2016年05月12日 · 最后由 Yang 回复于 2018年11月16日 · 4715 次阅读

appium +python 做 app 自动化的时候 在对应不同的手机可能弹窗的权限获取弹窗口该怎么处理,因为有的手机会弹 有的手机不会弹,该怎么去判断处理(就是一套代码能在大部分手机上跑起来,不会因为弹窗的问题而报错)

共收到 22 条回复 时间 点赞

强行判断啊 一般也就启动的时候,会弹出吧。 检查呗,把权限的 ui 检查放到最后。

怎么写?

我自己之前用的方式是在可能出现的地方使用 if 要不 try 也是可以的

在 try 里面直接写点击弹窗的类,找不到的话就不管。不过,根据不同手机弹出的对话框不一致需要做大量的兼容工作,我现在公司 android 手机 6.0 系统这种弹窗超多,光是适配这些手机的代码就一两千行。

LZ 说的是哪个端?IOS 是有自带的方法:

desired_capabilities={
                'app': app,
                'platformName': 'iOS',
                'deviceName': 'iPhone 6',
                'autoAcceptAlerts': 'true',
            })

'autoAcceptAlerts': 'true',这句话就是自动接收系统权限的方法。如果是安卓,就等弹出之后捕获元素丢到 try 里面去处理吧

@wyb199026 我设置了'autoAcceptAlerts': 'true',但启动 app 后,没看到权限弹层被处理的过程,弹层还一直在,这是什么回事?
[Appium] Creating new XCUITestDriver session
[Appium] Capabilities:
[Appium] deviceName: 'iPhone 6'
[Appium] app-package: 'com.app'
[Appium] udid: '7d8f31325252013456b7cec687ff2a09b5c702a0'
[Appium] autoAcceptAlerts: 'true'
[Appium] automationName: 'XCUITest'
[Appium] version: '10.2'
[Appium] device: 'iOS'
[Appium] platformName: 'iOS'
[Appium] bundleId: 'com.app'
[debug] [XCUITest] XCUITestDriver version: 2.8.0
[BaseDriver] Capability 'autoAcceptAlerts' changed from string to boolean. This may cause unexpected behavior
[BaseDriver] The following capabilities were provided, but are not recognized by appium: app-package, version, device.
[XCUITest] The capabilities 'autoAcceptAlerts' and 'autoDismissAlerts' do not work for XCUITest-based tests. Please adjust your alert handling accordingly.

simon 回复

[XCUITest] The capabilities 'autoAcceptAlerts' and 'autoDismissAlerts' do not work for XCUITest-based tests. Please adjust your alert handling accordingly.

看样子可能是 Appium 版本不一致,导致使用的 IOS 测试工具不一致,你是最新的版本吗?我的 Appium 版本是 1.4 的,我测试是 OK 的。

simon 回复

1.6 之后这个参数就不好用了

@wyb199026 我的是 1.6.3,我也看到文章说到,旧版本是可以使用 autoDismissAlerts 的

@u1449648501 1.6 之后这个参数不好用了,那有什么好办法?

11楼 已删除

新版 appium
time.sleep(5)
context.driver.switch_to.alert.accept()

HengF丶 回复

self.driver.switch_to.alert.accept() 可以用 ,赞

先使用 driver.switch_to_alert() 跳转到弹窗,然后定位弹窗上面的元素进行点击操作。

Sutune 回复

这个可以处理系统弹框吗,比如允许获取 ** 权限

JAVA Appium 中,我试了下面两种方式,方式一报错未生效,方法二生效可用。供各位参考

方式一
selectDriver.driver.switchTo().alert().accept();
方式二
// 自动处理应用首次启动系统授权
UIBean systemPopUpBox = new UIBean(by.NAME, "始终允许", "系统授权弹框");
while (appiumUtil.isElementExist(systemPopUpBox)) {
    try {
        appiumUtil.clickBean(systemPopUpBox);
    } catch (Exception e) {
        logger.error("自动点击应用app授权出错!" + e.getMessage());
    }
}

用 aapt d permissions xxx.apk, 来查询包名和权限。
然后用 python 或者 java 执行:adb shell pm grant 包名 权限, 来赋予权限。

有具体操作吗?

assless 回复

采纳了你等答案,解决了问题。另外我在 android 环境下,appium 启动的 app,权限被强制置空,用 adb shell pm grant 命令可避开界面操作赋予权限。

zhang 回复

权限这个是怎么看的,查出来一堆权限不知道看哪个,求指教?

assless 回复

你好,尝试使用了你说的 adb shell pm grant 命令,但是授权 Android 应用却不能生效。 实际 cmd 中也没有报错。 我试了 am 去启动应用却能成功,证明环境啥的都应该是没问题的。 就是不知道为什么不能授权成功····· 求指教···

KD 回复

你好,UIBean 这个类,是不是只在 Struts 里面才有的呀??我用的是 Appium+Java+Android,是不是没法用你说的第二个方法了?求解释

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册