[uiautomator篇] python uiautomatorDemo

#coding=utf-8
"""

@version: 1.0

@author: 

@prerequisite:
    based on Python 2.7

@usage:
    1) this is the handler for testcase

@Others:
    No

@description: 3DMark性能跑分

@module: performance

@caselevel: A

@timeout: 1800

"""

from uiautomator import Device
import time
from util import CylixUtilTestCase
import subprocess
import os
import zipfile
import shutil
import traceback
import re

class AI030002Mark3D(CylixUtilTestCase):
    
    PRE_INSTALL_APK = [
    # ('apk\3DMark.apk','com.futuremark.dmandroid.application')
    # ('apk\pad-debug.apk','com.softwinner.performance.frameratetest'),
    # ('apk\pad-debug-androidTest.apk','com.softwinner.performance.frameratetest.test')
    ]



    def testMark3d(self):

        self.installPlugIn()
        self.UiautomatorMark3D()

    def installPlugIn(self):

        resourcedir = os.path.normpath(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'resource'))
        zipFilePath = os.path.normpath(os.path.join(resourcedir, r'mark3dAndroid.zip'))
        unzipToPath = os.path.dirname(zipFilePath)
        tempfile = os.path.join(unzipToPath, r'Android')
        self.logger.info("step1: unzip  " + zipFilePath + " to " + unzipToPath)
        if os.path.exists(tempfile):
            self.logger.info(tempfile + ' exist ,delete it')
            self.deleteDirectory(tempfile)
        self.unzip_file(zipFilePath, unzipToPath)

        self.logger.info("step2: push data to device")
        localDataPath = resourcedir + r'mark3dAndroiddata'
        remoteDataPath = '/sdcard/Android' 
        self.device.adb.push(localDataPath, remoteDataPath)
        self.deleteDirectory(tempfile)

    def UiautomatorMark3D(self):
        assert self.Recent(), 'recent fail'
        self.enterApplist()
        self.openApplication('3DMark')
        self.runMark3d()
        self.parserXml()
        assert self.Recent(), 'recent fail'
       

    def enterApplist(self):
        d = Device(self.dut_adb_num)
        d.press.home()
        d.screen.on()

        if d(description = "Apps list", index = 3).wait.exists(timeout=2000):
            self.logger.info("Find App list successfully")
            d(description = "Apps list", index = 3).click()
        else:
            print "Can not find App list"
            assert False, 'Can not find App list'
        if d(resourceId = "com.android.launcher3:id/main_content").wait.exists(timeout=2000):
            self.logger.info("Enter APP list successfully")
            return True
        else:
            self.logger.info("Fail to enter APP list")
            assert False, 'Fail to enter APP list'

    def openApplication(self, packageName):
        d = Device(self.dut_adb_num)
        d.screen.on()
        if d(text = packageName).wait.exists(timeout = 2000):
            self.logger.info("Find %s successfully" % packageName)
            d(description = packageName).click()
        else:
            self.logger.info("Can not find %s" % packageName)
            assert False, "Can not find %s" % packageName

    def runMark3d(self):
        d = Device(self.dut_adb_num)
        d.screen.on()
        time.sleep(10)
        if d(textContains = "3DMARK").wait.exists(timeout = 20000):
            self.logger.info("Enter 3DMARK successfully")
        else:
            self.logger.info("Fail to enter 3DMARK")
            assert False, 'fail to enter 3DMARK'

        if d(description = "RUN").wait.exists(timeout = 20000):
            self.logger.info("Find RUN successfully")
            d(description = "RUN").click()
        else:
            self.logger.info("Find RUN Failure")
            assert False, 'find Run Failure'

        for i in range(1,15):
            time.sleep(30)
            self.logger.info("3DMark run time :%s s" % str(i * 30))
            if i%2 == 0:         
                if d(description = "SHARE").wait.exists(timeout = 2000):
                    self.logger.info("Find SHARE successfully")
                    self.logger.info("********************3DMark DONE********************")
                    return True

        xml_path = self.tcr_fd + os.sep + "3DMarkLiu.xml"
        self.logger.info('xml_path = %s' % xml_path)
        d.dump(xml_path)
        self.logger.info("Finish downloading %s file " % xml_path)
        f = file(xml_path)            
        lines = f.readlines()
        status = False
        for line in lines:
            if "SHARE" in line:
                self.logger.info("Find SHARE successfully")
                self.logger.info("********************3DMark DONE********************")
                status = True
                break;
        f.close()
        assert status, 'mark3d test fail'

    def parserXml(self):

        d = Device(self.dut_adb_num)
        d.screen.on()
        iceStormExtremeXML = os.path.normpath(os.path.join(self.tcr_fd, 'iceStormExtreme.xml'))
        self.logger.info('iceStormExtremeXML = %s' % iceStormExtremeXML )
        d.dump(iceStormExtremeXML)
        f = file(iceStormExtremeXML)
        lines = f.readlines()
        for line in lines:
            # content-desc="Ice Storm Extreme 1891"
            iceStormExtreme_score = re.findall(r'Ice Storm Extremes+(d+)', line, re.M)[0]
            self.logger.info(iceStormExtreme_score)
            if not iceStormExtreme_score:
                assert False, 'recompile fail'
            assert int(iceStormExtreme_score) > 1500, 'iceStormExtreme_score below 1500'
        f.close()

    def unzip_file(self,zipfilename,unziptodir):

        # if not os.path.exists(unziptodir):
        #     os.mkdir(unziptodir,0777)
        assert os.path.exists(unziptodir), unziptodir + "not exist"
        
        zfobj = zipfile.ZipFile(zipfilename)
        for name in zfobj.namelist():
            name = name.replace('\','/')
            if name.endswith('/'):
                # print "include folder: " + name
                os.mkdir(os.path.join(unziptodir,name))
            else:
                # print "include file: " + name
                ext_filename = os.path.join(unziptodir,name)
                ext_dir = os.path.dirname(ext_filename)
                if not os.path.exists(ext_dir):
                    os.mkdir(ext_dir,0777)
                outfile = open(ext_filename,'wb')
                outfile.write(zfobj.read(name))
                outfile.close()

    def deleteDirectory(self,current_path):
        if not os.path.exists(current_path):
            self.logger.info(current_path + " not exist")
            return
        current_filelist = os.listdir(current_path)
        for f in current_filelist:
            real_path = os.path.join(current_path,f)
            if os.path.isdir(real_path):
                real_folder_path = real_path
                try:
                    for root,dirs,files in os.walk(real_folder_path):
                        for name in files:
                            del_file = os.path.join(root,name)
                            os.remove(del_file)
                    shutil.rmtree(real_folder_path)
                except Exception,e:traceback.print_exc()
            if os.path.isfile(real_path):
                os.remove(real_path)
        os.rmdir(current_path)


    def Recent(self):
        d = Device(self.dut_adb_num)
        displayWidth = int(d.info.get("displayWidth"))
        displayHeight = int(d.info.get("displayHeight"))
        d.press.recent()
        if d(text="No recent items").wait.exists(timeout=2000):
            print "Cleared recent items"
            return True
        if d(descriptionContains="Dismiss").wait.exists(timeout=2000):
            for i in range(50):
                if d(text="CLEAR ALL").wait.exists(timeout=2000):
                    d(text="CLEAR ALL").click()
                    if d(description="Apps list",index=3).wait.exists(timeout=2000):
                        print "Cleared recent items"
                        return True
                    else:
                        print "Fail to clear recent items" 
                        return False
                else:
                    d.swipe(displayWidth/2,displayHeight/4,displayWidth/2,3*displayHeight/4,steps=30)
                    i+=1
            else:
                print "Fail to find CLEAR ALL "
                return False
        else:
            print "EXCEPTION CLEAR RECENT ITEMS"
            return True
原文地址:https://www.cnblogs.com/liuzhipenglove/p/7196305.html