折腾:
【未解决】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)即可。