def app_info(self, pkg_name): """ Get app info Args: pkg_name (str): package name Return example: { "mainActivity": "com.github.uiautomator.MainActivity", "label": "ATX", "versionName": "1.1.7", "versionCode": 1001007, "size":1760809 } Raises: UiaError """ url = self.path2url('/packages/{0}/info'.format(pkg_name)) resp = self._reqsess.get(url) resp.raise_for_status() resp = resp.json() if not resp.get('success'): raise UiaError(resp.get('description', 'unknown')) return resp.get('data')
def jsonrpc_call(self, jsonrpc_url, method, params=[], http_timeout=60): """ jsonrpc2 call Refs: - http://www.jsonrpc.org/specification """ request_start = time.time() data = { "jsonrpc": "2.0", "id": self._jsonrpc_id(method), "method": method, "params": params, } data = json.dumps(data).encode('utf-8') res = self._reqsess.post( jsonrpc_url, # +"?m="+method, #?method is for debug headers={"Content-Type": "application/json"}, timeout=http_timeout, data=data) if DEBUG: print("Shell$ curl -X POST -d '{}' {}".format(data, jsonrpc_url)) print("Output> " + res.text) if res.status_code == 502: raise GatewayError( res, "gateway error, time used %.1fs" % (time.time() - request_start)) if res.status_code == 410: # http status gone: session broken raise SessionBrokenError("app quit or crash", jsonrpc_url, res.text) if res.status_code != 200: raise UiaError(jsonrpc_url, data, res.status_code, res.text, "HTTP Return code is not 200", res.text) jsondata = res.json() error = jsondata.get('error') if not error: return jsondata.get('result') # error happends err = JsonRpcError(error, method) if isinstance( err.data, six.string_types) and 'UiAutomation not connected' in err.data: err.__class__ = UiAutomationNotConnectedError elif err.message: if 'uiautomator.UiObjectNotFoundException' in err.message: err.__class__ = UiObjectNotFoundError elif 'android.support.test.uiautomator.StaleObjectException' in err.message: # StaleObjectException # https://developer.android.com/reference/android/support/test/uiautomator/StaleObjectException.html # A StaleObjectException exception is thrown when a UiObject2 is used after the underlying View has been destroyed. # In this case, it is necessary to call findObject(BySelector) to obtain a new UiObject2 instance. err.__class__ = StaleObjectExceptionError elif 'java.lang.NullObjectException' in err.message: err.__class__ = NullObjectExceptionError elif 'java.lang.NullPointerException' == err.message: err.__class__ = NullPointerExceptionError raise err