Exemplo n.º 1
0
class PerTest_QIPAIHALL_Setting(TestCase):
    '''
    设置界面显示
    '''
    owner = "JessicZeng"
    status = EnumStatus.Design
    priority = EnumPriority.High
    timeout = 60

    def pre_test(self):
        self.common = Common()
        self.hall_page = Hall_Page()
        self.setting_page = Setting_Page()
        #通过xpath获取items,是完全返回  因此针对一页显示的item数进行操作
        self.helpItemCount = 5

    def run_test(self):
        '''
        测试用例
        操作步骤:
        1、关闭悬浮球(若已是关闭状态则先打开再关闭)
        2、静音关闭(若已是关闭状态则先打开再关闭)
        3、读牌打开(若已是打开状态则先关闭再打开)
        4、音效、音乐、聊天、震动、比赛围观打开(若已是打开状态则先关闭再打开)
        5、关于查看,四个标签操作步骤:关于--服务协议--隐私策略--版号申明  列表项均滑动  从版号申明往前一直到关于我们  然后点击返回按钮返回设置页面
        6、关于游戏帮助目前所打包不支持,暂不操作
        '''
        self.hall_page.wait_element("同步标志")
        self.common.sendTagBroadcast(EnumSceneName.Setting,
                                     EnumSceneType.Start)
        try:
            self.start_step("点击大厅设置入口")
            self.hall_page.wait_element("设置").click()
            time.sleep(2)
            self.setting_page.wait_element("同步标志")
            self.common.taskScreenShot("openSettingPop.jpg")
            # 操作各切换按钮
            self.start_step("操作各切换按钮")
            self.switchBtn("浮动球开关", "浮动球状态", True)
            self.common.taskScreenShot("closeFloatBall.jpg")
            self.switchBtn("静音开关", "静音状态", True)
            self.switchBtn("读牌开关", "读牌状态", False)
            self.switchBtn("聊天开关", "聊天状态", False)
            self.switchBtn("震动开关", "震动状态", False)
            self.switchBtn("比赛围观开关", "比赛围观状态", False)

            # 查看关于弹框
            self.start_step("查看关于内容")
            self.setting_page.get_element("关于入口").click()
            self.setting_page.wait_element("关于同步标志")
            self.common.taskScreenShot("setting_about_pop.jpg")
            self.setting_page.get_element("关于我们").click()
            time.sleep(1)
            self.setting_page.get_element("服务协议").click()
            time.sleep(1)
            self.setting_page.get_element("隐私策略").click()
            time.sleep(1)
            self.setting_page.get_element("版本声明").click()
            time.sleep(1)
            self.setting_page.get_element("退出关于").click()

            #查看游戏帮忙
            self.start_step("查看游戏帮助")
            self.setting_page.get_element("游戏帮助入口").click()
            self.setting_page.wait_element("游戏帮助同步标志")
            self.common.taskScreenShot("setting_help_pop.jpg")
            tabList = self.setting_page.get_element("tab列表")
            tabItems = self.setting_page.get_elements("tabItem")
            self.start_step("切换tab,查看不同类型游戏帮助")
            for i in range(self.helpItemCount):
                if (tabItems[i] != None):
                    tabItems[i].click()
                    time.sleep(1)
            if (len(tabItems) > self.helpItemCount):
                self.start_step("滑动左侧tab列表")
                self.common.swipeList(tabList)
            self.setting_page.get_element("退出游戏帮助").click()

            # 退出设置弹框
            self.setting_page.get_element("退出设置").click()
        except:
            self.common.platformLog("设置页面操作失败")
        finally:
            self.common.checkPopVisible(self.setting_page)
            self.hall_page.wait_element("同步标志")

        time.sleep(2)
        self.common.sendTagBroadcast(EnumSceneName.Setting, EnumSceneType.Stop)

    def switchBtn(self, pName, cName, close):
        '''
        用于操作切换按钮
        若当前状态和要求一致,则操作切换元素两次  否则只点击一次
         @:param  pName:切换元素名
         @:param  cName:切换元素的按钮名  直接取【2】有问题  改为先取列表然后从list取index为2的元素
         @:param  close:是否需要关闭
        :return:
        '''
        # print "需要操作的开关名:"+pName + " 是否隐藏:"+ str(close)
        parentEl = None
        childEl = None
        isClose = False
        try:
            parentEl = self.setting_page.wait_element(pName)
        except:
            print "获取parentEl失败,退出切换按钮设置"
            return
        try:
            elList = self.setting_page.get_elements(cName)
            if len(elList) > 2:
                childEl = elList[2]
            else:
                return
        except:
            print "获取childEl失败,退出切换按钮设置"
            return

        parentX = parentEl.location['x']
        parentWidth = parentEl.size['width']
        childX = childEl.location['x']
        childWidth = childEl.size['width']

        if ((childX + childWidth / 2) < (parentX + parentWidth / 2)):
            isClose = True
        else:
            isClose = False
        if isClose == close:
            parentEl.click()
            time.sleep(0.5)
            parentEl.click()
            time.sleep(0.5)
        else:
            parentEl.click()
            time.sleep(0.5)
Exemplo n.º 2
0
class PerTest_QIPAIHALL_Setting(TestCase):
    '''
    设置界面显示
    '''
    owner = "JessicZeng"
    status = EnumStatus.Design
    priority = EnumPriority.High
    timeout = 60

    def pre_test(self):
        self.common = Common()
        self.hall_page = Hall_Page()
        self.setting_page = Setting_Page()
        #通过xpath获取items,是完全返回  因此针对一页显示的item数进行操作
        self.helpItemCount = 5

    def run_test(self):
        '''
        测试用例
        操作步骤:
        1、关闭悬浮球(若已是关闭状态则先打开再关闭)
        2、静音关闭(若已是关闭状态则先打开再关闭)
        3、读牌打开(若已是打开状态则先关闭再打开)
        4、音效、音乐、聊天、震动、比赛围观打开(若已是打开状态则先关闭再打开)
        5、关于查看,四个标签操作步骤:关于--服务协议--隐私策略--版号申明  列表项均滑动  从版号申明往前一直到关于我们  然后点击返回按钮返回设置页面
        6、关于游戏帮助目前所打包不支持,暂不操作
        '''
        self.hall_page.wait_element("同步标志")
        self.common.sendTagBroadcast(EnumSceneName.Setting,
                                     EnumSceneType.Start)
        try:
            self.start_step("点击大厅设置入口")
            self.hall_page.get_element("设置").click()
            self.setting_page.wait_element("同步标志")
            self.common.taskScreenShot("openSettingPop.jpg")
            # 操作各切换按钮
            self.start_step("操作各切换按钮")
            self.common.switchBtn("浮动球开关", "浮动球状态", True)
            self.common.taskScreenShot("closeFloatBall.jpg")
            self.common.switchBtn("静音开关", "静音状态", True)
            self.common.switchBtn("读牌开关", "读牌状态", False)
            self.common.switchBtn("聊天开关", "聊天状态", False)
            self.common.switchBtn("震动开关", "震动状态", False)
            self.common.switchBtn("比赛围观开关", "比赛围观状态", False)

            # 查看关于弹框
            self.start_step("查看关于内容")
            self.setting_page.get_element("关于入口", 0).click()
            self.setting_page.wait_element("关于同步标志")
            self.common.taskScreenShot("setting_about_pop.jpg")
            self.setting_page.get_element("关于我们").click()
            time.sleep(1)
            self.setting_page.get_element("服务协议").click()
            time.sleep(1)
            self.setting_page.get_element("隐私策略").click()
            time.sleep(1)
            self.setting_page.get_element("版本声明").click()
            time.sleep(1)
            self.setting_page.get_element("退出关于", 0).click()

            #查看游戏帮忙
            self.start_step("查看游戏帮助")
            self.setting_page.get_element("游戏帮助入口").click()
            self.setting_page.wait_element("游戏帮助同步标志")
            self.common.taskScreenShot("setting_help_pop.jpg")
            tabList = self.setting_page.get_element("tab列表")
            tabItems = self.setting_page.get_elements("tabItem")
            self.start_step("切换tab,查看不同类型游戏帮助")
            for i in range(self.helpItemCount):
                if (tabItems[i] != None):
                    tabItems[i].click()
                    time.sleep(1)
            if (len(tabItems) > self.helpItemCount):
                self.start_step("滑动左侧tab列表")
                self.common.swipeList(tabList)
            self.setting_page.get_element("退出游戏帮助").click()

            # 退出设置弹框
            self.setting_page.get_element("退出设置", 0).click()
        except:
            self.common.platformLog("设置页面操作失败")
        finally:
            self.common.checkPopVisible(self.setting_page)
            self.hall_page.wait_element("同步标志")

        time.sleep(5)
        self.common.sendTagBroadcast(EnumSceneName.Setting, EnumSceneType.Stop)
Exemplo n.º 3
0
class Common():
    def __init__(self):
        self.log = Logger().get_logger()
        self.resolution = None
        self.hall_page = Hall_Page()
        self.sign_page = Sign_Page()
        self.setting_page = Setting_Page()

    def setupdriver(self, agrs={}):
        '''
        luadriver 用于游戏操作,对应appium
        始化必然会执行到的逻辑
        全局共用driver  其余地方都是通过singleGlobalVar.get("luaDriver")获取
        '''
        self.platformLog("---------setupdriver---------")
        # 初始化Luadriver
        self.luaobj = LuaDriver()
        self.luaobj.creatLuaDriver(agrs)
        singleGlobalVar.set_map("luaDriver", self.luaobj.getLuaDriver())

    def closedriver(self):
        '''关闭driver
        '''
        singleGlobalVar.get("luaDriver").quit()

    def checkPopVisible(self, page, flagElName="同步标志"):
        '''
        根据page同步标志判断弹框是否存在,直至元素不存在或者操作次数操作3次
        :param page: 操作页
        :param flagElName: 同步标志元素name
        :param closeElName:关闭弹框元素name
        :return:
        '''
        cnt = 0
        while cnt < 3:
            print "cnt:" + str(cnt)
            try:
                page.get_element(flagElName)
                if singleGlobalVar.get("luaDriver") != None:
                    singleGlobalVar.get("luaDriver").keyevent(4)
            except:
                break
                print "该pop已关闭"
            cnt = cnt + 1

    def deletefile(self):
        driver = singleGlobalVar.get("luaDriver")
        self.platformLog("deleteFile  开始测试前删除配置及性能相关文件")
        config = ConfigHelper(constant.cfg_path)
        package = config.getValue('appium', 'apppackage')

        #正式服
        command = "shell rm -r /mnt/sdcard/." + package + "/dict/lastLoginInfo.dat"
        self.platformLog(command)
        try:
            driver.adb(command)
        except:
            self.platformLog("删除正式服上次登录配置文件失败")

        #预发布  1lastLoginInfo.dat
        command1 = "shell rm -r /mnt/sdcard/." + package + "/dict/1lastLoginInfo.dat"
        self.platformLog(command1)
        try:

            driver.adb(command1)
        except:
            self.platformLog("删除预发布1lastLoginInfo.dat失败")

        # 预发布  2lastLoginInfo.dat
        command2 = "shell rm -r /mnt/sdcard/." + package + "/dict/2lastLoginInfo.dat"
        self.platformLog(command2)
        try:
            driver.adb(command2)
        except:
            self.platformLog("删除预发布1lastLoginInfo.dat失败")

        #删除性能测试结果文件
        delCsvCmd = "shell rm -r /mnt/sdcard/" + package + "_result.csv"
        self.platformLog(delCsvCmd)
        try:
            driver.adb(delCsvCmd)
        except:
            self.platformLog("删除性能测试文件失败")

        #minicap截图文件夹
        delMinicapCmd = "shell rm -rf /mnt/sdcard/minicap_screen"
        self.platformLog(delMinicapCmd)
        try:
            driver.adb(delMinicapCmd)
        except:
            self.platformLog("删除minicap截图文件夹失败")

        mkdirCmd = "shell mkdir /mnt/sdcard/minicap_screen"
        self.platformLog(mkdirCmd)
        try:
            driver.adb(mkdirCmd)
        except:
            self.platformLog("新建minicap截图文件夹失败")

    def closeActivity(self):
        '''
        关闭进入大厅各种弹框
        :return:
        '''
        self.hall_page = Hall_Page()
        self.sign_page = Sign_Page()

        #关闭首先出现的新手任务按钮
        try:
            self.hall_page.wait_element("新手任务", 5).click()
        except:
            print "未出现新手任务按钮"

        try:
            self.hall_page.wait_element("确认登陆", 5).click()
        except:
            print "未出现确认登陆按钮"

        try:
            self.hall_page.wait_element("立即升级绑定账号", 5).click()
            self.sign_page.wait_element("关闭1").click()
        except:
            print "未出现立即升级绑定账号按钮"

        #添加破产奖励领取,由于目前只能在正式服测试  导致所有接口不能用   先领取破产奖励,避免弹框对其他场景影响
        try:
            self.hall_page.wait_element("破产领奖按钮", 5).click()
            self.platformLog("领取破产奖励")
        except:
            print "没有破产按钮"

        self.closeActivityBtn(False)

    def closeActivityBtn(self, checkNewer=True):
        '''
        关闭活动弹框(同时切换服务器、重新登录进入大厅也是用该函数关闭活动弹框)
        @:param checkNewer 是否检测新手任务按钮
        :return:
        '''
        if checkNewer:
            try:
                self.hall_page.wait_element("新手任务", 5).click()
            except:
                print "未出现新手任务按钮"

        i = 0
        while (i < 5):
            i += 1
            try:
                self.sign_page.wait_element("关闭1", 2).click()
            except:
                print "sign_page关闭1按钮操作失败"

    def moveElement(self, startEl, endEl):
        '''
        滑动元素  将元素从位置1滑动到位置2  以元素中心位置进行滑动
        :param element1:  滑动开始元素名
        :param element2:  滑动结束元素名
        :return:
        '''
        swipe_startx = startEl.location['x'] + startEl.size['width'] / 2
        swipe_starty = startEl.location['y'] + startEl.size['height'] / 2

        swipe_endx = endEl.location['x'] + endEl.size['width'] / 2
        swipe_endy = endEl.location['y'] + endEl.size['height'] / 2
        singleGlobalVar.get("luaDriver").swipe(swipe_startx, swipe_starty,
                                               swipe_endx, swipe_endy, 1000)

    def swipeList(self, listEl, dir=EnumDirection.Up, devPos=20):
        '''
        滑动列表  以中心点进行滑动
        :param listEl: 需进行滑动的列表元素
        :param dir:滑动方向  EnumDirection.Up Down Left Right
        :param devPos:滑动偏移值
        :return:
        '''
        driver = singleGlobalVar.get("luaDriver")
        elLocation = listEl.location
        elSize = listEl.size
        startX = elLocation['x']
        centerX = elLocation['x'] + elSize['width'] / 2
        endX = elLocation['x'] + elSize['width'] - devPos
        startY = elLocation['y']
        centerY = elLocation['y'] + elSize['height'] / 2
        endY = elLocation['y'] + elSize['height'] - devPos
        if dir == EnumDirection.Up:
            driver.swipe(centerX, endY, centerX, startY)
        elif dir == EnumDirection.Down:
            driver.swipe(centerX, startY, centerX, endY)
        elif dir == EnumDirection.Left:
            driver.swipe(endX, centerY, startX, centerY)
        elif dir == EnumDirection.Right:
            driver.swipe(startX, centerY, endX, centerY)

        time.sleep(1)

    def closefloatBall(self):
        '''
        关闭浮动球,先判断浮动球是否显示中
        :return:
        '''
        try:
            self.hall_page.wait_element("同步标志")
            self.hall_page.get_element("设置").click()
            self.switchBtn("浮动球开关", "浮动球状态", True)
        except:
            self.platformLog("浮动球已关闭or关闭失败")
        finally:
            self.checkPopVisible(self.setting_page)

    def switchBtn(self, pName, cName, close):
        '''
        用于操作切换按钮(主要是设置框浮动球类按钮操作)
        若当前状态和要求一致,则操作切换元素两次  否则只点击一次
         @:param  pName:切换元素名
         @:param  cName:切换元素的按钮名  直接取【2】有问题  改为先取列表然后从list取index为2的元素
         @:param  close:是否需要关闭
        :return:
        '''
        # print "需要操作的开关名:"+pName + " 是否隐藏:"+ str(close)
        parentEl = None
        childEl = None
        isClose = False
        try:
            parentEl = self.setting_page.wait_element(pName)
        except:
            print "获取parentEl失败,退出切换按钮设置"
            return
        try:
            elList = self.setting_page.get_elements(cName)
            if len(elList) > 2:
                childEl = elList[2]
            else:
                return
        except:
            print "获取childEl失败,退出切换按钮设置"
            return

        parentX = parentEl.location['x']
        parentWidth = parentEl.size['width']
        childX = childEl.location['x']
        childWidth = childEl.size['width']

        if ((childX + childWidth / 2) < (parentX + parentWidth / 2)):
            isClose = True
        else:
            isClose = False
        if isClose == close:
            parentEl.click()
            time.sleep(0.5)
            parentEl.click()
            time.sleep(0.5)
        else:
            parentEl.click()
            time.sleep(0.5)

    #从26个大小写字母及数字从随机生成指定长度的字符串
    def random_str(self, len):
        '''生成随机字符'''
        str = ""
        resourceStr = string.ascii_letters + string.digits
        for i in range(len):
            str += (random.choice(resourceStr))
        return str

    def addmoney(self, mid):
        '''
        破产账号充值
        :return:
        '''
        user_info = PHPInterface.get_user_info(mid)  # 获取玩家信息
        coin = eval(user_info).get('result', {
            'coin': None
        }).get('coin')  # 获取当前银币值
        print coin
        AddMoney = 10000 - coin
        print AddMoney
        PHPInterface.add_money(mid, AddMoney)  # 将银币值设为60000

    def getResolution(self):
        '''
        获取分辨率
        :return: 直接返回的是minicap截图需要的分辨率参数 游戏会自动设置横屏,所以width>height
        '''
        if (self.resolution == None):
            screenWidth = singleGlobalVar.get(
                "luaDriver").get_window_size()['width']
            screenHeigth = singleGlobalVar.get(
                "luaDriver").get_window_size()['height']
            self.resolution = str(screenWidth) + "x" + str(
                screenHeigth) + "@" + str(screenWidth) + "x" + str(
                    screenHeigth)

        return self.resolution

    def taskScreenShot(self, fileName):
        '''
        由于appium截图效率问题,改为stf平台的minicap进行截图,其中-P如下:
        The format of the -P argument is: {RealWidth}x{RealHeight}@{VirtualWidth}x{VirtualHeight}/{Orientation}. The "virtual" size is the size of the desired projection.
        The orientation argument tells minicap what the current orientation of the device is (in degrees),
        可执行minicap命令:
        adb shell LD_LIBRARY_PATH=/data/local/tmp exec /data/local/tmp/minicap -P 720x1280@720x1280/90 -s >/sdcard/minicap_1504612944860.jpg
        :param page:  元素所在page页
        :param fileName: 截图保存的文件名
        :return:
        '''
        driver = singleGlobalVar.get("luaDriver")
        try:
            broadcastType = "com.boyaa.stf.screenShot"
            cmd_send = "shell am broadcast -a " + broadcastType + " --es sShotName " + fileName
            self.platformLog(cmd_send)
            driver.adb(cmd_send)
        except:
            self.platformLog("通知apk截图时间失败")

        try:
            cmd_pre = "shell LD_LIBRARY_PATH=/data/local/tmp exec /data/local/tmp/minicap -P "
            cmd_minicap = cmd_pre + self.getResolution(
            ) + "/0 -s >/mnt/sdcard/minicap_screen/" + fileName
            self.platformLog(cmd_pre)
            driver.adb(cmd_minicap)
        except:
            self.platformLog("调用minicap截图失败")

    @staticmethod
    def printStr(*info):
        '''
        打印log,自动将所有传入非字符串类型转换为字符串然后打印出来
        '''
        logStr = ""
        for v in info:
            if type(v) != str:
                v = str(v)
            logStr = logStr + v
        timeStamp = str(datetime.datetime.now())
        print timeStamp + " " + logStr

    def getResumeTime(self):
        '''
        获取游戏启动完成时间,目前是头像元素出现的时间
        :return:
        '''
        time.sleep(2)
        self.platformLog("-------------getResumeTime----------")
        try:
            self.hall_page.wait_element("启动完成标志", 180, 0.1)
            # utc = '%.2f' % (time.time())
            print "apk start completely"
            self.platformLog("apk start completely")
        except:
            self.platformLog("获取标志app成功成功元素失败")

    def startCollectApp(self):
        '''
        启动性能采集apk
        :return:
        '''
        self.platformLog("startCollectApp start pmonitor apk")
        config = ConfigHelper(constant.cfg_path)
        #性能采集apk acticity
        apkName = config.getValue('appium', 'collectApkName')
        # 被测apk packageName
        testAPKName = config.getValue('appium', 'apppackage')
        # 最终生成结果文件在手机中目录
        resultFilePath = "/mnt/sdcard/" + testAPKName + "_result.csv"

        # SDK 17后由于权限问题,需要加--user 0
        startCmd = "shell am start --user 0 -n " + apkName + " --es packageName " + testAPKName + " --es filePath " + resultFilePath
        self.platformLog(startCmd)
        singleGlobalVar.get("luaDriver").adb(startCmd)

    def platformLog(self, msg):
        logStr = ""
        for v in msg:
            if type(v) != str:
                v = str(v)
            logStr = logStr + v
        self.log.info(logStr)

    def sendTagBroadcast(self, tagName, tagType):
        '''
        向性能采集apk发送场景广播
        :param tagName:
        :param tagType:
        :return:
        '''
        #广播类型
        broadcastType = "com.boyaa.stf.UIScript"
        cmd_send = "shell am broadcast -a " + broadcastType + " --es tagName " + tagName + " --es tagType " + tagType
        self.platformLog(cmd_send)
        singleGlobalVar.get("luaDriver").adb(cmd_send)

    def sendStopServiceBroad(self):
        self.platformLog("sendStopServiceBroad")
        # 广播类型
        broadcastType = "com.boyaa.stf.stopService"
        cmd_send = "shell am broadcast -a " + broadcastType
        singleGlobalVar.get("luaDriver").adb(cmd_send)