浏览代码

同步sdk.

sat23 4 年之前
父节点
当前提交
dc4e7f917b

+ 86 - 29
ssat_sdk/UATree/UAT_focusCommand.py

@@ -8,6 +8,7 @@ from UIParamUtil import UIParamUtil
 from ssat_sdk.python_uiautomator import PyUIAutomator,DirectionManageAndroid,FocusManageAndroid
 import math
 import traceback
+import copy
 
 ERROR = True
 INFO = True
@@ -139,6 +140,7 @@ class FocusCommand():
                 break
             time.sleep(0.1)
             destUIObject = self.getOptionUIObj(option, layoutUIObjParam)
+
             if destUIObject and destUIObject.exists():
                 info(self.cls,"getNoFocusedObj","找到目标option %s"%option[UATTree.TAB_NAME],INFO)
                 return True
@@ -166,6 +168,14 @@ class FocusCommand():
         focusCount = 0  # 当目标和聚焦点在一个页面同时存在时,从当前聚焦点到目标的移动次数
         focusedBoundsPre = {u'top': 0, u'left': 0, u'right': 0, u'bottom': 0}  # 上一轮聚焦点的坐标
         destBoundsPre = {u'top': 0, u'left': 0, u'right': 0, u'bottom': 0}  # 上一轮目标的坐标
+        hb_keyDict = parent[UATTree.TAB_OTHERS][UATTree.Key_HeartBeat]
+        # print "##########", hb_keyDict
+        # print "##########", parent[UATTree.TAB_OTHERS]
+        if hb_keyDict != {}:
+            # 执行心跳按键
+            info(self.cls, "toDestObj", "executeHeartBeatKey:%s"%hb_keyDict, INFO)
+            self.fm.executeHeartBeatKey(hb_keyDict)
+
         while (True):
             if count >= Max_Try and directIndex >= findDirections.__len__()-1:
                 break
@@ -213,7 +223,7 @@ class FocusCommand():
                             focusCount += 1 # 如果focusCount=0,则将当前聚焦点和目标坐标赋值给前一次
                             focusedBoundsPre = focusedBounds
                             destBoundsPre = destBounds
-                            info(self.cls,"toDestObj.focusCount.countStart")
+                            info(self.cls,"toDestObj.focusCount.countStart", "focusCount:%s"%focusCount,INFO)
                             continue
                     else:
                         error(self.cls, "toDestObj", "未找到目标焦点!!!", ERROR)
@@ -327,6 +337,12 @@ class FocusCommand():
     def checkOptionExist(self, option, parent):
         # print "checkOptionExist,option:",option
         moveKey = parent[UATTree.TAB_MOVE_KEY]
+        hb_keyDict = parent[UATTree.TAB_OTHERS][UATTree.Key_HeartBeat]
+        if hb_keyDict != {}:
+            # 执行心跳按键
+            info(self.cls, "checkOptionExist", "executeHeartBeatKey:%s"%hb_keyDict, INFO)
+            self.fm.executeHeartBeatKey(hb_keyDict)
+
         optionName = option['name']
         print "checkOptionExist,moveKey:", moveKey
         Max_Try = moveKey[UATTree.Max_Try]
@@ -340,32 +356,69 @@ class FocusCommand():
         Reversecount = 0
         lastObj = ""
 
-        while (True):
-            if count >= Max_Try and Reversecount >= Reverse_Max_Try:
-                break
-            # 如果找到目标直接返回
-            debug(self.cls,"checkOptionExist","optionView:%s"%option,DEBUG)
-            opUIParam = UIParamUtil.setObjParam(option["optionView"])
-            ###
-            try:
-                opOBJ = self.pyU.getUiObject2(opUIParam)
-                opOBJInfo = opOBJ.info
-                debug(self.cls,"checkOptionExist","opOBJInfo: %s"%opOBJInfo,DEBUG)
-                break
-            except Exception,e:
-                opOBJ = None
-            if count < Max_Try:
-                flag = 1
-                count += 1
-                print "now count:", count
-            else:
-                flag = 0
-                Reversecount += 1
-                print "now Reversecount:", Reversecount
-            self.runnerCommand.executeMoveKey(moveKey, flag)
-        if opOBJ is not None and opOBJ.exists():
-            info(self.cls, "checkOptionExist", "当前页面已找到option: %s" % optionName, INFO)
-            return True
+        opUIParam = UIParamUtil.setObjParam(option["optionView"])
+
+        # 为了兼容多文本,逐个遍历文本,针对text属性做特殊处理
+        if "text" in opUIParam and type(opUIParam['text']) == type([]):
+            for text in opUIParam['text']:
+                uiParam = copy.deepcopy(opUIParam)
+                uiParam['text'] = text
+                while (True):
+                    if count >= Max_Try and Reversecount >= Reverse_Max_Try:
+                        break
+                    # 如果找到目标直接返回
+                    debug(self.cls,"checkOptionExist","optionView:%s"%option,DEBUG)
+                    ###
+                    try:
+                        opOBJ = self.pyU.getUiObject2(uiParam)
+                        opOBJInfo = opOBJ.info
+                        debug(self.cls,"checkOptionExist","opOBJInfo: %s"%opOBJInfo,DEBUG)
+                        break
+                    except Exception,e:
+                        opOBJ = None
+                    if count < Max_Try:
+                        flag = 1
+                        count += 1
+                        print "now count:", count
+                    else:
+                        flag = 0
+                        Reversecount += 1
+                        print "now Reversecount:", Reversecount
+                    self.runnerCommand.executeMoveKey(moveKey, flag)
+                # print "###",type(opOBJ),opOBJ
+                if opOBJ is not None:
+                    if opOBJ.exists:
+                        info(self.cls, "checkOptionExist", "当前页面已找到option: %s" % optionName, INFO)
+                        return True
+        else:
+            while (True):
+                if count >= Max_Try and Reversecount >= Reverse_Max_Try:
+                    break
+                # 如果找到目标直接返回
+                debug(self.cls, "checkOptionExist", "optionView:%s" % option, DEBUG)
+                ###
+                try:
+                    opOBJ = self.pyU.getUiObject2(opUIParam)
+                    opOBJInfo = opOBJ.info
+                    debug(self.cls, "checkOptionExist", "opOBJInfo: %s" % opOBJInfo, DEBUG)
+                    break
+                except Exception, e:
+                    opOBJ = None
+                if count < Max_Try:
+                    flag = 1
+                    count += 1
+                    print "now count:", count
+                else:
+                    flag = 0
+                    Reversecount += 1
+                    print "now Reversecount:", Reversecount
+                self.runnerCommand.executeMoveKey(moveKey, flag)
+            # print "###", type(opOBJ), opOBJ
+            if opOBJ is not None:
+                if opOBJ.exists:
+                    info(self.cls, "checkOptionExist", "当前页面已找到option: %s" % optionName, INFO)
+                    return True
+
         info(self.cls, "checkOptionExist", "注意!!!当前页面未找到option: %s" % optionName, INFO)
         return False
 
@@ -475,6 +528,7 @@ class FocusCommand():
         destUIParam = UIParamUtil.setObjParam(option[UATTree.TAB_OPTION_VIEW])
         debug(self.cls, "getOptionUIObj", "destUIParam:" + str(destUIParam), DEBUG)
         destUITextExist = False
+        destUIObject = None
         try:
             destUIText = destUIParam['text']
             destUITextExist = True
@@ -564,6 +618,7 @@ class FocusCommand():
                 return -3
             else:
                 debug(self.cls, "checkParentChoose", "已识别出Parent:%s的UIView组件" % parent[UATTree.TAB_NAME], DEBUG)
+                # debug(self.cls, "checkParentChoose", "UIView组件内容:%s" % uiView, DEBUG)
             # 判断Layout是否存在
             layoutUIObj = self.pyU.getUiObject2(layoutUIParam)
             if layoutUIObj is None or layoutUIObj.exists() is False:
@@ -646,10 +701,12 @@ class FocusCommand():
             return True
         uiviewObjParam = UIParamUtil.setObjParam(uiView)
         uiViewObj = self.pyU.getUiObject2(uiviewObjParam)
-        if uiViewObj is None or uiViewObj.exists is False:
+        if uiViewObj is None:
             return False
-        else:
+        elif uiViewObj.exists:
             return True
+        else:
+            return False
 
 
     def moveToCheckedRedioButton(self, fsParam, findDirection="down", keyType=UATTree.Key_Event, maxTry=20):

+ 3 - 2
ssat_sdk/UATree/UAT_menu.py

@@ -194,8 +194,9 @@ if __name__ == "__main__":
     # setResult = uatMenu.setOptionValue("hdmi_picture_mode", "hdmi_movie")
     # print "setResult:", setResult
 
-    print uatMenu.getOptionValue("hdmi_picture_mode")
-
+    # print uatMenu.getOptionValue("hdmi_picture_mode")
+    print uatMenu.checkOptionExist("sl_hdmi1")
+    print uatMenu.getOptionInfoView("sl_hdmi1")
     # uatMenu.openOption("hdmi_picture_mode")
     # fsParam = {"focused":"true"}
     # print uatMenu.uatRunner.runnerCmd.focusCmd.moveToCheckedRedioButton(fsParam,findDirection="up",keyType="ir")

+ 12 - 9
ssat_sdk/UATree/UAT_tree.py

@@ -119,10 +119,10 @@ class UATTree():
     def parseMulParam(self, keyList, params):
         paramDict = {}
         for key in keyList:
-            if key == 'text':
-                value = self.parseMulText(params)
-            else:
-                value = self.parseParam(key, params)
+            # if key == 'text':
+            #     value = self.parseMulText(params)
+            # else:
+            value = self.parseParam(key, params)
             paramDict[key] = value
         return paramDict
 
@@ -254,10 +254,10 @@ class UATTree():
             i2 = str1.find((char[1] + char[1]))
             if i1 == -1 or i2 == -1:
                 return ""
-            str2 = str1[i1:i2 + 1]  # 只去掉外括号
-            strList = strToList(str2, char[1] + "," + char[0])
-            for strs in strList:
-                text.append(strs.strip(char[0]).strip(char[1]))
+            str2 = str1[i1 + 1:i2]  # 只去掉外括号
+            strList = strToList(str2, ",")
+            # for strs in strList:
+            #     text.append(strs.strip(char[0]).strip(char[1]))
         return text
 		
     View_sambounds = "sambounds" #采样时的样本坐标,用于和select-focus、focusView的坐标做相对比较,计算相对位置,用于确定是否被选中。
@@ -270,6 +270,9 @@ class UATTree():
         keyList = [self.View_ID, self.View_Text, self.View_Desc, self.View_Bounds, self.View_Index, self.View_Class
                    ,self.View_sambounds]
         paramDict = self.parseMulParam(keyList, viewStr)
+        #多文本中以“,”为分隔符进行数据解析,分割为有多个独文本的元组
+        if paramDict[self.View_Text].find(",") != -1:
+            paramDict[self.View_Text] = strToList(paramDict[self.View_Text], ",")
         paramDict[self.View_Bounds] = self.strToBounds(paramDict[self.View_Bounds])
         paramDict[self.View_sambounds] = self.strToBounds(paramDict[self.View_sambounds])
         return paramDict
@@ -632,7 +635,7 @@ class UATTree():
                     dict2 = dict1["option"][option]
                     print level, "::option ", dict2
 
-    Key_HeartBeat = "heartbeat_key"
+    Key_HeartBeat = "heart_beat"
     def parseOthers(self, othersStr):
         othersDict = {}
         othersDict[self.Key_HeartBeat] = self.parseParam(self.Key_HeartBeat, othersStr, char="{}")

+ 2 - 2
ssat_sdk/python_uiautomator.py

@@ -2352,11 +2352,11 @@ class FocusManageAndroid():
         try:
             eventList = hb_keyDict["event"]
             irList = hb_keyDict["ir"]
-            if eventList != "":
+            if eventList.__len__() > 0:
                 LoggingUtil.printLog("Executing heartbeat_key by EventKey!!!KeyList:%s" % eventList)
                 for key in eventList:
                     self.u.pressKeyTimes(key)
-            elif irList != "":
+            elif irList.__len__() > 0:
                 LoggingUtil.printLog("Executing heartbeat_key by irKey!!!KeyList:%s" % irList)
                 for key in irList:
                     self.remote.sendKey(key)

+ 115 - 10
ssat_sdk/somking/SomkePretreatment.py

@@ -30,8 +30,7 @@ class SomkePretreatment:
         self.taskInfo = {}
         self.ota_local_name = 'usb_ota.zip'
         # 上传升级包的位置;
-        # self.updateZip = ' /storage/0000-0000/usb_ota.zip'
-        self.updateZip = ' /storage/905A-30AB/usb_ota.zip'
+        self.updateZip = ' /storage/905A-30AB/usb_ota.zip' # 弃用:改由usb切换器切换;
         # ota路径;
         self.ota_server_path = "/home/RT2841_2851_dailybuild/DailyBuild_RT2841_%s/" % str(time.strftime("%m%d"))
         # ota名称;
@@ -63,7 +62,8 @@ class SomkePretreatment:
             except Exception, e:
                 print u"解析json失败:%s" % sys.argv[1]
 
-    def __cmdExecute(self, cmd):
+    # 不使用重定向;
+    def __cmdExecute2(self, cmd):
         # 定义文件名称;
         file_name = str(time.time())
         # 输出到文件中;
@@ -81,6 +81,17 @@ class SomkePretreatment:
         print u"cmd结果:", data
         return data
 
+    def __cmdExecute(self, cmd):
+        print u'执行cmd:', cmd
+        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+        # 等待完成;
+        stdout,stderr = proc.communicate()
+        if proc.returncode == 0:
+            print u'执行成功'
+        # 返回执行结果;
+        # print u"结果:\033[32m%s\033[0m" % stdout
+        return stdout
+
     def __adbConnect(self):
         try:
             # 启用adb的root权限;
@@ -194,17 +205,76 @@ class SomkePretreatment:
         # 默认返回False
         return False 
 
-
+    # 获取Windows下的USB路径(多个时默认使用第一个识别的)
     def getWindowsUsbPath(self):
         disks = self.__cmdExecute("wmic logicaldisk get deviceid, description")
-        print chardet.detect(disks)
-        disks = disks.decode("utf-16").encode('utf-8').decode('utf-8-sig')
+        charsInfo = chardet.detect(disks)
+        print u'当前编码信息=',charsInfo
+        if charsInfo['encoding'] == "GB2312":
+            disks = disks.decode("GB2312").encode('utf-8')
+        elif charsInfo['encoding'] == "UTF-16":
+            disks = disks.decode("utf-16").encode('utf-8').decode('utf-8-sig')
         disks = disks.split('\r\n')
         for disk in disks:
             if u'可移动磁盘' in disk:
                 return re.search(r'\w:', disk).group()
         return None
 
+    # 适用于Android 9以上
+    def getTVUsbPath(self):
+        # 获取storage下的目录;
+        sdcards = self.__cmdExecute('adb shell ls storage')
+        if sdcards.__len__() == 0:
+            return None
+        # 按换行符分隔;
+        sdcards = sdcards.split('\r\n')
+        # 要过滤的目录;
+        sdcards = list(set(sdcards) ^ set(['emulated','self','']))
+        if sdcards.__len__() == 0:
+            return None
+        # 返回第一个元素;
+        return sdcards[0]
+
+    def __AdbPush(self, file, tvdir):
+        data = self.__cmdExecute('adb push %s %s\n'%(file, tvdir))
+        str = '%s: 1 file pushed.'%file
+        if data.find(str) < 0 or data.find("[100%%] %s" % tvdir) < 0:
+            return False
+        print u'push %s 成功'%file
+        return True
+
+    def AdbPush(self, file, tvdir, trys=3):
+        if trys <= 0:
+            trys = 1
+        
+        while trys > 0:
+            trys = trys - 1
+            if self.__AdbPush(file, tvdir) is True:
+                return True
+        return False
+    
+    def __AdbInstallAPK(self, file):
+        data = self.__cmdExecute('adb install -r %s'%file)
+        if data != "Success\r\n":
+            return False
+        return True
+    
+    def AdbInstallAPK(self, file, trys=3):
+        if trys <= 0:
+            trys = 1
+        
+        while trys > 0:
+            trys = trys - 1
+            if self.__AdbInstallAPK(file) is True:
+                return True
+        return False
+
+    # adb shell pm list packages | findstr /x "<package name>"
+    def IsAPKInstalled(self, apk_name):
+        apk_name = 'package:%s'%apk_name
+        data = self.__cmdExecute('adb shell pm list packages | findstr /x "%s"'%apk_name)
+        return True if data.lower() == apk_name.lower() else False
+    
     '''
     函数:获取任务信息;
     参数:
@@ -227,8 +297,8 @@ class SomkePretreatment:
             return
         # 初始化ssh2;
         self.ssh2.init_ssh2(self.taskInfo['hostUser'], self.taskInfo['hostPwd'], self.taskInfo['host'], self.taskInfo['hostPort'])
-        self.redhat3.sendKey('home')
-        self.redhat3.sendKey('home')
+        self.redhat3.sendKey('home',2)
+        self.redhat3.sendKey('home',2)
         self.__adbConnect()
 
     '''
@@ -360,6 +430,7 @@ class SomkePretreatment:
         print u"installOTAImage start"
         try:
             self.redhat3.sendKey("home")
+            time.sleep(1.5)
             cmd = 'adb -s ' + self.taskInfo['deviceSerial'] + self.installCmd
             proc = self.__cmdExecute(cmd)
             print proc
@@ -400,7 +471,41 @@ class SomkePretreatment:
         # 等待10;
         print "等待30秒,让TV完全启动。"
         time.sleep(30)
-        os.system(r'D:\SAT\tools\atx-init\atx-init.bat')
+        # os.system(r'D:\SAT\tools\atx-init\atx-init.bat')
+        # push 文件;
+        if self.AdbPush(r'D:\SAT\tools\atx-init\atx-agent', '/data/local/tmp') is False:
+            return False
+        if self.AdbPush(r'D:\SAT\tools\atx-init\minicap', '/data/local/tmp') is False:
+            return False
+        if self.AdbPush(r'D:\SAT\tools\atx-init\minicap.so', '/data/local/tmp') is False:
+            return False
+        if self.AdbPush(r'D:\SAT\tools\atx-init\minitouch', '/data/local/tmp') is False:
+            return False
+
+        self.__cmdExecute('adb shell chmod 755 /data/local/tmp/atx-agent')
+        self.__cmdExecute('adb shell chmod 755 /data/local/tmp/minicap')
+        self.__cmdExecute('adb shell chmod 755 /data/local/tmp/minicap.so')
+        self.__cmdExecute('adb shell chmod 755 /data/local/tmp/minitouch')
+
+        if self.IsAPKInstalled('com.github.uiautomator') is True:
+            print u'卸载:uiautomator'
+            self.__cmdExecute('adb uninstall com.github.uiautomator')
+        else:
+            print 'uiautomator false'
+
+        if self.IsAPKInstalled('com.github.uiautomator.test') is True:
+            print u'卸载:uiautomator.test'
+            self.__cmdExecute('adb uninstall com.github.uiautomator.test')
+        else:
+            print 'uiautomator.test false'
+        
+        # 安装apk
+        if self.AdbInstallAPK(r'D:\SAT\tools\atx-init\app-uiautomator.apk') is False:
+            return False
+        if self.AdbInstallAPK(r'D:\SAT\tools\atx-init\app-uiautomator-test.apk') is False:
+            return False
+        if self.AdbInstallAPK(r'D:\SAT\tools\atx-init\exoplayer-demo-2.8.4.apk') is False:
+            return False
 
     def turnOnTV(self):
         tryCount = 5
@@ -415,7 +520,7 @@ class SomkePretreatment:
             time.sleep(60)
             tryCount = tryCount -1
             # 尝试连接;
-            self.__adbConnect()
+            # self.__adbConnect()
         
         print u'开机失败'
         return False