UAT_tree.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. # -*- coding:utf-8 -*-
  2. import os, sys, time
  3. from collections import OrderedDict
  4. from ssat_sdk.utils.string_util import strToList
  5. from UAT_log import error,info,debug
  6. DEBUG = True
  7. INFO = True
  8. ERROR = True
  9. class FirstLevel():
  10. ParentCol = 0
  11. ShortCutKeyCol = ParentCol + 1
  12. UIViewCol = ParentCol + 2
  13. MoveKeyCol = ParentCol + 3
  14. ToParentKeyCol = ParentCol + 4
  15. LayoutCol = ParentCol + 5
  16. OptionCol = ParentCol + 6
  17. OptionViewCol = ParentCol + 7
  18. FocusSelectCol = ParentCol + 8
  19. FocuseViewCol = ParentCol + 9
  20. EnterKeyCol = ParentCol + 10
  21. TextValueCol = ParentCol + 11
  22. InfoViewCol = ParentCol + 12
  23. OthersCol = ParentCol + 13
  24. class NLevel():
  25. ParentCol = 0
  26. UIViewCol = ParentCol + 1
  27. MoveKeyCol = ParentCol + 2
  28. ToParentKeyCol = ParentCol + 3
  29. LayoutCol = ParentCol + 4
  30. OptionCol = ParentCol + 5
  31. OptionViewCol = ParentCol + 6
  32. FocusSelectCol = ParentCol + 7
  33. FocuseViewCol = ParentCol + 8
  34. EnterKeyCol = ParentCol + 9
  35. TextValueCol = ParentCol + 10
  36. InfoViewCol = ParentCol + 11
  37. OthersCol = ParentCol + 12
  38. class DialogLevel():
  39. DialogCol = 0
  40. UIViewCol = DialogCol + 1
  41. MoveKeyCol = DialogCol + 2
  42. ToParentKeyCol = DialogCol + 3
  43. LayoutCol = DialogCol + 4
  44. OptionCol = DialogCol + 5
  45. OptionViewCol = DialogCol + 6
  46. FocusSelectCol = DialogCol + 7
  47. FocuseViewCol = DialogCol + 8
  48. EnterKeyCol = DialogCol + 9
  49. TextValueCol = DialogCol + 10
  50. InfoViewCol = DialogCol + 11
  51. OthersCol = DialogCol + 12
  52. FirstPrev = "first-prev"
  53. class UATTree():
  54. TAB_NAME = "name"
  55. TAB_SHORTCUT_KEY = "shortcut_key"
  56. TAB_UI_VIEW = "uiview"
  57. TAB_MOVE_KEY = "move_key"
  58. TAB_TOPARENT_KEY = "toparent_key"
  59. TAB_LAYOUT = "layout"
  60. TAB_OPTION = "option"
  61. TAB_LEVEL = "level"
  62. TAB_PREV_PARENT = "prev_parent"
  63. TAB_NEXT_PARENT = "next_parent"
  64. TAB_OPTION_VIEW = "optionView"
  65. TAB_FOCUS_SELECT = "focus-select"
  66. TAB_FOCUSE_VIEW = "focuseView"
  67. TAB_TEXT_VALUE = "textValue"
  68. TAB_ENTER_KEY = "enter_key"
  69. TAB_PARENT_NAME = "parentName"
  70. TAB_INFO_VIEW = "infoView"
  71. TAB_OTHERS = "others"
  72. def __init__(self):
  73. self.treeDict = OrderedDict()
  74. self.dialogDict = OrderedDict()
  75. self.cls = "UATTree"
  76. '''
  77. char为该项参数的括符符号,必须成对带入。默认为中括号[]
  78. '''
  79. def parseParam(self, key, params, char = "[]"):
  80. # 为防止key在其他地方存在相同关键字,添加一个"["做区别
  81. key = key + char[0]
  82. keyIndex = params.find(key)
  83. if keyIndex == -1:
  84. return ""
  85. # key.__len__()-1 为去掉"["的处理
  86. str1 = params[keyIndex + key.__len__()-1:params.__len__()]
  87. i1 = str1.find(char[0])
  88. i2 = str1.find(char[1])
  89. if i1 == -1 or i2 == -1:
  90. return ""
  91. str2 = str1[i1 + 1: i2]
  92. return str2.strip()
  93. def parseMulParam(self, keyList, params):
  94. paramDict = {}
  95. for key in keyList:
  96. value = self.parseParam(key, params)
  97. paramDict[key] = value
  98. return paramDict
  99. #KeyDict数据
  100. Key_AM = "am" #android am命令
  101. Key_Event = "event" #android KeyEvent
  102. Key_IR = "ir" #红外按键
  103. Key_Input = "input" #Android input命令
  104. Max_Try = "max_try"
  105. #根据key的字符串,解析出key的字典。格式:am[]event[]ir[]组合
  106. def parseKey(self, keyStr):
  107. keyList = [self.Key_AM, self.Key_Event, self.Key_IR, self.Key_Input, self.Max_Try]
  108. keyDict = self.parseMulParam(keyList, keyStr)
  109. keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",")
  110. keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",")
  111. return keyDict
  112. #Android View数据
  113. View_ID = "resid" #android view resource-id
  114. View_Text = "text" #android view 文本内容
  115. View_Desc = "desc" #android view描述
  116. View_Bounds = "bounds" #android view 坐标
  117. View_Index = "index"
  118. View_Class = "class"
  119. def parseView(self, viewStr):
  120. keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class]
  121. return self.parseMulParam(keyList, viewStr)
  122. # UI 界面数据
  123. UIView_Activity = "activity" # android activity
  124. UIVIew_Action = "action"
  125. UIView_ID = "resid" # android view resource-id
  126. UIView_Text = "text" # android view 文本内容
  127. UIView_Desc = "desc" # android view描述
  128. UIView_Bounds = "bounds" # android view 坐标
  129. UIView_Dialog_F = "dialog_forward" # 进入时可能出现的弹窗
  130. UIView_Dialog_B = "dialog_back" # 退出时可能出现的弹窗
  131. def parseUIView(self, viewStr):
  132. keyList = [self.UIView_Activity, self.UIVIew_Action, self.UIView_ID, self.UIView_Text, self.UIView_Desc,
  133. self.UIView_Bounds, self.UIView_Dialog_F, self.UIView_Dialog_B]
  134. uiView = self.parseMulParam(keyList, viewStr)
  135. return self.parseDialogParam(uiView)
  136. def parseDialogParam(self, uiView):
  137. dialog_F_List = strToList(uiView[self.UIView_Dialog_F], ",")
  138. dialog_B_List = strToList(uiView[self.UIView_Dialog_B], ",")
  139. self.addDialogList(dialog_F_List, uiView, True)
  140. self.addDialogList(dialog_B_List, uiView, False)
  141. return uiView
  142. def addDialogList(self, dialog_List, uiView, isForward):
  143. for dialog in dialog_List:
  144. dialog_A = strToList(dialog.lower(), "&")
  145. if dialog_A.__len__() == 2:
  146. dialog_Name = dialog_A[0]
  147. dialog_Choose = dialog_A[1]
  148. else:
  149. error(str(self.__class__), "parseDialogParam", "Dialog %s set error"%dialog, ERROR)
  150. return
  151. if self.dialogDict.has_key(dialog_Name):
  152. if isForward is True:
  153. dialog_Type = self.UIView_Dialog_F
  154. else:
  155. dialog_Type = self.UIView_Dialog_B
  156. uiView[dialog_Type] = {}
  157. uiView[dialog_Type][dialog_Name] = self.dialogDict[dialog_Name]
  158. uiView[dialog_Type][dialog_Name]["choose"] = self.dialogDict[dialog_Name][UATTree.TAB_OPTION][dialog_Choose]
  159. else:
  160. error(str(self.__class__), "parseDialogParam", "Dialog %s read fail"%dialog_Name, ERROR)
  161. # Android Layout数据
  162. Layout_ID = "resid" # android view resource-id
  163. Layout_Desc = "desc" # android view描述
  164. Layout_Bounds = "bounds" # android view 坐标
  165. def parseLayout(self, viewStr):
  166. keyList = [self.Layout_ID, self.Layout_Desc, self.Layout_Bounds]
  167. return self.parseMulParam(keyList, viewStr)
  168. #Android FocusView数据
  169. Focus_ID = "resid" #android view resource-id
  170. Focus_Text = "text" #android view 文本内容
  171. Focus_Desc = "desc" #android view描述
  172. def parseFocus(self, viewStr):
  173. keyList = [self.Focus_ID, self.Focus_Text, self.Focus_Desc]
  174. return self.parseMulParam(keyList, viewStr)
  175. #Value数据
  176. ValueView_ID = "resid" #android view resource-id
  177. ValueView_Text = "text" #android view 文本内容
  178. ValueView_Desc = "desc" #android view描述
  179. ValueView_Value = "value" # 输入的值范围。格式:first, second, ... 或者 0-100
  180. ValueView_Min = "minvalue" # 如果是数值范围形式的值,返回最小值
  181. ValueView_Max = "maxvalue" # 如果是数值范围形式的值,返回最小值
  182. ValueView_StepSize = "stepsize" # 如果是数值范围形式的值,每次调整数值的步长。读不到此参数时,默认为1。
  183. ValueView_Duration = "duration" # 如果是数值范围形式的值,每次调整数值的间隔时间。读不到此参数时,默认为0.2。
  184. def parseValueView(self, viewStr):
  185. keyList = [self.ValueView_ID, self.ValueView_Text, self.ValueView_Desc, self.ValueView_Value, self.ValueView_StepSize, self.ValueView_Duration]
  186. paramDict = self.parseMulParam(keyList, viewStr)
  187. valueStr = paramDict[self.ValueView_Value]
  188. if valueStr != "":
  189. i = valueStr.find(",")
  190. if i != -1:
  191. valueList = strToList(valueStr, ",")
  192. isRange = False
  193. # 处理range类型(数值)
  194. try:
  195. if valueList.__len__() == 2:
  196. paramDict[self.ValueView_Min] = float(valueList[0])
  197. paramDict[self.ValueView_Max] = float(valueList[1])
  198. isRange = True
  199. except Exception,ValueError:
  200. info(self.cls, "parseValueView", "valueList %s not range value.", INFO)
  201. # 处理非range类型(选项)
  202. if isRange is False:
  203. for value in valueList:
  204. valueViewStr = self.parseParam(value, viewStr, "{}")
  205. if valueViewStr == "":
  206. debug(self.cls, "parseValueView", "value %s 没有任何配置信息!!!请加入该value信息,否则可能将导致设值失败!!!"%value, DEBUG)
  207. # 读出来的数值未带大括号,需加上大括号,并且json格式化
  208. valueView = eval("{%s}" % valueViewStr)
  209. paramDict[value] = valueView
  210. return paramDict
  211. #focus-select数据
  212. FS_Type = "type"
  213. def parseFocusSelectType(self, fsType):
  214. keyList = [self.FS_Type]
  215. return self.parseMulParam(keyList, fsType)
  216. def addParent(self,level, parentName, shortkey, uiview, move_key, toparent_key, layout, others):
  217. # print "addParent, level,parentName:", level, parentName
  218. if not self.treeDict.has_key(level):
  219. self.treeDict[level] = {}
  220. parentDict = {}
  221. parentDict[UATTree.TAB_NAME] = parentName
  222. parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey)
  223. parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview)
  224. parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key)
  225. parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key)
  226. parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout)
  227. parentDict[UATTree.TAB_OPTION] = {}
  228. parentDict[UATTree.TAB_LEVEL] = level
  229. parentDict[UATTree.TAB_PREV_PARENT] = None
  230. parentDict[UATTree.TAB_NEXT_PARENT] = {}
  231. parentDict[UATTree.TAB_OTHERS] = self.parseOthers(others)
  232. if "first" <> level:
  233. prevLevel = self.getPrevLevel(level)
  234. prevOption = self.getOpitonInLevel(parentName,prevLevel)
  235. if prevOption is None:
  236. error(str(self.__class__), "addParent", "Option %s not found in level %s"%(parentName, prevLevel), ERROR)
  237. prevParent = self.getParentByOption(prevOption)
  238. if prevParent is not None:
  239. parentDict[UATTree.TAB_PREV_PARENT] = prevParent
  240. prevParent[UATTree.TAB_NEXT_PARENT][parentName] = parentDict
  241. else:
  242. error(str(self.__class__), "addParent", "Option %s's parent not found in level %s"%(parentName, prevLevel), ERROR)
  243. self.treeDict[level][parentName] = parentDict
  244. def addOption(self, level, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView):
  245. # print "addOption, level,parentName,optionName:", level, parentName,optionName
  246. if self.treeDict.has_key(level) and self.treeDict[level].has_key(parentName):
  247. optionDict = {}
  248. optionDict[UATTree.TAB_NAME] = optionName
  249. optionDict[UATTree.TAB_OPTION_VIEW] = self.parseView(optionView)
  250. optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect)
  251. optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView)
  252. optionDict[UATTree.TAB_ENTER_KEY] = self.parseKey(enterKey)
  253. optionDict["textValue"] = self.parseValueView(textValue)
  254. optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView)
  255. optionDict[UATTree.TAB_PARENT_NAME] = parentName
  256. optionDict[UATTree.TAB_LEVEL] = level
  257. self.treeDict[level][parentName][UATTree.TAB_OPTION][optionName] = optionDict
  258. def addDialog(self, parentName, shortkey, uiview, move_key, toparent_key, layout, others):
  259. # print "addDialog, parentName:", parentName
  260. parentDict = {}
  261. parentDict[UATTree.TAB_NAME] = parentName
  262. parentDict[UATTree.TAB_SHORTCUT_KEY] = self.parseKey(shortkey)
  263. parentDict[UATTree.TAB_UI_VIEW] = self.parseUIView(uiview)
  264. parentDict[UATTree.TAB_MOVE_KEY] = self.parseKey(move_key)
  265. parentDict[UATTree.TAB_TOPARENT_KEY] = self.parseKey(toparent_key)
  266. parentDict[UATTree.TAB_LAYOUT] = self.parseLayout(layout)
  267. parentDict[UATTree.TAB_OPTION] = {}
  268. parentDict[UATTree.TAB_OTHERS] = self.parseDialogOthers(others)
  269. self.dialogDict[parentName] = parentDict
  270. def addDialogOption(self, parentName, optionName, optionView, focusSelect, focusView, enterKey, textValue, infoView):
  271. # print "addDialogOption, parentName,optionName:", parentName, optionName
  272. if self.dialogDict.has_key(parentName):
  273. optionDict = {}
  274. optionDict[UATTree.TAB_NAME] = optionName
  275. optionDict[UATTree.TAB_OPTION_VIEW] = self.parseView(optionView)
  276. optionDict[UATTree.TAB_FOCUS_SELECT] = self.parseFocusSelectType(focusSelect)
  277. optionDict[UATTree.TAB_FOCUSE_VIEW] = self.parseFocus(focusView)
  278. optionDict[UATTree.TAB_ENTER_KEY] = self.parseKey(enterKey)
  279. optionDict[UATTree.TAB_TEXT_VALUE] = self.parseValueView(textValue)
  280. optionDict[UATTree.TAB_INFO_VIEW] = self.parseView(infoView)
  281. optionDict[UATTree.TAB_PARENT_NAME] = parentName
  282. self.dialogDict[parentName][UATTree.TAB_OPTION][optionName] = optionDict
  283. def findParentDict(self, parentName):
  284. parentName = parentName.lower()
  285. levelList = self.treeDict.keys()
  286. for index in range(levelList.__len__()-1, -1, -1):
  287. level = levelList[index]
  288. if self.treeDict[level].has_key(parentName):
  289. return self.treeDict[level][parentName]
  290. return None
  291. def getSubOptionDict(self, parentName):
  292. parentDict = self.findParentDict(parentName)
  293. if parentDict is not None:
  294. return parentDict[UATTree.TAB_OPTION]
  295. return None
  296. def findOption(self, optionName):
  297. optionName = optionName.lower()
  298. levelList = self.treeDict.keys()
  299. for index in range(levelList.__len__()-1, -1, -1):
  300. level = levelList[index]
  301. levelDict = self.treeDict[level]
  302. for parent in levelDict.keys():
  303. parentDict = levelDict[parent]
  304. for option in parentDict.keys():
  305. optionDict = parentDict[UATTree.TAB_OPTION]
  306. if optionDict.has_key(optionName):
  307. return optionDict[optionName]
  308. def getOpitonInLevel(self,targetOptionName, level):
  309. levelDict = self.treeDict[level]
  310. for parentName in levelDict.keys():
  311. parentDict = levelDict[parentName]
  312. for optionName in parentDict[UATTree.TAB_OPTION].keys():
  313. if targetOptionName == optionName:
  314. return parentDict[UATTree.TAB_OPTION][optionName]
  315. else:
  316. return None
  317. '''
  318. 获取option的parent
  319. '''
  320. def getParentByOption(self, option):
  321. parentName = option[UATTree.TAB_PARENT_NAME]
  322. levelName = option[UATTree.TAB_LEVEL]
  323. if self.treeDict[levelName].has_key(parentName):
  324. parent = self.treeDict[levelName][parentName]
  325. return parent
  326. else:
  327. return None
  328. '''
  329. 获取当前level的前一个level名
  330. '''
  331. def getPrevLevel(self, level):
  332. self.levelList = self.treeDict.keys()
  333. index = self.levelList.index(level)
  334. if index == 0:
  335. return FirstPrev
  336. else:
  337. return self.levelList[index-1]
  338. '''
  339. 获取当前Parent的上一级parent
  340. '''
  341. def getPrevParent(self, parent):
  342. return parent[UATTree.TAB_PREV_PARENT]
  343. '''
  344. 获取当前parent下一级所有parent的字典
  345. '''
  346. def getNextParentList(self, parent):
  347. return parent[UATTree.TAB_NEXT_PARENT]
  348. def printTree(self):
  349. for level in self.treeDict.keys():
  350. print level
  351. for parent in self.treeDict[level].keys():
  352. dict1 = self.treeDict[level][parent]
  353. print level, "::parent ", dict1["name"], "name", "shortcut_key", "uiview", "move_key", "toparent_key", "layout"
  354. print level, "::parent ", dict1["name"], dict1["shortcut_key"], dict1["uiview"], dict1["move_key"], dict1["toparent_key"], dict1["layout"]
  355. for option in dict1["option"].keys():
  356. dict2 = dict1["option"][option]
  357. print level, "::option ", dict2
  358. Key_HeartBeat = "heartbeat_key"
  359. def parseOthers(self, othersStr):
  360. othersDict = {}
  361. othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")
  362. hb_keyDict = {}
  363. if othersDict[self.Key_HeartBeat] != "":
  364. print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat]
  365. hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat])
  366. othersDict[self.Key_HeartBeat] = hb_keyDict
  367. return othersDict
  368. def parseHeartBeatKey(self, hb_keyStr):
  369. keyList = [self.Key_Event, self.Key_IR]
  370. keyDict = self.parseMulParam(keyList, hb_keyStr)
  371. keyDict[self.Key_Event] = strToList(keyDict[self.Key_Event], ",")
  372. keyDict[self.Key_IR] = strToList(keyDict[self.Key_IR], ",")
  373. return keyDict
  374. def parseDialogOthers(self, othersStr):
  375. othersDict = {}
  376. othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")
  377. hb_keyDict = {}
  378. if othersDict[self.Key_HeartBeat] != "":
  379. print "Key_HeartBeat_Str:",othersDict[self.Key_HeartBeat]
  380. hb_keyDict = self.parseHeartBeatKey(othersDict[self.Key_HeartBeat])
  381. othersDict[self.Key_HeartBeat] = hb_keyDict
  382. return othersDict
  383. if __name__ == '__main__':
  384. uatTree = UATTree()