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
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
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']
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"]
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
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
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
def on_crashed(self): '''发生Crash之后的处理 ''' logger.error('detect crash') self._app_crashed = True self._monitor_run = False