解决android机权限弹窗问题

前言

  • 为了解决android真机重新安装app后可能会出现的一系列令人头疼的权限弹框问题,一个是会加重我们case运行的成功率,二个如果加入全局判断的话,脚本运行时间会大大加长,作为一个写自动化脚本的人来说这个是不能忍的

看看百度上各种解决方案

  • 出现权限弹窗解决方案

    • 第一种是列举了如果在安装的时候出现弹窗解决方案,目前笔者也是使用的这个方法

      https://testerhome.com/topics/11720
    • 第二种是如果是在运行中出现弹窗解决方案(1)(基于修改ui2源码的方式,对于一些没有较强代码基础的同学来讲比较抽象)

      https://testerhome.com/topics/9308
    • 第二种是如果是在运行中出现弹窗解决方案(2)(这种方式很强大,不过好像在使用ui2作为点击对象的时候不是很通用)

      https://testerhome.com/topics/11136
    • 扒了扒官网,看到这么一段,笔者贴到caps里面执行,但是弹框还是一样,该怎么谈就怎么弹

      autoGrantPermissions    让Appium自动确定您的应用需要哪些权限,并在安装时将其授予应用。默认设置为 false   truefalse
      

楼主厂里的解决方案

  • 基于第一种权限解决方案,有一个想法,是不是可以在app里面也这样用adb的方式去点击试试,思路:

    • 采用多进程的方式

      pool.apply_async(runnerCaseApp, [devices_Pool, is_run_dict])  # 执行脚本进程
      pool.apply_async(adbMonitorPermissionsWindow, [devicess, is_run_dict])  # 点击权限弹窗进程
    • adb点击权限代码

      class Ia:
      def __init__(self, all_result_path, device):
      """
      Queue模块是用于进程间通信的模块
      :param all_result_path: 本次测试创建的文件夹
      :param device: 设备id
      """
      self.all_result_path = all_result_path
      self.device = device
      self.adb = base.BaseApk.ADB(self.device)
      self.queue = Queue(10)
      
      @U.l()
      def __uidump(self):
      """
      获取当前Activity控件树
      :return:xml在电脑内的地址存储地址
      """
      save_path = self.all_result_path + "/{0}_dump.xml".format(self.device)
      self.adb.get_focused_package_xml(save_path)
      return save_path
      
      @U.l()
      def __element(self):
      """
      同属性单个元素,返回单个坐标元组
      button_list:常见的确认,同意,按钮控件id
      """
      button0 = 'com.android.packageinstaller:id/ok_button'
      button1 = 'com.android.packageinstaller:id/btn_allow_once'
      button2 = 'com.android.packageinstaller:id/bottom_button_two'
      button3 = 'com.android.packageinstaller:id/btn_continue_install'
      button4 = 'android:id/button1'
      button5 = 'vivo:id/vivo_adb_install_ok_button'
      button6 = 'com.android.packageinstaller:id/confirm_button'
      button_list = [button0, button1, button2, button3, button4, button5, button6]
      dump_path = self.__uidump()
      self.pattern = re.compile(r"\d+")
      if not os.path.exists(dump_path):
          U.Logging.warn('Failed to get xml')
          return None
      
      tree = ET.ElementTree(file=dump_path)
      tree_iter = tree.iter(tag="node")
      for elem in tree_iter:
          if elem.attrib["resource-id"] in button_list:
              bounds = elem.attrib["bounds"]
              coord = self.pattern.findall(bounds)
              x_point = (int(coord[2]) - int(coord[0])) / 2.0 + int(coord[0])
              y_point = (int(coord[3]) - int(coord[1])) / 2.0 + int(coord[1])
              return x_point, y_point
      else:
          return None
      
      def tap(self):
      """
      点击动作
      :return:
      """
      coordinate_points = self.__element()
      if coordinate_points is not None:
          print("正在点击坐标 {0}".format(coordinate_points))
          self.adb.touch_by_element(coordinate_points)
    • 调用adb点击方法,中间加了个sleep,因为不加的时候,可能appium在注册的时候,调用的adb进程和获取弹窗的adb进程冲突导致连接服务器失败

      def adbMonitorPermissionsWindow(devicesName, is_run_dict):
          """
          监控手机弹窗权限进程
          :param is_run_dict:
          :param devicesName:
          :return:
          """
          U.Logging.info("adb PermissionsWindow multiprocessing starting")
          for devices in devicesName:
              adb = Ia(PATH("app"), devices)
              time.sleep(8)
              while True:
                  if is_run_dict.get("run_type", False):
                      U.Logging.info("case run success. stop tap")
                      break
                  time.sleep(be.TAP_TIME)
                  adb.tap()

你可能感兴趣的:(python)