|
@@ -1,6 +1,5 @@
|
|
|
# -*- coding:utf-8 -*-
|
|
|
import os
|
|
|
-from UIT_PathManage import UITPathManage
|
|
|
from BaseLog import CBaseLog
|
|
|
from ExtraData import CExtraData
|
|
|
from OptionExcel import COptionExcel
|
|
@@ -15,12 +14,6 @@ g_level = ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth',
|
|
|
'Seventh', 'Eighth', 'Ninth', 'Tenth', 'Eleventh', 'Twelfth']
|
|
|
|
|
|
|
|
|
-def takePicture():
|
|
|
- img = os.path.join(getSATTmpDIR(), "menutree_runpath.png")
|
|
|
- COptionAction.__ccard.takePicture(img)
|
|
|
- return img
|
|
|
-
|
|
|
-
|
|
|
def strSplit(text):
|
|
|
ret = []
|
|
|
str_int = ''
|
|
@@ -69,6 +62,7 @@ class COptionAction(CBaseLog):
|
|
|
COptionAction.__redRat3.sendKey(aliveKey, 1, 0.1)
|
|
|
|
|
|
def __init__(self, optionName, optionValue, optionConfig, optionExcel):
|
|
|
+ CBaseLog.__init__(self)
|
|
|
# 层级位置;
|
|
|
self.__pos = 0
|
|
|
# 目标option;
|
|
@@ -86,11 +80,13 @@ class COptionAction(CBaseLog):
|
|
|
self.__optionPaths = self.__optionExcel.getOptionPaths(self.__optionName)
|
|
|
# 如果__optionValue空则不取value表任何内容;
|
|
|
if self.__optionValue != "":
|
|
|
- self.__optionValues = self.__optionExcel.getOptionValueInfo(self.__optionName, self.__optionValue)
|
|
|
+ self.__optionValueInfo = self.__optionExcel.getOptionValueInfo(self.__optionName, self.__optionValue)
|
|
|
self.__optionInfo = self.__optionExcel.getOptionInfo(self.__optionName)
|
|
|
# 当前状态下的变量,与__pos对应;
|
|
|
self.__curOptionName = ''
|
|
|
self.__curOptionInfo = None
|
|
|
+ # 到达value节点后,记录value值(一般只用于range() 数值记录,其他值无意义);
|
|
|
+ self.__optionValueText = ""
|
|
|
# 获取一次当前层级信息;
|
|
|
self.getCurOptionInfo()
|
|
|
|
|
@@ -106,6 +102,22 @@ class COptionAction(CBaseLog):
|
|
|
def curOptionInfo(self):
|
|
|
return self.__curOptionInfo
|
|
|
|
|
|
+ @property
|
|
|
+ def optionValueText(self):
|
|
|
+ return self.__optionValueText
|
|
|
+
|
|
|
+ '''
|
|
|
+ 函数:截图;
|
|
|
+ 参数:无
|
|
|
+ 返回:无
|
|
|
+ '''
|
|
|
+ def takePicture(self):
|
|
|
+ img = os.path.join(getSATTmpDIR(), "menutree_runpath.png")
|
|
|
+ COptionAction.__ccard.takePicture(img)
|
|
|
+ if os.path.exists(img):
|
|
|
+ self.error(u"截图失败:%s" % img)
|
|
|
+ return img
|
|
|
+
|
|
|
'''
|
|
|
函数:调用根节点快捷键(中间节点不需要快捷键;);
|
|
|
参数:
|
|
@@ -114,9 +126,9 @@ class COptionAction(CBaseLog):
|
|
|
|
|
|
def callFirstOptionShortCutKey(self):
|
|
|
if 'shortcut_key' in self.__optionPaths['First']:
|
|
|
- COptionAction.__redRat3.sendKey(self.__optionPaths['First']['shortcut_key'])
|
|
|
+ self.sendKey(self.__optionPaths['First']['shortcut_key'])
|
|
|
else:
|
|
|
- COptionAction.__redRat3.sendKey(self.__optionPaths['First']['parent'])
|
|
|
+ self.sendKey(self.__optionPaths['First']['parent'])
|
|
|
self.warn(u"表格没有shortcut_key字段,执行默认的parent按键:%s" % self.__optionPaths['First']['parent'])
|
|
|
|
|
|
'''
|
|
@@ -128,22 +140,10 @@ class COptionAction(CBaseLog):
|
|
|
def callCurOptionBackKey(self, curOptionName):
|
|
|
curOptionInfo = self.__optionExcel.getOptionInfo(curOptionName)
|
|
|
if 'toparent_key' in self.__optionPaths[curOptionInfo['level']]:
|
|
|
- COptionAction.__redRat3.sendKey(self.__optionPaths[curOptionInfo['level']]['toparent_key'])
|
|
|
+ self.sendKey(self.__optionPaths[curOptionInfo['level']]['toparent_key'])
|
|
|
else:
|
|
|
self.error(u"表格没有toparent_key字段,执行默认按键return")
|
|
|
- COptionAction.__redRat3.sendKey('return')
|
|
|
-
|
|
|
- '''
|
|
|
- 函数:打开指定的option(到达option后,执行enter_key进入)。
|
|
|
- 参数:
|
|
|
- 返回:
|
|
|
- 示例:
|
|
|
-
|
|
|
- 测试:。
|
|
|
- '''
|
|
|
-
|
|
|
- def openOption(self, optionName):
|
|
|
- pass
|
|
|
+ self.sendKey('return')
|
|
|
|
|
|
'''
|
|
|
函数:是否在父节点菜单上。一般在执行了callFirstOptionShortCutKey后调用;
|
|
@@ -157,11 +157,11 @@ class COptionAction(CBaseLog):
|
|
|
'''
|
|
|
|
|
|
def isOnFirstOption(self):
|
|
|
- pic = takePicture()
|
|
|
+ pic = self.takePicture()
|
|
|
return self.__optionFocus.findFocusByIcon(pic, self.__optionPaths['First']['option'])[0]
|
|
|
|
|
|
'''
|
|
|
- 函数:是否在目标节点(移动时,每一个目标option,并不仅是终点目标option)上.
|
|
|
+ 函数:是否在当前节点(移动后,判断是否移动到下一目标节点)上.
|
|
|
说明:
|
|
|
每次移动到下一目标节点(option)上时,self.__pos + 1,表示移动到下一层路径。
|
|
|
当self.__pos >= self.__optionPaths.__len__()时,表示到达value表格;
|
|
@@ -173,16 +173,27 @@ class COptionAction(CBaseLog):
|
|
|
测试:。
|
|
|
'''
|
|
|
|
|
|
- def isOnTargetOption(self):
|
|
|
- # 析出参数;
|
|
|
- curLevel = g_level[self.__pos]
|
|
|
- curParent = self.__optionPaths[curLevel]['parent']
|
|
|
- curOption = self.__optionPaths[curLevel]['option']
|
|
|
- curOthers = json.loads(self.__optionPaths[curLevel]['others'])
|
|
|
- firstParent = self.__optionPaths['First']['option']
|
|
|
+ def isOnTargetNode(self):
|
|
|
# 是否在value表中;
|
|
|
isValueSheet = self.isOnValueSheet()
|
|
|
self.info(u"当前层级在:%s" % ("value表" if isValueSheet else "路径表"))
|
|
|
+ # 析出参数;
|
|
|
+ if isValueSheet:
|
|
|
+ curLevel = 'value'
|
|
|
+ curParent = self.__optionPaths[g_level[self.__pos-1]]['parent']
|
|
|
+ curOption = self.__optionValueInfo['option']
|
|
|
+ curOthers = self.__optionValueInfo['others']
|
|
|
+ else:
|
|
|
+ curLevel = g_level[self.__pos]
|
|
|
+ curParent = self.__optionPaths[curLevel]['parent']
|
|
|
+ curOption = self.__optionPaths[curLevel]['option']
|
|
|
+ curOthers = self.__optionPaths[curLevel]['others']
|
|
|
+ self.info("当前[%s]others=[%s]" % (curOption, curOthers))
|
|
|
+ if curOthers.__len__() == 0:
|
|
|
+ curOthers = {}
|
|
|
+ else:
|
|
|
+ curOthers = json.loads(curOthers)
|
|
|
+ firstParent = self.__optionPaths['First']['option']
|
|
|
|
|
|
# 获取文本识别的参数;
|
|
|
ocrConfigList = self.__optionConfig.getOptionOCRConfig(curOption)
|
|
@@ -206,92 +217,210 @@ class COptionAction(CBaseLog):
|
|
|
self.info(u"识别的内容是value表数字内容(range(0,xx)类型)")
|
|
|
isNumberText = True
|
|
|
|
|
|
+ # 清除之前的value值;
|
|
|
+ self.__optionValueText = ""
|
|
|
# 是否为静态焦点识别(动态则为跑马灯);
|
|
|
if curOthers.__len__() and 'marquee' in curOthers:
|
|
|
return self.__getDynamicPicText(curOption, optionTextList, siblingTextList, ocrConfigList,
|
|
|
ocrThreshold, curOthers['marquee'],
|
|
|
isNumberText, isValueSheet)
|
|
|
else:
|
|
|
- return self.__getStaticPicText(takePicture(), curOption, optionTextList, siblingTextList, ocrConfigList,
|
|
|
+ return self.__getStaticPicText(self.takePicture(), curOption, optionTextList, siblingTextList, ocrConfigList,
|
|
|
ocrThreshold,
|
|
|
isNumberText, isValueSheet)
|
|
|
# endif
|
|
|
|
|
|
'''
|
|
|
- 函数:移动到下一兄弟节点;
|
|
|
+ 函数:是否移到目标节点上(在isOnOption后,判断__pos位置是否在__paths最后);
|
|
|
参数:
|
|
|
- 返回:
|
|
|
+ 返回:Boolean.
|
|
|
+
|
|
|
+ '''
|
|
|
+ def isOnTargetOption(self):
|
|
|
+ return True if self.__pos == (self.__optionPaths.__len__() - 1) else False
|
|
|
+
|
|
|
+ '''
|
|
|
+ 函数:当前节点是否在value sheet层级中;
|
|
|
+ 参数:无
|
|
|
+ 返回:Boolean
|
|
|
+ '''
|
|
|
+
|
|
|
+ def isOnValueSheet(self):
|
|
|
+ if self.__optionValue == "": # 该值空,表明不会移动到value sheet中;
|
|
|
+ return False
|
|
|
+ else:
|
|
|
+ return True if self.__pos >= self.__optionPaths.__len__() else False
|
|
|
+
|
|
|
+ '''
|
|
|
+ 函数:移动到下一兄弟节点;
|
|
|
+ 参数:无
|
|
|
+ 返回:无
|
|
|
+
|
|
|
+ 注意:
|
|
|
+ sendKey的等待时间太短,会导致画面未响应,截图时还是截上一状态的,比如0.1秒就很经常出现这问题。
|
|
|
+ 同时,按键等待时间,应该有所区分。
|
|
|
+
|
|
|
+ 如果不截图,可以不考虑sendKey的等待时间.
|
|
|
'''
|
|
|
|
|
|
- def move2NextSiblingOption(self):
|
|
|
+ def move2NextSiblingNode(self):
|
|
|
# 获取当前option信息;
|
|
|
- self.getCurOptionInfo()
|
|
|
- # 析出move key;
|
|
|
- optionMoveKey = self.__curOptionInfo['option_move_key']
|
|
|
- if optionMoveKey.__len__() == 0:
|
|
|
- self.sendKey(self.__curOptionInfo['move_key'][1], 1, 0.1)
|
|
|
+ if self.getCurOptionInfo():
|
|
|
+ # 析出move key;
|
|
|
+ optionMoveKey = self.__curOptionInfo['option_move_key']
|
|
|
+ if optionMoveKey.__len__() == 0:
|
|
|
+ self.sendKey(self.__curOptionInfo['move_key'][1], 1, 1)
|
|
|
+ else:
|
|
|
+ self.sendKey(optionMoveKey[1], 1, 1)
|
|
|
else:
|
|
|
- self.sendKey(optionMoveKey[1], 1, 0.1)
|
|
|
+ valueMoveKey = self.__optionValueInfo['move_key']
|
|
|
+ self.sendKey(valueMoveKey[1], 1, 1)
|
|
|
|
|
|
'''
|
|
|
函数:移动到上一兄弟节点
|
|
|
- 参数:
|
|
|
- 返回:
|
|
|
+ 参数:无
|
|
|
+ 返回:无
|
|
|
+
|
|
|
+ 注意:
|
|
|
+ sendKey的等待时间太短,会导致画面未响应,截图时还是截上一状态的,比如0.1秒就很经常出现这问题。
|
|
|
+ 同时,按键等待时间,应该有所区分。
|
|
|
+
|
|
|
+ 如果不截图,可以不考虑sendKey的等待时间.
|
|
|
'''
|
|
|
|
|
|
- def move2PrevSiblingOption(self):
|
|
|
+ def move2PrevSiblingNode(self):
|
|
|
# 获取当前option信息;
|
|
|
- self.getCurOptionInfo()
|
|
|
- # 析出move key;
|
|
|
- optionMoveKey = self.__curOptionInfo['option_move_key']
|
|
|
- if optionMoveKey.__len__() == 0:
|
|
|
- self.sendKey(self.__curOptionInfo['move_key'][0], 1, 0.1)
|
|
|
+ if self.getCurOptionInfo():
|
|
|
+ # 析出move key;
|
|
|
+ optionMoveKey = self.__curOptionInfo['option_move_key']
|
|
|
+ if optionMoveKey.__len__() == 0:
|
|
|
+ self.sendKey(self.__curOptionInfo['move_key'][0], 1, 1)
|
|
|
+ else:
|
|
|
+ self.sendKey(optionMoveKey[0], 1, 1)
|
|
|
else:
|
|
|
- self.sendKey(optionMoveKey[0], 1, 0.1)
|
|
|
+ valueMoveKey = self.__optionValueInfo['move_key']
|
|
|
+ self.sendKey(valueMoveKey[0], 1, 1)
|
|
|
|
|
|
'''
|
|
|
函数:返回到父节点
|
|
|
- 参数:
|
|
|
- 返回:
|
|
|
+ 参数:无
|
|
|
+ 返回:无
|
|
|
+
|
|
|
+ 注意:
|
|
|
+ sendKey的等待时间太短,会导致画面未响应,截图时还是截上一状态的,比如0.1秒就很经常出现这问题。
|
|
|
+ 同时,按键等待时间,应该有所区分。
|
|
|
+
|
|
|
+ 如果不截图,可以不考虑sendKey的等待时间.
|
|
|
'''
|
|
|
|
|
|
- def back2ParentOption(self):
|
|
|
+ def back2ParentNode(self):
|
|
|
# 获取当前option信息;
|
|
|
- self.getCurOptionInfo()
|
|
|
- # 析出move key;
|
|
|
- backKey = self.__curOptionInfo['back_key']
|
|
|
+ if self.getCurOptionInfo():
|
|
|
+ backKey = self.__curOptionInfo['back_key']
|
|
|
+ else:
|
|
|
+ backKey = self.__optionValueInfo['back_key']
|
|
|
+
|
|
|
if backKey.__len__() == 0:
|
|
|
- self.sendKey('back', 1, 0.1)
|
|
|
+ self.sendKey('return', 1, 1)
|
|
|
else:
|
|
|
- self.sendKey(backKey, 1, 0.1)
|
|
|
+ self.sendKey(backKey, 1, 1)
|
|
|
+ # 返回,自减;
|
|
|
+ self.__pos -= 1
|
|
|
|
|
|
'''
|
|
|
- 函数:进入当前节点;
|
|
|
- 参数:
|
|
|
- 返回:
|
|
|
+ 函数:进入当前节点,只对路径节点有效,value节点不处理;
|
|
|
+ 参数:无
|
|
|
+ 返回:无
|
|
|
'''
|
|
|
|
|
|
- def enterOption(self):
|
|
|
+ def enterNode(self):
|
|
|
# 获取当前option信息;
|
|
|
- self.getCurOptionInfo()
|
|
|
- # 析出enter key;
|
|
|
- optionEnterKey = self.__curOptionInfo['option_enter_key']
|
|
|
- if optionEnterKey.__len__() == 0:
|
|
|
- self.sendKey(self.__curOptionInfo['enter_key'], 1, 0.)
|
|
|
+ if self.getCurOptionInfo():
|
|
|
+ # 是否有等待时间
|
|
|
+ waitTime = self.__optionConfig.getParentWaitTime(self.__curOptionInfo['parent'])
|
|
|
+ # 析出enter key;
|
|
|
+ optionEnterKey = self.__curOptionInfo['option_enter_key']
|
|
|
+ if optionEnterKey.__len__() == 0:
|
|
|
+ self.sendKey(self.__curOptionInfo['enter_key'], 1, waitTime)
|
|
|
+ else:
|
|
|
+ self.sendKey(optionEnterKey, 1, waitTime)
|
|
|
+ # 进入下层,自增
|
|
|
+ self.__pos += 1
|
|
|
else:
|
|
|
- self.sendKey(optionEnterKey, 1, 0.1)
|
|
|
+ self.info(u"节点已在value上,无法再进入")
|
|
|
|
|
|
'''
|
|
|
- 函数:设置当前option的值;
|
|
|
+ 函数:设置当前节点位置;
|
|
|
参数:
|
|
|
- 返回:
|
|
|
+ pos: 外部节点位置值。
|
|
|
+ 返回:无
|
|
|
+
|
|
|
+ 注意:此函数用于外部创建两个【路径具体子集关系】的COptionAction对象,才可以使用此函数。
|
|
|
+ 假设, a对象路径{p,p1,p2,p3,p4, v1},b = {p, p1, p2, p3, p4, p5, p6, v2}, c = {p, p2, p5, p6, v3}
|
|
|
+ 其中, v表示value值,不属于路径。那么,a和b具有子集关系, a与c或b与c都不具有子集关系。
|
|
|
+
|
|
|
+ a移动到p4上,完成了v1设置后,a.back2ParentNode()后,此时如果要操作b并设置v2,就要b.SetCurPos(a.pos).
|
|
|
'''
|
|
|
+ def setCurPos(self, pos):
|
|
|
+ if pos < 0 or pos > self.__optionPaths.__len__():
|
|
|
+ self.error(u"pos值[%d]超出路径范围:[0-%d]" % (pos, self.__optionPaths.__len__()))
|
|
|
+ return
|
|
|
+ self.__pos = pos
|
|
|
|
|
|
- def setCurOptionValue(self, value):
|
|
|
- # 获取当前option信息;
|
|
|
- self.getCurOptionInfo()
|
|
|
- # 获取当前option的value表信息;
|
|
|
- curOptionValueInfo = self.__optionExcel.getOptionValueInfo(self.__curOptionName, value)
|
|
|
+ '''
|
|
|
+ 函数:设置目标option的值, 只设置数值型value和输入型value(选择型value不需要此步骤).
|
|
|
+ 参数:
|
|
|
+ 返回:
|
|
|
+
|
|
|
+ 注意:此函数必须是已聚焦在目标value节点上,否则无效。
|
|
|
+ 重要:
|
|
|
+ 在此函数enter后,UI是否返回到上一层父节点上,还是停留在本层节点不返回。
|
|
|
+ 建议在excel中配置这个关键信息,以便此函数可以正确更改self.__pos的值。
|
|
|
+ '''
|
|
|
+
|
|
|
+ def setOptionValue(self):
|
|
|
+ self.info(u"【在此函数enter后,UI是否返回到上一层父节点上,还是停留在本层节点不返回。\
|
|
|
+ 建议在excel中配置这个关键信息,以便此函数可以正确更改self.__pos的值。】")
|
|
|
+ if self.__optionValue.__len__() == 0:
|
|
|
+ self.error(u"[%s]的值为空,没有设置的值" % self.__optionName)
|
|
|
+ return
|
|
|
+
|
|
|
+ enterKey = self.__optionValueInfo['enter_key']
|
|
|
+ moveKey = self.__optionValueInfo['move_key']
|
|
|
+ valueText = self.__optionValueInfo['value_for_ocr']
|
|
|
+ others = self.__optionValueInfo['others']
|
|
|
+ if others.__len__():
|
|
|
+ others = json.loads(others)
|
|
|
+ else:
|
|
|
+ others = {}
|
|
|
+ # 是否有按键延时值;
|
|
|
+ duration = float(others['duration']) if "duration" in others else 0.1
|
|
|
+
|
|
|
+ # 是否为数字文本(特指:range(0, 100));
|
|
|
+ isNumberText = self.isNumberText(valueText)
|
|
|
+ # 数值型value;
|
|
|
+ if isNumberText:
|
|
|
+ if moveKey[0] == 'input':
|
|
|
+ # 将数值转成字符;
|
|
|
+ optionValue = self.__optionValue
|
|
|
+ if type(optionValue) == int or type(optionValue) == float:
|
|
|
+ optionValue = str(self.__optionValue)
|
|
|
+ # 再将字符转成list;
|
|
|
+ chList = list(optionValue)
|
|
|
+ self.sendKey(chList, 1, duration)
|
|
|
+ else:
|
|
|
+ # 相差值;
|
|
|
+ num = int(self.__optionValue) - int(self.__optionValueText)
|
|
|
+ # 正->往右或下,负->往左或上;
|
|
|
+ self.sendKey(moveKey[1] if num > 0 else moveKey[0], abs(num), duration)
|
|
|
+ elif moveKey[0] == 'input':
|
|
|
+ # 将字符转成list;
|
|
|
+ chList = list(self.__optionValue)
|
|
|
+ self.sendKey(chList, 1, duration)
|
|
|
+
|
|
|
+ # 最后,如果有进入键执行;
|
|
|
+ if enterKey != 'default':
|
|
|
+ self.sendKey(enterKey, 1, 0.1)
|
|
|
|
|
|
'''
|
|
|
函数:
|
|
@@ -300,6 +429,10 @@ class COptionAction(CBaseLog):
|
|
|
'''
|
|
|
|
|
|
def getCurOptionInfo(self):
|
|
|
+ if self.__optionPaths.__len__() == 0:
|
|
|
+ self.error(u"paths路径空")
|
|
|
+ return False
|
|
|
+
|
|
|
if self.__pos >= self.__optionPaths.__len__():
|
|
|
self.warn(u"已到达value节点,无法获取路径信息")
|
|
|
return False
|
|
@@ -307,21 +440,29 @@ class COptionAction(CBaseLog):
|
|
|
# 只有第一次或层级移动了才需要更新;
|
|
|
if self.__curOptionInfo is None or self.__pos != self.__curOptionInfo['layers']:
|
|
|
self.__curOptionName = self.__optionPaths[g_level[self.__pos]]['option']
|
|
|
- self.__curOptionInfo = self.__optionExcel.getOptionInfo(self.__curOptionName, self.__optionPaths)
|
|
|
+ outResult, outData = self.__optionExcel.getOptionInfo(self.__curOptionName, self.__optionPaths)
|
|
|
+ if outResult is False:
|
|
|
+ return False
|
|
|
+ self.__curOptionInfo = outData
|
|
|
|
|
|
return True
|
|
|
|
|
|
'''
|
|
|
- 函数:当前节点是否在value sheet层级中;
|
|
|
+ 函数:检测路径是否有效;
|
|
|
参数:
|
|
|
- 返回:
|
|
|
+ 返回:Boolean
|
|
|
'''
|
|
|
+ def checkRunOptionPath(self):
|
|
|
+ outData = self.__optionExcel.checkOptionPaths(self.__optionPaths)
|
|
|
+ if str(outData[1]) == 'NoExit':
|
|
|
+ self.error(u"表格中不存在到达Option:[%s]的路径,在表格中排查到达该Option路径" % self.__optionName)
|
|
|
+ return False
|
|
|
|
|
|
- def isOnValueSheet(self):
|
|
|
- if self.__optionValue == "": # 该值空,表明不会移动到value sheet中;
|
|
|
+ if str(outData[1]) == 'Fail':
|
|
|
+ self.error(u"表格中到达Option:[%s]的路径出现数据断层找不到First层级,在表格中排查到达该Option路径" % self.__optionName)
|
|
|
return False
|
|
|
- else:
|
|
|
- return True if self.__pos >= self.__optionPaths.__len__() else False
|
|
|
+
|
|
|
+ return True
|
|
|
|
|
|
'''
|
|
|
函数:
|
|
@@ -340,12 +481,11 @@ class COptionAction(CBaseLog):
|
|
|
|
|
|
return isNumberText
|
|
|
|
|
|
-
|
|
|
'''
|
|
|
函数:获取静态图片文本内容
|
|
|
参数:
|
|
|
注意:
|
|
|
- 返回:
|
|
|
+ 返回:Boolean、文本识别内容
|
|
|
|
|
|
测试:。
|
|
|
'''
|
|
@@ -366,7 +506,7 @@ class COptionAction(CBaseLog):
|
|
|
textBox = self.__optionFocus.getFocusTextBox(optionName, focusBox, isValueSheet)
|
|
|
# 配置文本图片路径,保存文本区域截图;
|
|
|
text_pic = os.path.join(getSATTmpDIR(), "meuttree_area_text.png")
|
|
|
- self.__imgCMP.saveCropImage(pic, text_pic, textBox)
|
|
|
+ self.__imgCMP.saveCropPic(pic, text_pic, textBox)
|
|
|
if not os.path.exists(text_pic):
|
|
|
self.error(u"%s截取文本图片失败:%s" % (optionName, text_pic))
|
|
|
return False, None
|
|
@@ -383,9 +523,11 @@ class COptionAction(CBaseLog):
|
|
|
if curFocusText == "ERR<Exp>" or curFocusText.__len__() == 0:
|
|
|
continue
|
|
|
|
|
|
+ # 转成小写;
|
|
|
+ curFocusText = curFocusText.lower()
|
|
|
self.info("[%s]当前识别出的文本=%s" % (optionName, curFocusText))
|
|
|
|
|
|
- # 是否取数字文本;
|
|
|
+ # 是否取数字文本(肯定在value节点上);
|
|
|
if isNumberText is True:
|
|
|
# 特殊情况处理:某些情况下,会将包含数字以外的区域一起识别;
|
|
|
curFocusText = curFocusText.strip('>')
|
|
@@ -397,8 +539,10 @@ class COptionAction(CBaseLog):
|
|
|
continue
|
|
|
|
|
|
try:
|
|
|
- numberText = numberTextList[numberTextList.__len__() - 1]
|
|
|
- return True, float(numberText)
|
|
|
+ numberText = float(numberTextList[numberTextList.__len__() - 1])
|
|
|
+ # 记录value值;
|
|
|
+ self.__optionValueText = numberText
|
|
|
+ return True, numberText
|
|
|
except Exception:
|
|
|
continue
|
|
|
else:
|
|
@@ -434,17 +578,16 @@ class COptionAction(CBaseLog):
|
|
|
# 默认返回;
|
|
|
return False, 0 if isNumberText else ""
|
|
|
|
|
|
- # 获取动态图片文本内容;
|
|
|
'''
|
|
|
- 函数:
|
|
|
+ 函数:获取动态图片文本内容
|
|
|
参数:
|
|
|
- 返回:
|
|
|
+ 返回:返回:Boolean、文本识别内容
|
|
|
'''
|
|
|
|
|
|
def __getDynamicPicText(self, optionName, optionTextList, siblingTextList, ocrConfigList, ocrThreshold, marqueeDict,
|
|
|
isNumberText, isValueSheet):
|
|
|
# 判断图片是否动态:截图两次,判断两次文本内容是否相同;
|
|
|
- firstRetsult, firstText = self.__getStaticPicText(takePicture(), optionName, optionTextList,
|
|
|
+ firstRetsult, firstText = self.__getStaticPicText(self.takePicture(), optionName, optionTextList,
|
|
|
siblingTextList, ocrConfigList,
|
|
|
ocrThreshold, isNumberText, isValueSheet)
|
|
|
if firstRetsult is False:
|
|
@@ -454,7 +597,7 @@ class COptionAction(CBaseLog):
|
|
|
# 发送鲜活键, 保证界面鲜活;
|
|
|
COptionAction.__sendAliveKey(marqueeDict['alive_key'])
|
|
|
# 第二次截图;
|
|
|
- secondRetsult, secondText = self.__getStaticPicText(takePicture(), optionName, optionTextList,
|
|
|
+ secondRetsult, secondText = self.__getStaticPicText(self.takePicture(), optionName, optionTextList,
|
|
|
siblingTextList, ocrConfigList,
|
|
|
ocrThreshold, isNumberText, isValueSheet)
|
|
|
if secondRetsult is False:
|
|
@@ -478,7 +621,7 @@ class COptionAction(CBaseLog):
|
|
|
picList = []
|
|
|
# 如果有多项同级option都是跑马灯, 要成功识别文本需要间隔截图5次(大概会成功截图到最全的文本);
|
|
|
for i in range(0, 5):
|
|
|
- picList.append(takePicture())
|
|
|
+ picList.append(self.takePicture())
|
|
|
# 间隔多久截图;
|
|
|
time.sleep(marqueeDict['sleep_time'])
|
|
|
# 发送鲜活键;
|
|
@@ -538,9 +681,8 @@ class COptionAction(CBaseLog):
|
|
|
# endfor
|
|
|
return OptionInfoDict
|
|
|
|
|
|
- # 找到两个字符串左边或者右边相同的部分
|
|
|
'''
|
|
|
- 函数:
|
|
|
+ 函数:找到两个字符串左边或者右边相同的部分
|
|
|
参数:
|
|
|
返回:
|
|
|
'''
|
|
@@ -567,9 +709,8 @@ class COptionAction(CBaseLog):
|
|
|
index += 1
|
|
|
return str1[:index]
|
|
|
|
|
|
- # 去掉字符串数组中每个字符串 左边或右边相同的部分
|
|
|
'''
|
|
|
- 函数:
|
|
|
+ 函数:去掉字符串数组中每个字符串 左边或右边相同的部分
|
|
|
参数:
|
|
|
返回:
|
|
|
'''
|
|
@@ -611,15 +752,20 @@ class COptionAction(CBaseLog):
|
|
|
返回:无
|
|
|
'''
|
|
|
|
|
|
- def sendKey(self, key, count, wait):
|
|
|
+ def sendKey(self, key, count=1, wait=1):
|
|
|
if key is not None and key.__len__() > 0:
|
|
|
- if type(key) == str:
|
|
|
- COptionAction.__redRat3.sendKey(key, count, wait)
|
|
|
- elif type(key) == list:
|
|
|
+ if type(key) == list:
|
|
|
for k in key:
|
|
|
+ # 清除前后空格;
|
|
|
+ k = k.lstrip()
|
|
|
+ k = k.rstrip()
|
|
|
COptionAction.__redRat3.sendKey(k, 1, wait)
|
|
|
else:
|
|
|
- self.error(u"error:无效按键内容=%s" % key)
|
|
|
+ key = str(key)
|
|
|
+ # 清除前后空格;
|
|
|
+ key = key.lstrip()
|
|
|
+ key = key.rstrip()
|
|
|
+ COptionAction.__redRat3.sendKey(key, count, wait)
|
|
|
else:
|
|
|
self.error(u"error:按键内容空")
|
|
|
|