Exemple #1
0
 def drag(self,
          x1,
          y1,
          x2,
          y2,
          count=5,
          wait_time=40,
          send_down_event=True,
          send_up_event=True):
     '''滑动
     :param x1: 起始横坐标
     :type x1:  int
     :param y1: 起始纵坐标
     :type y1:  int
     :param x2: 终点横坐标
     :type x2:  int
     :param y2: 终点纵坐标
     :type y2:  int
     :param count: 步数
     :type count: int
     :param wait_time: 滑动过程中每步之间的间隔时间,ms
     :type wait_time: int
     :param send_down_event: 是否发送按下消息
     :type send_down_event: boolean
     :param send_up_event: 是否发送弹起消息
     :type send_up_event: boolean 
     '''
     if y1 != y2 and abs(y1 - y2) < 60:  # 此时滑动距离会很短
         # 保证最短滑动距离为40,在索尼ce0682上发现小于40时会变成点击 三星9300上发现有时60像素以下滑动不起来
         m = (y1 + y2) // 2
         if y1 - y2 > 0:
             d = 30
         else:
             d = -30
         y1 = m + d  # TODO:坐标合法性判断
         y2 = m - d
     for _ in range(3):
         try:
             result = self.send_command(EnumCommand.CmdDrag,
                                        X1=x1,
                                        Y1=y1,
                                        X2=x2,
                                        Y2=y2,
                                        StepCount=count,
                                        SleepTime=wait_time,
                                        SendDownEvent=send_down_event,
                                        SendUpEvent=send_up_event)
         except AndroidSpyError as e:
             if str(e).find('java.lang.SecurityException') >= 0:
                 logger.info(
                     'java.lang.SecurityException,current activity:%s' %
                     self._device_driver.get_current_activity())  # 检测是否有弹窗
                 # 有时操作过快会出现该问题
                 time.sleep(0.1)
             else:
                 raise e
         else:
             return True
     logger.error('drag (%s, %s, %s, %s) failed' % (x1, y1, x2, y2))
     return False
Exemple #2
0
 def _handle_system_crash_window(self):
     '''处理系统Crash窗口
     '''
     from systemui import CrashWindow
     crash_window = CrashWindow.findCrashWindow(self)
     if not crash_window: return False
     logger.error('detect crash window')
     crash_window.close()
     return True
Exemple #3
0
 def _send_command(self, cmd_type, **kwds):
     '''发送命令
     '''
     result = self.client.send_command(cmd_type, **kwds)
     if result == None:
         logger.error('系统测试桩连接错误')
         self._kill_server()
         if self._client: self._client.close()
         self._client = None
         return self._send_command(cmd_type, **kwds)
         # raise SocketError('Socket连接错误')
     if 'Error' in result:
         raise RuntimeError(result['Error'])
     if not 'Result' in result:
         raise RuntimeError('%s返回结果错误:%s' % (cmd_type, result))
     return result['Result']
Exemple #4
0
 def _send_command(self, cmd_type, **kwds):
     """发送命令
     """
     result = self.client.send_command(cmd_type, **kwds)
     if result == None:
         logger.error("系统测试桩连接错误")
         self._kill_server()
         if self._client:
             self._client.close()
         self._client = None
         return self._send_command(cmd_type, **kwds)
         # raise SocketError('Socket连接错误')
     if "Error" in result:
         raise RuntimeError(result["Error"])
     if not "Result" in result:
         raise RuntimeError("%s返回结果错误:%s" % (cmd_type, result))
     return result["Result"]
Exemple #5
0
    def send_command(self, cmd_type, **kwds):
        '''send command
        '''
        packet = {}
        packet['Cmd'] = cmd_type
        packet['Seq'] = self.seq
        for key in kwds.keys():
            packet[key] = kwds[key]
        data = json.dumps(packet) + "\n"
        if six.PY2 and isinstance(data, unicode):
            data = data.encode('utf8')

        time0 = time_clock()
        self._lock.acquire()
        time1 = time_clock()
        delta = time1 - time0
        if self._enable_log and delta >= 0.05:
            logger.info('send wait %s S' % delta)
        if self._enable_log: logger.debug('send: %s' % (data[:512].strip()))

        time0 = time_clock()
        try:
            result = self.send(data)
        except Exception as e:
            # 避免因异常导致死锁
            logger.exception('send %r error: %s' % (data, e))
            result = None
        self._lock.release()  # 解锁
        if not result: return None

        time1 = time_clock()
        try:
            rsp = json.loads(result)
        except:
            logger.error('json error: %r' % (result))
            raise
        else:
            if self._enable_log:
                delta = int(1000 * (time1 - time0))
                if 'HandleTime' in rsp: delta -= rsp['HandleTime']
                logger.debug('recv: [%d]%s\n' % (delta, result[:512].strip()))
            return rsp
Exemple #6
0
    def get_login_user(self):
        '''获取当前登录用户
        '''
        result = self.run_shell_cmd('cat /data/data/%s/shared_prefs/%s_preferences.xml' % (self.package_name, self.package_name))
        try:
            dom = xml.dom.minidom.parseString(result)
        except:
            return None

        for it in dom.documentElement.getElementsByTagName('boolean'):
            if it.getAttribute('name') == 'isLogin':
                if it.getAttribute('value') != 'true': return None # 当前没有登录用户
                break
                
        for it in dom.documentElement.getElementsByTagName('string'):
            if it.getAttribute('name') == 'login_user_name':
                return it.childNodes[0].nodeValue
                
        logger.error(result)
        return None
Exemple #7
0
 def get_extra_fail_record(self):
     '''用例执行失败时,用于获取用例相关的错误记录和附件信息
     '''
     from qt4a.androiddriver.util import logger as qt4a_logger
     pic_attachments = {}
     for device in Device.device_list:
         pic_path = "%s_%s_%s.png" % (self.__class__.__name__,
                                      get_valid_file_name(
                                          device.device_id), time.time())
         try:
             device.take_screen_shot(pic_path)
             if os.path.isfile(pic_path):
                 pic_attachments['%s的截图' % device.device_id] = pic_path
             else:
                 qt4a_logger.error('pic %s not exist' % pic_path)
         except Exception as e:
             qt4a_logger.error('take_screen_shot error: %s' % e)
             qt4a_logger.error(''.join(
                 traceback.format_tb(sys.exc_info()[2])))
     return {}, pic_attachments
Exemple #8
0
 def on_crashed(self):
     '''发生Crash之后的处理
     '''
     logger.error('detect crash')
     self._app_crashed = True
     self._monitor_run = False