# -*- coding:utf-8 -*- import os, sys, time from collections import OrderedDict from ssat_sdk.utils.string_util import strToList from UAT_log import error,info,debug DEBUG = True INFO = True ERROR = True class FirstLevel(): ParentCol = 0 ShortCutKeyCol = ParentCol + 1 UIViewCol = ParentCol + 2 MoveKeyCol = ParentCol + 3 ToParentKeyCol = ParentCol + 4 LayoutCol = ParentCol + 5 OptionCol = ParentCol + 6 OptionViewCol = ParentCol + 7 FocusSelectCol = ParentCol + 8 FocuseViewCol = ParentCol + 9 EnterKeyCol = ParentCol + 10 TextValueCol = ParentCol + 11 InfoViewCol = ParentCol + 12 OthersCol = ParentCol + 13 class NLevel(): ParentCol = 0 UIViewCol = ParentCol + 1 MoveKeyCol = ParentCol + 2 ToParentKeyCol = ParentCol + 3 LayoutCol = ParentCol + 4 OptionCol = ParentCol + 5 OptionViewCol = ParentCol + 6 FocusSelectCol = ParentCol + 7 FocuseViewCol = ParentCol + 8 EnterKeyCol = ParentCol + 9 TextValueCol = ParentCol + 10 InfoViewCol = ParentCol + 11 OthersCol = ParentCol + 12 class DialogLevel(): DialogCol = 0 UIViewCol = DialogCol + 1 MoveKeyCol = DialogCol + 2 ToParentKeyCol = DialogCol + 3 LayoutCol = DialogCol + 4 OptionCol = DialogCol + 5 OptionViewCol = DialogCol + 6 FocusSelectCol = DialogCol + 7 FocuseViewCol = DialogCol + 8 EnterKeyCol = DialogCol + 9 TextValueCol = DialogCol + 10 InfoViewCol = DialogCol + 11 OthersCol = DialogCol + 12 FirstPrev = "first-prev" class UATTree(): TAB_NAME = "name" TAB_SHORTCUT_KEY = "shortcut_key" TAB_UI_VIEW = "uiview" TAB_MOVE_KEY = "move_key" TAB_TOPARENT_KEY = "toparent_key" TAB_LAYOUT = "layout" TAB_OPTION = "option" TAB_LEVEL = "level" TAB_PREV_PARENT = "prev_parent" TAB_NEXT_PARENT = "next_parent" TAB_OPTION_VIEW = "optionView" TAB_FOCUS_SELECT = "focus-select" TAB_FOCUSE_VIEW = "focuseView" TAB_TEXT_VALUE = "textValue" TAB_ENTER_KEY = "enter_key" TAB_PARENT_NAME = "parentName" TAB_INFO_VIEW = "infoView" TAB_OTHERS = "others" def __init__(self): self.treeDict = OrderedDict() self.dialogDict = OrderedDict() self.cls = "UATTree" ''' char为该项参数的括符符号,必须成对带入。默认为中括号[] ''' def parseParam(self, key, params, char = "[]"): # 为防止key在其他地方存在相同关键字,添加一个"["做区别 key = key + char[0] keyIndex = params.find(key) if keyIndex == -1: return "" # key.__len__()-1 为去掉"["的处理 str1 = params[keyIndex + key.__len__()-1:params.__len__()] i1 = str1.find(char[0]) i2 = str1.find(char[1]) if i1 == -1 or i2 == -1: return "" str2 = str1[i1 + 1: i2] return str2.strip() def parseMulParam(self, keyList, params): paramDict = {} for key in keyList: value = self.parseParam(key, params) paramDict[key] = value return paramDict #KeyDict数据 Key_AM = "am" #android am命令 Key_Event = "event" #android KeyEvent Key_IR = "ir" #红外按键 Key_Input = "input" #Android input命令 Max_Try = "max_try" #根据key的字符串,解析出key的字典。格式:am[]event[]ir[]组合 def parseKey(self, keyStr): keyList = [self.Key_AM, self.Key_Event, self.Key_IR, self.Key_Input, self.Max_Try] keyDict = self.parseMulParam(keyList, keyStr) keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",") keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",") return keyDict #Android View数据 View_ID = "resid" #android view resource-id View_Text = "text" #android view 文本内容 View_Desc = "desc" #android view描述 View_Bounds = "bounds" #android view 坐标 View_Index = "index" View_Class = "class" def parseView(self, viewStr): keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class] return self.parseMulParam(keyList, viewStr) # UI 界面数据 UIView_Activity = "activity" # android activity UIVIew_Action = "action" UIView_ID = "resid" # android view resource-id UIView_Text = "text" # android view 文本内容 UIView_Desc = "desc" # android view描述 UIView_Bounds = "bounds" # android view 坐标 UIView_Dialog_F = "dialog_forward" # 进入时可能出现的弹窗 UIView_Dialog_B = "dialog_back" # 退出时可能出现的弹窗 def parseUIView(self, viewStr): keyList = [self.UIView_Activity, self.UIVIew_Action, self.UIView_ID, self.UIView_Text, self.UIView_Desc, self.UIView_Bounds, self.UIView_Dialog_F, self.UIView_Dialog_B] uiView = self.parseMulParam(keyList, viewStr) return self.parseDialogParam(uiView) def parseDialogParam(self, uiView): dialog_F_List = strToList(uiView[self.UIView_Dialog_F], ",") dialog_B_List = strToList(uiView[self.UIView_Dialog_B], ",") self.addDialogList(dialog_F_List, uiView, True) self.addDialogList(dialog_B_List, uiView, False) return uiView def addDialogList(self, dialog_List, uiView, isForward): for dialog in dialog_List: dialog_A = strToList(dialog.lower(), "&") if dialog_A.__len__() == 2: dialog_Name = dialog_A[0] dialog_Choose = dialog_A[1] else: error(str(self.__class__), "parseDialogParam", "Dialog %s set error"%dialog, ERROR) return if self.dialogDict.has_key(dialog_Name): if isForward is True: dialog_Type = self.UIView_Dialog_F else: dialog_Type = self.UIView_Dialog_B uiView[dialog_Type] = {} uiView[dialog_Type][dialog_Name] = self.dialogDict[dialog_Name] uiView[dialog_Type][dialog_Name]["choose"] = self.dialogDict[dialog_Name][UATTree.TAB_OPTION][dialog_Choose] else: error(str(self.__class__), "parseDialogParam", "Dialog %s read fail"%dialog_Name, ERROR) # Android Layout数据 Layout_ID = "resid" # android view resource-id Layout_Desc = "desc" # android view描述 Layout_Bounds = "bounds" # android view 坐标 def parseLayout(self, viewStr): keyList = [self.Layout_ID, self.Layout_Desc, self.Layout_Bounds] return self.parseMulParam(keyList, viewStr) #Android FocusView数据 Focus_ID = "resid" #android view resource-id Focus_Text = "text" #android view 文本内容 Focus_Desc = "desc" #android view描述 def parseFocus(self, viewStr): keyList = [self.Focus_ID, self.Focus_Text, self.Focus_Desc] return self.parseMulParam(keyList, viewStr) #Value数据 ValueView_ID = "resid" #android view resource-id ValueView_Text = "text" #android view 文本内容 ValueView_Desc = "desc" #android view描述 ValueView_Value = "value" # 输入的值范围。格式:first, second, ... 或者 0-100 ValueView_Min = "minvalue" # 如果是数值范围形式的值,返回最小值 ValueView_Max = "maxvalue" # 如果是数值范围形式的值,返回最小值 ValueView_StepSize = "stepsize" # 如果是数值范围形式的值,每次调整数值的步长。读不到此参数时,默认为1。 ValueView_Duration = "duration" # 如果是数值范围形式的值,每次调整数值的间隔时间。读不到此参数时,默认为0.2。 def parseValueView(self, viewStr): keyList = [self.ValueView_ID, self.ValueView_Text, self.ValueView_Desc, self.ValueView_Value, self.ValueView_StepSize, self.ValueView_Duration] paramDict = self.parseMulParam(keyList, viewStr) valueStr = paramDict[self.ValueView_Value] if valueStr != "": i = valueStr.find(",") if i != -1: valueList = strToList(valueStr, ",") isRange = False # 处理range类型(数值) try: if valueList.__len__() == 2: paramDict[self.ValueView_Min] = float(valueList[0]) paramDict[self.ValueView_Max] = float(valueList[1]) isRange = True except Exception,ValueError: info(self.cls, "parseValueView", "valueList %s not range value.", INFO) # 处理非range类型(选项) if isRange is False: for value in valueList: valueViewStr = self.parseParam(value, viewStr, "{}") if valueViewStr == "": debug(self.cls, "parseValueView", "value %s 没有任何配置信息!!!请加入该value信息,否则可能将导致设值失败!!!"%value, DEBUG) # 读出来的数值未带大括号,需加上大括号,并且json格式化 valueView = eval("{%s}" % valueViewStr) paramDict[value] = valueView return paramDict #focus-select数据 FS_Type = "type" def parseFocusSelectType(self, fsType): keyList = [self.FS_Type] return self.parseMulParam(keyList, fsType) def addParent(self,level, parentName, shortkey, uiview, move_key, toparent_key, layout, others): # print "addParent, level,parentName:", level, parentName if not self.treeDict.has_key(level): self.treeDict[level] = {} parentDict = {} parentDict[UATTree.TAB_NAME] = parentName parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey) parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview) parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key) parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key) parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout) parentDict[UATTree.TAB_OPTION] = {} parentDict[UATTree.TAB_LEVEL] = level parentDict[UATTree.TAB_PREV_PARENT] = None parentDict[UATTree.TAB_NEXT_PARENT] = {} parentDict[UATTree.TAB_OTHERS] = self.parseOthers(others) if "first" <> level: prevLevel = self.getPrevLevel(level) prevOption = self.getOpitonInLevel(parentName,prevLevel) if prevOption is None: error(str(self.__class__), "addParent", "Option %s not found in level %s"%(parentName, prevLevel), ERROR) prevParent = self.getParentByOption(prevOption) if prevParent is not None: parentDict[UATTree.TAB_PREV_PARENT] = prevParent prevParent[UATTree.TAB_NEXT_PARENT][parentName] = parentDict else: error(str(self.__class__), "addParent", "Option %s's parent not found in level %s"%(parentName, prevLevel), ERROR) self.treeDict[level][parentName] = parentDict def addOption(self, level, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView): # print "addOption, level,parentName,optionName:", level, parentName,optionName if self.treeDict.has_key(level) and self.treeDict[level].has_key(parentName): optionDict = {} optionDict[UATTree.TAB_NAME] = optionName optionDict[UATTree.TAB_OPTION_VIEW] = self.parseView(optionView) optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect) optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView) optionDict[UATTree.TAB_ENTER_KEY] = self.parseKey(enterKey) optionDict["textValue"] = self.parseValueView(textValue) optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView) optionDict[UATTree.TAB_PARENT_NAME] = parentName optionDict[UATTree.TAB_LEVEL] = level self.treeDict[level][parentName][UATTree.TAB_OPTION][optionName] = optionDict def addDialog(self, parentName, shortkey, uiview, move_key, toparent_key, layout, others): # print "addDialog, parentName:", parentName parentDict = {} parentDict[UATTree.TAB_NAME] = parentName parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey) parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview) parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key) parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key) parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout) parentDict[UATTree.TAB_OPTION] = {} parentDict[UATTree.TAB_OTHERS] = self.parseDialogOthers(others) self.dialogDict[parentName] = parentDict def addDialogOption(self, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView): # print "addDialogOption, parentName,optionName:", parentName, optionName if self.dialogDict.has_key(parentName): optionDict = {} optionDict[UATTree.TAB_NAME] = optionName optionDict[UATTree.TAB_OPTION_VIEW] = self.parseView(optionView) optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect) optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView) optionDict[UATTree.TAB_ENTER_KEY] = self.parseKey(enterKey) optionDict[UATTree.TAB_TEXT_VALUE] = self.parseValueView(textValue) optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView) optionDict[UATTree.TAB_PARENT_NAME] = parentName self.dialogDict[parentName][UATTree.TAB_OPTION][optionName] = optionDict def findParentDict(self, parentName): parentName = parentName.lower() levelList = self.treeDict.keys() for index in range(levelList.__len__()-1, -1, -1): level = levelList[index] if self.treeDict[level].has_key(parentName): return self.treeDict[level][parentName] return None def getSubOptionDict(self, parentName): parentDict = self.findParentDict(parentName) if parentDict is not None: return parentDict[UATTree.TAB_OPTION] return None def findOption(self, optionName): optionName = optionName.lower() levelList = self.treeDict.keys() for index in range(levelList.__len__()-1, -1, -1): level = levelList[index] levelDict = self.treeDict[level] for parent in levelDict.keys(): parentDict = levelDict[parent] for option in parentDict.keys(): optionDict = parentDict[UATTree.TAB_OPTION] if optionDict.has_key(optionName): return optionDict[optionName] def getOpitonInLevel(self,targetOptionName, level): levelDict = self.treeDict[level] for parentName in levelDict.keys(): parentDict = levelDict[parentName] for optionName in parentDict[UATTree.TAB_OPTION].keys(): if targetOptionName == optionName: return parentDict[UATTree.TAB_OPTION][optionName] else: return None ''' 获取option的parent ''' def getParentByOption(self, option): parentName = option[UATTree.TAB_PARENT_NAME] levelName = option[UATTree.TAB_LEVEL] if self.treeDict[levelName].has_key(parentName): parent = self.treeDict[levelName][parentName] return parent else: return None ''' 获取当前level的前一个level名 ''' def getPrevLevel(self, level): self.levelList = self.treeDict.keys() index = self.levelList.index(level) if index == 0: return FirstPrev else: return self.levelList[index-1] ''' 获取当前Parent的上一级parent ''' def getPrevParent(self, parent): return parent[UATTree.TAB_PREV_PARENT] ''' 获取当前parent下一级所有parent的字典 ''' def getNextParentList(self, parent): return parent[UATTree.TAB_NEXT_PARENT] def printTree(self): for level in self.treeDict.keys(): print level for parent in self.treeDict[level].keys(): dict1 = self.treeDict[level][parent] print level, "::parent ", dict1["name"], "name", "shortcut_key", "uiview", "move_key", "toparent_key", "layout" print level, "::parent ", dict1["name"], dict1["shortcut_key"], dict1["uiview"], dict1["move_key"], dict1["toparent_key"], dict1["layout"] for option in dict1["option"].keys(): dict2 = dict1["option"][option] print level, "::option ", dict2 Key_HeartBeat = "heartbeat_key" def parseOthers(self, othersStr): othersDict = {} othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}") hb_keyDict = {} if othersDict[self.Key_HeartBeat] != "": print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat] hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat]) othersDict[self.Key_HeartBeat] = hb_keyDict return othersDict def parseHeartBeatKey(self, hb_keyStr): keyList = [self.Key_Event, self.Key_IR] keyDict = self.parseMulParam(keyList, hb_keyStr) keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",") keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",") return keyDict def parseDialogOthers(self, othersStr): othersDict = {} othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}") hb_keyDict = {} if othersDict[self.Key_HeartBeat] != "": print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat] hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat]) othersDict[self.Key_HeartBeat] = hb_keyDict return othersDict if __name__ == '__main__': uatTree = UATTree()