折腾:
【未解决】iOS自动化操作设置出错:启动设置后找不到无线局域网
期间,遇到很多facebook-wda的相关api的调用。
然后去把通用部分的功能,整理出来,供后续使用。
优化和添加函数:
def iOSTerminateApp(self, appBundleId): """terminal iOS app Args: appBundleId (str): iOS app bundle id Returns: bool, dict/str: true, None false, str: error message Raises: """ isTerminalOk = False respInfo = None # self.wdaClient.session().app_terminate(appBundleId) # self.wdaClient().app_terminate(appBundleId) resp = self.wdaClient.app_terminate(appBundleId) logging.info("app_terminate resp=%s", resp) respStatus = resp.status respValue = resp.value respSessionId = resp.sessionId logging.info("respStatus=%s, respValue=%s, respSessionId", respStatus, respValue, respSessionId) if respStatus == 0: isTerminalOk = True respInfo = None else: errInfo = { "status": respStatus, "value": respValue, } respInfo = errInfo return isTerminalOk, respInfo
以及继续优化为:
def iOSTerminateApp(self, appBundleId): """Terminate iOS app Args: appBundleId (str): iOS app bundle id Returns: bool, dict/str: true, None false, str: error message Raises: """ isTerminalOk = False respInfo = None # self.wdaClient.session().app_terminate(appBundleId) # self.wdaClient().app_terminate(appBundleId) resp = self.wdaClient.app_terminate(appBundleId) logging.info("app_terminate resp=%s", resp) # respStatus = resp.status # respValue = resp.value # respSessionId = resp.sessionId # logging.info("respStatus=%s, respValue=%s, respSessionId", respStatus, respValue, respSessionId) # if respStatus == 0: # isTerminalOk = True # respInfo = None # else: # errInfo = { # "status": respStatus, # "value": respValue, # } # respInfo = errInfo isTerminalOk, respInfo = self.processWdaResponse(resp) return isTerminalOk, respInfo def processWdaResponse(self, wdaResponse): """Process common wda (http post) response Args: Returns: bool, ?/dict: true, response value false, error info dict Raises: """ isRespOk = False respInfo = None logging.debug("wdaResponse=%s", wdaResponse) respStatus = wdaResponse.status respValue = wdaResponse.value respSessionId = wdaResponse.sessionId logging.debug("respStatus=%s, respValue=%s, respSessionId", respStatus, respValue, respSessionId) if respStatus == 0: isRespOk = True respInfo = respValue else: isRespOk = False errInfo = { "status": respStatus, "value": respValue, "sessionId": respSessionId, } respInfo = errInfo return isRespOk, respInfo
再去把iOSGetAppState也改为上述写法
def iOSGetAppState(self, appBundleId): """get iOS app state Args: appBundleId (str): iOS app bundle id Returns: bool, enum/dict: true, app status enum false, error info dict Raises: """ curAppState = self.wdaClient.app_state(appBundleId) logging.debug("curAppState=%s", curAppState) """ { "value" : 4, "sessionId" : "5BBD460B-F420-461D-A5E3-244A74CDF5CE" } """ # # <GenericDict, len() = 3> # # curAppStateValue = curAppState[0] # # curAppStatus = curAppState.status # # curAppSessionId = curAppState.sessionId # # logging.debug("curAppStatus=%s, curAppSessionId=%s", curAppStatus, curAppSessionId) # curAppStateValue = curAppState.value # logging.debug("curAppStateValue=%s", curAppStateValue) # curStateEnum = ApplicationState(curAppStateValue) # logging.debug("curStateEnum=%s", curStateEnum) # return curStateEnum isGetOk, respInfo = self.processWdaResponse(curAppState) if isGetOk: respValue = respInfo curStateEnum = ApplicationState(respValue) logging.debug("curStateEnum=%s", curStateEnum) respInfo = curStateEnum return isGetOk, respInfo
然后去调试
调用:
isGetOk, curState = self.iOSGetAppState(iOS_AppId_Settings) logging.info("before terminal: curState=%s", curState) # stop before start to avoid current page is not homepage of 设置 isTerminalOk, respInfo = self.iOSTerminateApp(iOS_AppId_Settings) logging.info("isTerminalOk=%s, respInfo=%s", isTerminalOk, respInfo) isGetOk, curState = self.iOSGetAppState(iOS_AppId_Settings) logging.info("after terminal: curState=%s", curState)
去调试
[200611 15:51:59][DevicesMethods.py 2600] app_terminate resp=GenericDict(value=False, sessionId='79A39B72-F5F9-4A01-8E58-DD380452350A', status=0) [200611 xxx][DevicesMethods.py 2667] isTerminalOk=True, respInfo=False
没有运行设置时,去terminate,会返回value是false
有运行 设置时,去terminate,返回value是True

再去把:
launchResult = self.wdaClient.app_launch(iOS_AppId_Settings) logging.debug("launchResult=%s", launchResult)
launch启动,也改为:
def iOSLaunchApp(self, appBundleId): """Launch iOS app Args: appBundleId (str): iOS app bundle id Returns: bool, None/str: true, None false, str: error message Raises: """ launchResp = self.wdaClient.app_launch(appBundleId) logging.debug("launchResp=%s", launchResp) isLaunchOk, respInfo = self.processWdaResponse(launchResp) return isLaunchOk, respInfo
调用
isLaunchOk, respInfo = self.iOSLaunchApp(iOS_AppId_Settings) logging.info("isLaunchOk=%s, respInfo=%s", isLaunchOk, respInfo)
是可以的。
【总结】
此处,把相关的facebook-wda的app管理的函数整理如下:
def iOSGetAppState(self, appBundleId): """get iOS app state Args: appBundleId (str): iOS app bundle id Returns: bool, enum/dict: true, app status enum false, error info dict Raises: """ curAppState = self.wdaClient.app_state(appBundleId) logging.debug("curAppState=%s", curAppState) """ { "value" : 4, "sessionId" : "5BBD460B-F420-461D-A5E3-244A74CDF5CE" } """ # # <GenericDict, len() = 3> # # curAppStateValue = curAppState[0] # # curAppStatus = curAppState.status # # curAppSessionId = curAppState.sessionId # # logging.debug("curAppStatus=%s, curAppSessionId=%s", curAppStatus, curAppSessionId) # curAppStateValue = curAppState.value # logging.debug("curAppStateValue=%s", curAppStateValue) # curStateEnum = ApplicationState(curAppStateValue) # logging.debug("curStateEnum=%s", curStateEnum) # return curStateEnum isGetOk, respInfo = self.processWdaResponse(curAppState) if isGetOk: respValue = respInfo curStateEnum = ApplicationState(respValue) logging.debug("curStateEnum=%s", curStateEnum) respInfo = curStateEnum return isGetOk, respInfo def iOSTerminateApp(self, appBundleId): """Terminate iOS app Args: appBundleId (str): iOS app bundle id Returns: bool, bool/str: true, bool True: terminal Ok False: terminal fail eg: current not running 设置, if terminal, return False false, str: error message Raises: """ # isTerminalOk = False # respInfo = None # self.wdaClient.session().app_terminate(appBundleId) # self.wdaClient().app_terminate(appBundleId) terminateResp = self.wdaClient.app_terminate(appBundleId) logging.debug("terminateResp=%s", terminateResp) # respStatus = resp.status # respValue = resp.value # respSessionId = resp.sessionId # logging.info("respStatus=%s, respValue=%s, respSessionId", respStatus, respValue, respSessionId) # if respStatus == 0: # isTerminalOk = True # respInfo = None # else: # errInfo = { # "status": respStatus, # "value": respValue, # } # respInfo = errInfo isTerminalOk, respInfo = self.processWdaResponse(terminateResp) return isTerminalOk, respInfo def iOSLaunchApp(self, appBundleId): """Launch iOS app Args: appBundleId (str): iOS app bundle id Returns: bool, None/str: true, None false, str: error message Raises: """ launchResp = self.wdaClient.app_launch(appBundleId) logging.debug("launchResp=%s", launchResp) isLaunchOk, respInfo = self.processWdaResponse(launchResp) return isLaunchOk, respInfo def processWdaResponse(self, wdaResponse): """Process common wda (http post) response Args: Returns: bool, ?/dict: true, response value false, error info dict Raises: """ isRespOk = False respInfo = None logging.debug("wdaResponse=%s", wdaResponse) respStatus = wdaResponse.status respValue = wdaResponse.value respSessionId = wdaResponse.sessionId logging.debug("respStatus=%s, respValue=%s, respSessionId", respStatus, respValue, respSessionId) if respStatus == 0: isRespOk = True respInfo = respValue else: isRespOk = False errInfo = { "status": respStatus, "value": respValue, "sessionId": respSessionId, } respInfo = errInfo return isRespOk, respInfo
相关调用:
isGetOk, curState = self.iOSGetAppState(iOS_AppId_Settings) logging.info("before terminal: curState=%s", curState) # stop before start to avoid current page is not homepage of 设置 isTerminalOk, respInfo = self.iOSTerminateApp(iOS_AppId_Settings) logging.info("isTerminalOk=%s, respInfo=%s", isTerminalOk, respInfo) isGetOk, curState = self.iOSGetAppState(iOS_AppId_Settings) logging.info("after terminal: curState=%s", curState) # settingsSession = self.wdaClient.session(iOS_AppId_Settings) # logging.debug("settingsSession=%s" % settingsSession) # launchResult = self.wdaClient.app_launch(iOS_AppId_Settings) # logging.debug("launchResult=%s", launchResult) isLaunchOk, respInfo = self.iOSLaunchApp(iOS_AppId_Settings) logging.info("isLaunchOk=%s, respInfo=%s", isLaunchOk, respInfo) # logging.info("launchResult: value=%s, status=%s, sessionId=%s", launchResult.value, launchResult.status, launchResult.sessionId) # launchResult: value=None, status=0, sessionId=79A39B72-F5F9-4A01-8E58-DD380452350A # logging.info("launchResult=%s", str(launchResult)) # launchResult=GenericDict(value=None, sessionId='79A39B72-F5F9-4A01-8E58-DD380452350A', status=0)
即可。