| 
					
				 | 
			
			
				@@ -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:按键内容空") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |