TMenu.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. # -*- coding:utf-8 -*-
  2. import time
  3. from BaseLog import CBaseLog
  4. from ExtraData import CExtraData
  5. from OptionExcel import COptionExcel
  6. from OptionConfig import COptionConfig
  7. from OptionAction import COptionAction
  8. from ssat_sdk.source_input import SourceGenInput
  9. # 测试使用到
  10. import random
  11. class CTMenu(CBaseLog):
  12. sourceInput = SourceGenInput()
  13. def __init__(self, ocrDict=None):
  14. CBaseLog.__init__(self)
  15. self.__exData = CExtraData()
  16. self.__optionExcel = COptionExcel(self.__exData)
  17. self.__optionConfig = COptionConfig(self.__exData, self.__optionExcel)
  18. '''
  19. 函数:判断两值(for_ocr与ocr识别结果)是否相等;
  20. 参数:
  21. srcValue 源值,excel表格中读取的value值。
  22. tagValue 目标值,ocr识别的结果值。
  23. 返回:相同返回True。
  24. '''
  25. def __isValueEqual(self, srcValue, tagValue):
  26. self.info(u"源值=%s, 目标值=%s" % (str(srcValue), str(tagValue)))
  27. '''
  28. 函数:移动到目标节点上(路径节点和value节点)
  29. 参数:
  30. opa COptionAction对象;
  31. moveDirection 移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
  32. maxTry 最大移动次数,防止死循环。
  33. 返回:Boolean是否在目标节点上, 文本或数值。
  34. '''
  35. def __move2TargetNode(self, opa, moveDirection, maxTry=15):
  36. tryCount = 0
  37. # 是否到目标结点了;
  38. isOnTargetNode = False
  39. # 目标节点聚焦状态;
  40. targetFocus = False
  41. # 目标文本或数值;
  42. targetText = None
  43. # 移动到目标节点;
  44. while True:
  45. # 判断是否移动成功;
  46. targetFocus, targetText = opa.isOnTargetNode()
  47. if targetFocus is True:
  48. # 如果已在目标结点,退出循环;
  49. if opa.isOnTargetOption() or opa.isOnValueSheet():
  50. self.info(u"<到达目标路径节点或value节点>")
  51. isOnTargetNode = True
  52. break
  53. # 先处理密码框;
  54. hasBox, dealStatus = opa.dealPasswordBox()
  55. if hasBox is True and dealStatus is False:
  56. break
  57. # 未到目标,进入下一节点;
  58. self.info(u"<进入下一节点>")
  59. opa.enterNode()
  60. continue
  61. # endif
  62. # 移动到下/上一节点;
  63. if moveDirection:
  64. opa.move2NextSiblingNode()
  65. else:
  66. opa.move2PrevSiblingNode()
  67. tryCount += 1
  68. if tryCount > maxTry:
  69. self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
  70. break
  71. # end-while
  72. return isOnTargetNode, targetText
  73. '''
  74. 函数:聚焦到指定option中。
  75. 参数:
  76. opa COptionAction对象。
  77. 返回:Boolean,成功返回True.
  78. '''
  79. def __focusOption(self, opa):
  80. # 检测路径是否有效;
  81. if opa.checkRunOptionPath() is False:
  82. self.__back2Home(opa)
  83. return False
  84. # 首先,调用根菜单;
  85. opa.callFirstOptionShortCutKey()
  86. time.sleep(1)
  87. if opa.isOnFirstOption() is False:
  88. self.error(u"未聚焦到根节点上,退出")
  89. self.__back2Home(opa)
  90. return False
  91. # 遍历到目标option中;
  92. if self.__move2TargetNode(opa, True)[0] is False:
  93. if self.__move2TargetNode(opa, False)[0] is False:
  94. self.__back2Home(opa)
  95. return False
  96. return True
  97. '''
  98. 函数:进入到指定的option中。
  99. 参数:
  100. opa COptionAction对象。
  101. 返回:Boolean,成功返回True.
  102. '''
  103. def __openOption(self, opa):
  104. if self.__focusOption(opa) is False:
  105. return False
  106. # 先处理密码框;
  107. hasBox, dealStatus = opa.dealPasswordBox()
  108. if hasBox is True and dealStatus is False:
  109. self.error(u"密码框处理失败")
  110. return False
  111. # 到达目标option后;
  112. self.info(u"进入option")
  113. opa.enterNode()
  114. return True
  115. '''
  116. 函数:返回到主页(不一定就是Home页,一般指返回运行前的那个画面)
  117. 参数:
  118. opa COptionAction对象;
  119. 返回:
  120. '''
  121. def __back2Home(self, opa):
  122. self.info(u"返回主页")
  123. while opa.pos > 0:
  124. opa.back2ParentNode()
  125. self.info(u"【如果设置value时,会自动回退到上一层父节点,此处操作正常。否则要多返回一层。】")
  126. '''
  127. 函数:设置指定的option的值为optionValue。
  128. 参数:
  129. optionName 要设置的option;
  130. optionValue option要设置的值;
  131. 返回: Boolean。
  132. '''
  133. def setOptionValue(self, optionName, optionValue):
  134. self.info(u"【%s】【%s】" % (optionName, optionValue))
  135. CTMenu.sourceInput.setPattern(11)
  136. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  137. # 检测路径是否有效;
  138. if self.__openOption(opa) is False:
  139. return False
  140. # 遍历到value节点中;
  141. if self.__move2TargetNode(opa, True)[0] is False:
  142. if self.__move2TargetNode(opa, False)[0] is False:
  143. self.__back2Home(opa)
  144. return False
  145. # 找到value节点,设置值;
  146. self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
  147. opa.setOptionValue()
  148. # 返回主页;
  149. self.__back2Home(opa)
  150. '''
  151. 函数:移动到目标option后,读取该option的value值,与optionValue进行比较,相等表示检测值与目标值一致;
  152. 参数:
  153. optionName 要设置的option;
  154. optionValue option要设置的值;
  155. 返回: Boolean。
  156. '''
  157. def checkOptionValue(self, optionName, optionValue):
  158. self.info(u"【%s】【%s】" % (optionName, optionValue))
  159. CTMenu.sourceInput.setPattern(11)
  160. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  161. # 进入节点;
  162. if self.__openOption(opa) is False:
  163. return False
  164. isValueEqual = False
  165. # 获取value节点值;
  166. valueFocus, valueText = opa.isOnTargetNode()
  167. self.info(u"===当前捕获的文本内容=%s,目标文本=%s,状态:%d===" % (str(valueText), str(optionValue), valueFocus))
  168. # 如果是数值,则判断获取的值是否相等;否则,只判断是否聚焦.
  169. if type(optionValue) == int or type(optionValue) == float:
  170. isValueEqual = True if float(optionValue) == float(valueText) else False
  171. else:
  172. isValueEqual = valueFocus
  173. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  174. opa.back2ParentNode(False)
  175. # 返回主页;
  176. self.__back2Home(opa)
  177. # 聚焦状态就是结果;
  178. self.info(u"checkOptionValue结果:optionValue=%s, ocrValue=%s, 结果=%d" % (str(optionValue), str(valueText), isValueEqual))
  179. return isValueEqual
  180. '''
  181. 函数:进入指定的option,并且不返回主页。
  182. 参数:
  183. optionName 指定要进入的option节点。
  184. 返回:Boolean。成功进入返回True.
  185. '''
  186. def openOption(self, optionName):
  187. self.info(u"【%s】" % optionName)
  188. CTMenu.sourceInput.setPattern(11)
  189. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  190. if self.__openOption(opa) is False:
  191. return False
  192. # 聚焦状态就是结果;
  193. self.info(u"成功open指定option=%s" % optionName)
  194. return True
  195. '''
  196. 函数:聚焦到指定option的value上,不设置不打开不返回。
  197. 参数:
  198. optionName
  199. optionValue
  200. 返回:
  201. '''
  202. def focusOptionValue(self, optionName, optionValue):
  203. self.info(u"【%s】【%s】" % (optionName, optionValue))
  204. CTMenu.sourceInput.setPattern(11)
  205. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  206. # 进入节点;
  207. if self.__openOption(opa) is False:
  208. return False
  209. # 遍历到value节点中;
  210. if self.__move2TargetNode(opa, True)[0] is False:
  211. if self.__move2TargetNode(opa, False)[0] is False:
  212. self.__back2Home(opa)
  213. return False
  214. return True
  215. '''
  216. 函数:获取当前option节点的value值。
  217. 参数:
  218. optionName 要获取值的option;
  219. 返回:Boolean, str/int/float
  220. '''
  221. def getOptionValue(self, optionName):
  222. self.info(u"【%s】" % optionName)
  223. CTMenu.sourceInput.setPattern(11)
  224. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  225. # 检测路径是否有效;
  226. if self.__openOption(opa) is False:
  227. return False
  228. # 获取value节点值;
  229. valueFocus, valueText = opa.isOnTargetNode()
  230. self.info(u"===当前捕获的文本内容=%s,聚焦状态:%d===" % (str(valueText), valueFocus))
  231. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  232. opa.back2ParentNode(False)
  233. # 返回主页;
  234. self.__back2Home(opa)
  235. return valueFocus, valueText
  236. '''
  237. 函数:
  238. 参数:
  239. 返回:
  240. '''
  241. def focusOption(self, optionName):
  242. self.info(u"【%s】" % optionName)
  243. CTMenu.sourceInput.setPattern(11)
  244. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  245. return self.__focusOption(opa)
  246. '''
  247. 函数:
  248. 参数:
  249. 返回:
  250. '''
  251. def inputUnlock(self, stdText, password=''):
  252. opa = COptionAction(None, None, self.__optionConfig, self.__optionExcel)
  253. return opa.inputUnlock(stdText, password)
  254. '''
  255. 函数:当焦点已经在option层级上时,移动到指定的option上。
  256. 参数:
  257. optionName 目标option.
  258. 返回:Boolean,成功移动到目标节点返回True。
  259. 注意:该函数不是从根节点开始移动到目标节点,而是假定焦点已经在目标节点层级菜单上。
  260. '''
  261. def moveToOption(self, optionName):
  262. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  263. # 已经在该层级上.
  264. opa.setCurPos(opa.getPathLength()-1)
  265. # 检测路径是否有效;
  266. if opa.checkRunOptionPath() is False:
  267. self.__back2Home(opa)
  268. return False
  269. # 遍历到目标option中;
  270. if self.__move2TargetNode(opa, True)[0] is False:
  271. if self.__move2TargetNode(opa, False)[0] is False:
  272. self.__back2Home(opa)
  273. return False
  274. return True
  275. if __name__ == "__main__":
  276. ml = CTMenu()
  277. if 0:
  278. st = 2
  279. ml.setOptionValue('picture_preset', 'personal')
  280. time.sleep(st)
  281. ml.setOptionValue('picture_preset', 'dynamic')
  282. time.sleep(st)
  283. ml.setOptionValue('picture_preset', 'stadium')
  284. time.sleep(st)
  285. ml.setOptionValue('picture_preset', 'standard')
  286. time.sleep(st)
  287. ml.setOptionValue('picture_preset', 'natural')
  288. time.sleep(st)
  289. ml.setOptionValue('picture_preset', 'movie')
  290. if 0:
  291. st = 5
  292. value = random.randint(0, 100)
  293. time.sleep(st)
  294. ml.setOptionValue('brightness', value)
  295. time.sleep(st)
  296. ml.setOptionValue('contrast', value)
  297. time.sleep(st)
  298. ml.setOptionValue('saturation', value)
  299. time.sleep(st)
  300. ml.setOptionValue('tint', value)
  301. time.sleep(st)
  302. ml.setOptionValue('sharpness', value)
  303. time.sleep(st)
  304. ml.setOptionValue('backlight', value)
  305. if 0:
  306. st = 2
  307. ml.checkOptionValue('picture_preset', 'personal')
  308. time.sleep(st)
  309. ml.checkOptionValue('picture_preset', 'dynamic')
  310. time.sleep(st)
  311. ml.checkOptionValue('picture_preset', 'stadium')
  312. time.sleep(st)
  313. ml.checkOptionValue('picture_preset', 'standard')
  314. time.sleep(st)
  315. ml.checkOptionValue('picture_preset', 'natural')
  316. time.sleep(st)
  317. ml.checkOptionValue('picture_preset', 'movie')
  318. if 0:
  319. st = 8
  320. value = random.randint(0, 100)
  321. ml.setOptionValue('backlight', value)
  322. time.sleep(st)
  323. ml.checkOptionValue('backlight', value + 10)
  324. time.sleep(st)
  325. ml.checkOptionValue('backlight', value)
  326. time.sleep(st)
  327. ml.setOptionValue('brightness', value)
  328. time.sleep(st)
  329. ml.checkOptionValue('brightness', value + 10)
  330. time.sleep(st)
  331. ml.checkOptionValue('brightness', value)
  332. time.sleep(st)
  333. ml.setOptionValue('contrast', value)
  334. time.sleep(st)
  335. ml.checkOptionValue('contrast', value + 10)
  336. time.sleep(st)
  337. ml.checkOptionValue('contrast', value)
  338. time.sleep(st)
  339. ml.setOptionValue('saturation', value)
  340. time.sleep(st)
  341. ml.checkOptionValue('saturation', value + 10)
  342. time.sleep(st)
  343. ml.checkOptionValue('saturation', value)
  344. time.sleep(st)
  345. ml.setOptionValue('tint', value)
  346. time.sleep(st)
  347. ml.checkOptionValue('tint', value + 10)
  348. time.sleep(st)
  349. ml.checkOptionValue('tint', value)
  350. time.sleep(st)
  351. ml.setOptionValue('sharpness', value)
  352. time.sleep(st)
  353. ml.checkOptionValue('sharpness', value + 10)
  354. time.sleep(st)
  355. ml.checkOptionValue('sharpness', value)
  356. time.sleep(st)
  357. if 1:
  358. st = 30
  359. ml.openOption('picture_preset')
  360. time.sleep(st)
  361. ml.openOption('brightness')
  362. time.sleep(st)
  363. ml.openOption('contrast')
  364. time.sleep(st)
  365. ml.openOption('tint')
  366. time.sleep(st)
  367. ml.openOption('sharpness')
  368. time.sleep(st)
  369. ml.openOption('backlight')
  370. time.sleep(st)
  371. if 0:
  372. st = 30
  373. value = random.randint(0, 100)
  374. ml.focusOptionValue('brightness', value)
  375. time.sleep(st)
  376. ml.focusOptionValue('contrast', value)
  377. time.sleep(st)
  378. ml.focusOptionValue('saturation', value)
  379. time.sleep(st)
  380. ml.focusOptionValue('tint', value)
  381. time.sleep(st)
  382. ml.focusOptionValue('sharpness', value)
  383. time.sleep(st)
  384. ml.focusOptionValue('backlight', value)
  385. time.sleep(st)
  386. ml.focusOptionValue('picture_preset', 'personal')
  387. time.sleep(st)
  388. ml.focusOptionValue('picture_preset', 'dynamic')
  389. time.sleep(st)
  390. ml.focusOptionValue('picture_preset', 'stadium')
  391. time.sleep(st)
  392. ml.focusOptionValue('picture_preset', 'standard')
  393. time.sleep(st)
  394. ml.focusOptionValue('picture_preset', 'natural')
  395. time.sleep(st)
  396. ml.focusOptionValue('picture_preset', 'movie')
  397. if 0:
  398. st = 2
  399. ml.getOptionValue('brightness')
  400. time.sleep(st)
  401. ml.getOptionValue('contrast')
  402. time.sleep(st)
  403. ml.getOptionValue('saturation')
  404. time.sleep(st)
  405. ml.getOptionValue('tint')
  406. time.sleep(st)
  407. ml.getOptionValue('sharpness')
  408. time.sleep(st)
  409. ml.getOptionValue('backlight')
  410. time.sleep(st)
  411. ml.getOptionValue('picture_preset')
  412. if 0:
  413. ml.moveToOption('brightness')
  414. ml.moveToOption('picture_reset')
  415. ml.moveToOption('picture_preset')