在做APP自动化的时候经常会遇到启动app后获取一些权限的弹窗了。
方案1:我们在启动先手动打开APP允许获取权限,然后在desired_caps
中加上noReset
等于True
,这样启动APP就不会出现系统自带的权限弹窗了。
desired_caps = {
'platformName': PLATFORM,
'deviceName': deviceName,
'appPackage': APP_PACKAGE,
'appActivity': APP_ACTIVITY,
'noReset': True,
'newCommandTimeout': 800,
}
方案二 :封装一个独立的函数,判断系统权限弹窗,再启动后调用一下。[参考]@(https://my.oschina.net/u/873595/blog/792220)
def resolve_windows(self):
"""权限处理弹窗"""
try:
els = self.driver.find_elements_by_class_name('android.widget.Button')
while True:
for el in els:
if el.text == u'允许':
self.driver.find_element_by_android_uiautomator('new UiSelector().text("允许")').click()
elif el.text == u'始终允许':
self.driver.find_element_by_android_uiautomator('new UiSelector().text("始终允许")').click()
elif el.text == u'确定':
self.driver.find_element_by_android_uiautomator('new UiSelector().text("确定")').click()
except:
print('未检测到弹窗')
参考代码:
import random
import time
from selenium.webdriver.support import expected_conditions as EC
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import os
deviceName = os.popen('adb shell getprop ro.product.model').read()
platformVersion = os.popen('adb shell getprop ro.build.version.release').read()
device = os.popen('adb shell getprop ro.product.name ').read()
# Appium基本参数
PLATFORM = 'Android'
DRIVER_SERVER = 'http://localhost:4723/wd/hub'
class Automation():
def __init__(self, APP_PACKAGE, APP_ACTIVITY):
self.desired_caps = {
'platformName': PLATFORM,
'deviceName': deviceName,
'appPackage': APP_PACKAGE,
'appActivity': APP_ACTIVITY,
'noReset': False,
'newCommandTimeout': 800,
}
print('打开appium服务器')
self.driver = webdriver.Remote(DRIVER_SERVER, self.desired_caps)
self.wait = WebDriverWait(self.driver, 10)
self.size = self.driver.get_window_size()
def resolve_windows(self):
"""权限处理弹窗"""
try:
els = self.driver.find_elements_by_class_name('android.widget.Button')
while True:
for el in els:
if el.text == u'允许':
self.driver.find_element_by_android_uiautomator('new UiSelector().text("允许")').click()
elif el.text == u'始终允许':
self.driver.find_element_by_android_uiautomator('new UiSelector().text("始终允许")').click()
elif el.text == u'确定':
self.driver.find_element_by_android_uiautomator('new UiSelector().text("确定")').click()
except:
print('未检测到弹窗')
AUTO = Automation('com.songheng.eastnews', 'com.oa.eastfirst.activity.WelcomeActivity')
AUTO.resolve_windows() # 调用处理弹窗函数