class PerTest_QIPAIHALL_Backpack(TestCase): ''' 物品箱操作 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 5 def pre_test(self): self.common = Common() self.hall_page = Hall_Page() self.backpack_Page = Backpack_Page() def run_test(self): ''' 测试步骤 1、大厅点击物品箱入口 2、点击兑换记录 3、点击大厅同步标志,退出物品箱 ''' self.hall_page.wait_element("同步标志") #点击大厅物品箱入口 self.start_step("点击大厅物品箱入口") self.common.sendTagBroadcast(EnumSceneName.Backpack, EnumSceneType.Start) try: #点击物品箱入口 self.hall_page.get_element("物品箱", 0).click() time.sleep(2) self.backpack_Page.wait_element("同步标志") self.common.taskScreenShot("openBackpackPop.jpg") #查看物品箱兑换记录 self.start_step("查看物品箱兑换记录") self.backpack_Page.get_element("兑换记录按钮", 0).click() self.backpack_Page.wait_element("兑换记录框同步标志") self.common.taskScreenShot("openBackpackPop.jpg") self.backpack_Page.get_element("兑换记录框关闭", 0).click() except: print "操作物品箱失败" finally: self.common.checkPopVisible(self.backpack_Page) self.hall_page.wait_element("同步标志") time.sleep(5) self.common.sendTagBroadcast(EnumSceneName.Backpack, EnumSceneType.Stop)
class PerTest_QIPAIHALL_SafeBox(TestCase): ''' 保险箱操作 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 5 def pre_test(self): self.common = Common() self.hall_page = Hall_Page() self.safeBox_Page = Safebox_Page() def run_test(self): ''' 测试步骤 1、大厅点击保险箱入口 每次进入都会先金进入银币tab,不用再单独天机银币tab 3、点击金币保险箱 4、退出 ''' self.hall_page.wait_element("同步标志") self.start_step("点击大厅保险箱入口") self.common.sendTagBroadcast(EnumSceneName.SafeBox,EnumSceneType.Start) try: #点击物品箱入口 self.hall_page.get_element("保险箱",0).click() time.sleep(2) self.safeBox_Page.wait_element("同步标志") self.common.taskScreenShot("silverSafebox.jpg") #操作金币保险箱 self.start_step("操作金条保险箱") self.safeBox_Page.get_element("金条tab",0).click() time.sleep(1) self.common.taskScreenShot("goldSafebox.jpg") except: self.common.platformLog("操作保险箱失败") finally: self.common.checkPopVisible(self.safeBox_Page) self.hall_page.wait_element("同步标志") time.sleep(5) self.common.sendTagBroadcast(EnumSceneName.SafeBox, EnumSceneType.Stop)
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)
class C27541_ChatOpoenWhenMyTurn(TestCase): ''' 打开聊天界面,输入聊天时轮到自己出牌,查看界面显示 ''' owner = "LukeJiang" status = EnumStatus.Design priority = EnumPriority.High timeout = 15 try_find_time = 5 child_game_timeout = 5 # game1500 鞍山麻将 -- 网络特么的有问题 # game24 五狼腿 -- 网络特么的有问题 # game23 托三批 # 1502 三打一 # game25 升级 -- 网络有问题 # game2603 -- 五十k -- 网络有问题 # game203 -- 斗地主 # 棋牌类没有准备按钮, 并且游戏结束后会自动跳出界面,忽略棋牌类游戏 excluded_game = ['game20', 'game2002', 'game1500', 'game1502', 'game24', 'game23', 'game25', 'game2603'] level = 0 def init(self): self.common = Common() self.hall_page = Hall_Page() self.setting_page = Setting_Page() self.game_page = Game_Page() self.person_info_page = Personinfo_Page() self.start_step("初始化driver") self.luadriver = self.common.setupdriver() self.start_step("关闭弹出框") self.common.closeactivity(self.luadriver) def log_info(self, msg): self.log.info(msg) def _restart_app(self): # 重启游戏 # driver quite self.common.closedriver() # recreate driver self.init() def pre_test(self): self.log = Logger().get_logger() self.log_info("TestCase: 打开聊天界面,输入聊天时轮到自己出牌,查看界面显示") self.init() def run_test(self): self.common.switchserver() self.start_step("关闭弹出框") self.common.closeactivity(self.luadriver) time.sleep(15) self.kill_popup_windom() self.loop_current_page_game() self.log_info("第二页游戏") self.game_page.wait_element("右三角标", timesleep=1).click() self.loop_current_page_game() def _is_in_tray(self): is_in_tray = True chat_btn = None try: chat_btn = self.game_page.get_element("牌局开始时聊天按钮", timesleep=1) except: pass if chat_btn: chat_btn.click() chat_record = None try: chat_record = self.game_page.get_element("聊天记录") except: pass if chat_record: self.luadriver.keyevent(4) is_in_tray = False return is_in_tray def _cancel_tray(self): self.game_page.wait_element("房间内菜单").click() self.game_page.wait_element("托管").click() def loop_current_page_game(self): i = self.try_find_time game_list = [] while i: game_list = self.game_page.get_game_list() if len(game_list) != 0: break i = i - 1 time.sleep(1) if len(game_list) == 0: raise Exception("子游戏列表为空") for game in game_list: game_name = game.get_attribute('name') self.log_info("====准备进入子游戏:%s====" % game_name) if game_name in self.excluded_game:#['game20', 'game2002']: continue r_v = PHPInterface.set_match_config(game=int(game_name.replace("game", "")), basechiptype=0, playmode=0, roomlevel=12+self.level, baseconfig="BASE_CHIPS=>100,HIGH_LIMIT=>-1,HIGH_LIMIT_EXIT=>-1,SERVICE_FEE=>10,ADDROBOTFLAG=>1,ROBOT_MAX_NUMBER=>2", extraconfig="") self.log_info("设置场次接口返回值:%s" % str(r_v)) if self.enter_game_room(game_name, find_in_elements=False, level=self.level): self.ready() # 游戏开始后 while 1: if not self.try_find_element("换桌"): break time.sleep(1) while 1: try: chat = self.try_find_element("牌局开始时聊天按钮", page_object=self.game_page) if chat: chat.click() else: chat = self.try_find_element("聊天", page_object=self.game_page) if chat: chat.click() self.game_page.get_element("聊天记录", timesleep=1).click() self.log_info("等到我出牌") while 1: my_turn = self.try_find_element("timer_light_1", find_in_elements=False) if my_turn: self.log_info("到我出牌") break else: my_turn = self.try_find_element("prompt", find_in_elements=False) if my_turn: self.log_info("到我出牌") break time.sleep(1) self.game_page.screenshot('my_turn_chat_%s.png' % game_name) count = self._check_button_count() if count != 3: raise Exception("当前界面不对") break except: pass self.luadriver.keyevent(4) self.wait_for_gameover() self.back_to_hall() def enter_game_room(self, target_gamename, find_in_elements=True, level=0, page_object=None): self.log_info("准备进入子游戏:%s" % target_gamename) # 在当前页中点击target子游戏 child_game = None i = self.try_find_time while i: time.sleep(1) self.log_info("获取子游戏:%s" % target_gamename) try: if find_in_elements: child_game = self.hall_page.get_element(target_gamename) # self.luadriver.find_lua_element_by_name(target_gamename) else: child_game = self.try_find_element(target_gamename, find_in_elements=False)#self.luadriver.find_lua_element_by_name(target_gamename) except: pass if child_game: break i = i - 1 if child_game: self.log_info("点击子游戏:%s" % target_gamename) child_game.click() else: next_page = self.try_find_element("right_arrow", find_in_elements=False, try_time=self.try_find_time)#self.luadriver.find_lua_element_by_name("right_arrow") if next_page: next_page.click() time.sleep(1) if find_in_elements: child_game = self.hall_page.wait_element(target_gamename) else: child_game = self.try_find_element(target_gamename, find_in_elements=False) if child_game: child_game.click() if not child_game: raise Exception("获取不到子游戏") retry_btn = None try: retry_btn = self.game_page.get_element("重新获取1") self.luadriver.keyevent(4) except: pass if retry_btn: return False # 判断是否需要下载资源 download_btn = None try: download_btn = self.game_page.get_element("资源下载-确定") except: pass room_showed = False if download_btn: download_btn.click() # 等待资源下载完成, 等待结束条件: 场次UI出现 self.log_info("开始下载游戏") while 1: if self.element_exists("swf_view", find_in_elements=False): break if self.element_exists("房间场次", find_in_elements=True, page_object=self.game_page): room_showed = True break time.sleep(1) #if self.game_page.wait_element("房间场次", timeout=60 * 10, frequency=1): #break else: if not self.element_exists("swf_view", find_in_elements=False, try_time=self.try_find_time): room_showed = True if not room_showed: market_btns = self.try_find_elements("swf_view", find_in_elements=False, try_time=self.try_find_time) self.log_info("斗地主金银场次选择:%s" % str(market_btns)) if len(market_btns) == 0: raise Exception("获取不到金银场次选择") market_btns[0].click() time.sleep(2) level_btns = self.game_page.wait_element("叫抢初级场").click() #self.log_info("斗地主初中高场次选择:%s" % str(level_btns)) #if len(level_btns) == 0: # raise Exception("获取不到初中高场次选择") #level_btns[0].click() return True else: level = "初级场" if level == 0 else "中级场" if level == 1 else "高级场" # 点击初级场 self.log_info("点击%s" % level) self.game_page.wait_element(level).click() return True def element_exists(self, name, find_in_elements=True, try_time=1, page_object=None, timesleep=0.5): time.sleep(timesleep) target_element = None i = try_time while i: try: if find_in_elements: target_element = page_object.get_element(name, timesleep=1) # self.luadriver.find_lua_element_by_name(target_gamename) else: target_element = self.luadriver.find_lua_element_by_name(name) except: pass if target_element: break i = i - 1 if target_element: return True return False def try_find_element(self, name, find_in_elements=True, try_time=1, page_object=None): target_element = None i = try_time while i: try: if find_in_elements: target_element = page_object.get_element(name, timesleep=1) # self.luadriver.find_lua_element_by_name(target_gamename) else: target_element = self.luadriver.find_lua_element_by_name(name) except: pass if target_element: break i = i - 1 return target_element def try_find_elements(self, name, find_in_elements=True, try_time=1, page_object=None): target_elements = [] i = try_time while i: try: if find_in_elements: target_elements = page_object.get_elements(name, timesleep=1) # self.luadriver.find_lua_element_by_name(target_gamename) else: target_elements = self.luadriver.find_lua_elements_by_name(name) except: pass if target_elements: break i = i - 1 return target_elements if target_elements != None else [] def wait_for_hallstable(self): self.log_info("等待大厅稳定") end_time = time.time() + self.child_game_timeout * 60 while 1: game_list = self.game_page.get_game_list() if len(game_list) != 0: break if time.time() > end_time: raise Exception("等待大厅超时") time.sleep(1) return True def back_to_hall(self, back_time=4): self.log_info("返回到大厅") for i in range(back_time): self.luadriver.keyevent(4) time.sleep(0.5) while 1: if self.wait_for_hallstable() and not self.element_exists("title", find_in_elements=False, try_time=2): break else: self.luadriver.keyevent(4) return True def ready(self): # 有准备的按准备 self.log_info("有无准备按钮") i = self.try_find_time while i: ready_btn = None try: ready_btn = self.game_page.get_element("准备", timesleep=1) except: pass if ready_btn: self.log_info("点击准备按钮") ready_btn.click() # 新斗地主,准备按钮会在一瞬间消失,此时点击准备按钮会跑在(0,0)位置 if self.element_exists("退出", page_object=self.game_page, timesleep=1): self.log_info("点击准备按钮, 存在退出按钮") self.luadriver.keyevent(4) break i = i - 1 def wait_for_gameover(self): self.log_info("等待游戏结束") end_time = time.time() + self.child_game_timeout * 60 jdz_has_clicked = False ddz_qf_clicked = False end_tag_showed = False close_btn_showed = False while 1: # 超时10分钟, 睡眠间隔2s ddz_gameover = self.try_find_element("ddz_gameover", find_in_elements=False) # ready_btn = self.game_page.wait_element("牌局结束标志", timeout=60 * self.child_game_timeout, frequency=2) if ddz_gameover: end_tag_showed = True self.log_info("ddz_gameover: 牌局已结束") close_btn = self.try_find_element("关闭按钮", page_object=self.hall_page) if close_btn: close_btn.click() close_btn_showed = True self.log_info("关闭按钮: 牌局已结束") if end_tag_showed or close_btn_showed: break share_btn = self.try_find_element("share_btn", find_in_elements=False) if share_btn: self.log_info("share_btn: 牌局已结束") self.try_find_element("close_btn", find_in_elements=False, try_time=3).click() close_btn_showed = True break if not jdz_has_clicked: jdz = self.try_find_element("callLordBtn", find_in_elements=False) if jdz: jdz.click() # 新斗地主,叫地主按钮会在一瞬间消失,此时点击准备按钮会跑在(0,0)位置 if self.element_exists("退出", page_object=self.game_page, timesleep=1): self.log_info("点击叫地主, 存在退出按钮") self.luadriver.keyevent(4) jdz_has_clicked = True self.log_info("点击叫地主") if not ddz_qf_clicked: qf = self.try_find_element("叫抢场1分", page_object=self.game_page) if qf: qf.click() self.log_info("点击抢分1分") ddz_qf_clicked = True if self.element_exists("退出", page_object=self.game_page, timesleep=1): self.log_info("点击叫抢场1分, 存在退出按钮") self.luadriver.keyevent(4) if time.time() > end_time: self.log_info("游戏超时") raise Exception("玩游戏超时") def _check_button_count(self): count = 0 common_btn = None try: common_btn = self.luadriver.find_lua_element_by_name("commonTabBtn") except: pass face_btn = None try: face_btn = self.luadriver.find_lua_element_by_name("faceTabBtn") except: pass chat_record = None try: chat_record = self.luadriver.find_lua_element_by_name("chatRecordTabIcon") except: pass if common_btn: count = count + 1 if face_btn: count = count + 1 if chat_record: count = count + 1 return count def post_test(self): self.log_info("post test") #self.common.deletefile(self.luadriver) self.luadriver.quit() def kill_popup_windom(self, backtime=4): # 每日签到 popup = self.try_find_element("signupTips1", find_in_elements=False, try_time=2) if popup: self.log_info("每日签到存在") sign = self.try_find_element("rewardIcon", find_in_elements=False, try_time=2) if sign: sign.click() time.sleep(3) self.try_find_element("closeBtn", find_in_elements=False, try_time=2).click() # 问卷调查 暂时没法标识 # 无条件back 4次 for i in range(backtime): self.luadriver.keyevent(4) time.sleep(0.5) # 新手礼包 reward = self.try_find_element("login_money_anim", find_in_elements=False, try_time=2) if reward: t = self.try_find_element("领新手礼包", page_object=self.hall_page) if t: t.click() while 1: if not self.try_find_element("exitGameView", find_in_elements=False, try_time=2): break else: self.luadriver.keyevent(4)
class PerTest_QIPAIHALL_Task(TestCase): ''' 任务场景 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 60 def pre_test(self): self.common = Common() self.hall_page = Hall_Page() self.task_page = Task_Page() def run_test(self): ''' 任务场景测试步骤 :return: ''' self.hall_page.wait_element("同步标志") self.start_step("点击大厅任务入口") self.common.sendTagBroadcast(EnumSceneName.Task, EnumSceneType.Start) try: self.hall_page.get_element("任务", 0).click() self.task_page.wait_element("同步标志") self.task_page.wait_element("每日签到tab").click() time.sleep(2) self.common.taskScreenShot("qiandaoView.jpg") #若今日签到按钮存在,则点击 try: #若按钮存在并签到成功,会直接跳转到补签页面 self.task_page.get_element("签到按钮", 0).click() time.sleep(1) except: self.common.platformLog("今日签到按钮不存在or领取今日签到奖励失败") #查看购买补签卡界面 self.start_step("购买补签卡界面") self.task_page.wait_element("获取补签卡").click() self.task_page.wait_element("补签卡购买框同步标志") self.common.taskScreenShot("buyBuqianPop.jpg") self.task_page.get_element("取消购买补签卡").click() time.sleep(1) #进行补签操作,目前没有实际进行补签操作 只是查看补签框 # try: # buItmes = self.task_page.get_elements("补签item") # print "长度:"+len(buItmes) # if(buItmes != None and len(buItmes) > 0): # buItmes[0].click() # self.task_page.wait_element("补签对话框标志") # time.sleep(1) # self.task_page.get_element("关闭补签对话框").click() # else: # print "!! buItmes != null and len(buItmes) > 0" # except: # print "没有可补签项,或执行补签操作失败" #查看每日任务列表,若列表可滑动则进行滑动操作 self.start_step("查看每日任务界面") self.task_page.get_element("每日任务tab").click() try: listView = self.task_page.wait_element("taskList") self.common.taskScreenShot("taskView.jpg") taskItems = self.task_page.get_elements("taskItem", 0) if (len(taskItems) > 4): self.start_step("滑动每日任务列表") self.common.swipeList(listView) except: self.common.platformLog("查看任务列表失败") #关闭每日任务弹框 self.task_page.get_element("关闭按钮", 0).click() except: self.common.platformLog("操作任务场景失败") finally: self.common.checkPopVisible(self.task_page) self.hall_page.wait_element("同步标志") time.sleep(5) self.common.sendTagBroadcast(EnumSceneName.Task, EnumSceneType.Stop)
class PerTest_QIPAIHALL_Mall(TestCase): ''' 商城操作 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 5 def pre_test(self): self.common = Common() self.hall_page = Hall_Page() self.mall_Page = Mall_Page() def run_test(self): ''' 测试步骤 1、大厅点击商城入口 2、点击第一金条购买item,关闭购买框 3、滑动金条购买列表 4、切换到银币购买列表 5、滑动银币购买列表 6、切换到道具列表 7、执行购买第一个道具操作,打开购买弹框后取消购买操作 8、滑动道具列表 9、切换到VIP页 10、返回大厅 不同类型的商品列表,共用listView和Item ''' self.hall_page.wait_element("同步标志") self.start_step("点击大厅商城入口") self.common.sendTagBroadcast(EnumSceneName.Mall, EnumSceneType.Start) try: #点击商城 self.hall_page.get_element("商城", 0).click() time.sleep(2) self.mall_Page.wait_element("同步标志") self.common.taskScreenShot("openMallPop.jpg") #购买金条(选择第一个item)并滑动金条列表 self.start_step("购买金条") self.mall_Page.get_element("item0", 0).click() self.mall_Page.wait_element("金条购买框Flag") self.common.taskScreenShot("buyGoldPop.jpg") self.mall_Page.get_element("金条购买框关闭", 0).click() time.sleep(1) self.start_step("滑动金条列表") self.common.swipeList(self.mall_Page.get_element("物品列表")) #切换到银币页并滑动列表 self.start_step("切换到银币Tab") self.mall_Page.get_element("银币Tab", 0).click() time.sleep(2) self.common.taskScreenShot("silverView.jpg") self.start_step("滑动银币列表") self.common.swipeList(self.mall_Page.get_element("物品列表")) #切换到道具页面,并查看购买道具框,最后滑动列表 self.start_step("切换到道具Tab") self.mall_Page.get_element("道具Tab", 0).click() time.sleep(2) self.common.taskScreenShot("propView.jpg") self.start_step("购买道具") self.mall_Page.get_element("item0", 0).click() self.mall_Page.wait_element("道具购买框Flag") self.common.taskScreenShot("buyPropPop.jpg") self.mall_Page.get_element("道具购买框关闭", 0).click() time.sleep(1) self.start_step("滑动道具列表") self.common.swipeList(self.mall_Page.get_element("物品列表")) #切换到VIP self.start_step("切换到VIPTab") self.mall_Page.get_element("VIPTab", 0).click() time.sleep(2) self.common.taskScreenShot("vipView.jpg") #关闭商城弹框 self.mall_Page.get_element("商城关闭", 0).click() except: self.common.platformLog("操作商城失败") finally: self.common.checkPopVisible(self.mall_Page) self.hall_page.wait_element("同步标志") time.sleep(5) self.common.sendTagBroadcast(EnumSceneName.Mall, EnumSceneType.Stop)
class C27363_Go_Broke(TestCase): ''' 携带银币不足最小房间下限时点击房间入场 ''' owner = "ShelleyZhang" status = EnumStatus.Design priority = EnumPriority.High timeout = 30 def pre_test(self): try: self.common = Common() self.hall_page = Hall_Page() self.yuepai_page = Yuepai_Page() self.game_page = Game_Page() self.start_step("获取mid") global mid mid = self.common.get_config_value("casecfg", "mid") # self.start_step("携带10银币") # self.common.set_coin(mid=mid,value='10') # 初始化Luadriver self.start_step("初始化driver") self.luadriver = self.common.setupdriver() # 每个用例都需要关闭活动,把这个放在初始化里面实现 self.common.closeactivity(self.luadriver) except: self.hall_page.get_element("重连游戏").click() def bian_li(self,isChange=False): game_list = self.game_page.get_game_list() for i in range(len(game_list)): #得到大厅所有的游戏控件 name = game_list[i].get_attribute("name") gameid = int(name[4:len(name)]) gamecfg = PHPInterface.get_levelconfig(gameid, 0, 0, 12) # 获取场次配置信息 low_limit = gamecfg.get("values", {"LOW_LIMIT": None}).get("LOW_LIMIT") # 初级场下限是%d self.common.set_coin(mid, low_limit -10) # 选取合适的银币数,少于入场下限 self.common.switchserver() self.common.closeactivity(self.luadriver) if isChange and self.hall_page.element_is_exist("换页"): self.hall_page.wait_element("换页").click() game_list[i].click() time.sleep(4) try: self.game_page.game_is_download() #下载游戏 time.sleep(2) self.hall_page.screenshot("%s_1.png" % game_list[i].get_attribute("name")) self.hall_page.wait_element("快速开始").click() self.hall_page.screenshot("%s_2.png" % game_list[i].get_attribute("name")) self.hall_page.wait_element("关闭对话框").click() if self.hall_page.wait_element("返回1") != None: self.hall_page.wait_element("返回1").click() except: try: self.hall_page.wait_element("重新获取").click() self.hall_page.screenshot("%s_downloadfail.png" % game_list[i].get_attribute("name")) except: self.log_info("重新获取元素並未存在") def run_test(self): ''' 测试用例 ''' self.start_step("等待页面加载完成") self.start_step("获取子游戏列表") self.bian_li() self.hall_page.wait_element("换页").click() self.bian_li(True) def post_test(self): ''' 测试用例执行完成后,清理测试环境 ''' self.common.recover_user(mid) self.common.closedriver()
class Common(): def __init__(self): self.log = Logger().get_logger() def platformLog(self,*arg): logStr = "" for v in arg: if type(v) != str: v = str(v) logStr = logStr + " " + v self.log.info(logStr) def setupdriver(self,agrs={}): '''初始化driver luadriver 用于游戏操作,对应appium ''' # 初始化Luadriver self.luaobj = LuaDriver() self.luaobj.creatLuaDriver(agrs) self.luadriver = self.luaobj.getLuaDriver() return self.luadriver def closedriver(self): '''关闭driver ''' self.luaobj.closeLuadriver() def closefloatBall(self): self.hall_page = Hall_Page() self.setting_page = Setting_Page() self.hall_page.wait_element("设置").click() try: self.setting_page.wait_element("关闭浮动球").click() except: print "浮动球已经关闭" try: self.setting_page.wait_element("页面返回").click() except: print "已经关闭" def deletefile(self,driver): print "----删除自动登录文件----" config = ConfigHelper(constant.cfg_path) package =config.getValue('appium', 'apppackage') command = "shell rm -r /mnt/sdcard/."+package+"/dict/lastLoginInfo.dat" print command try: driver.adb(command) except: print "命令执行失败" command1 = "shell rm -r /mnt/sdcard/."+package+"/dict/1lastLoginInfo.dat" print command1 try: driver.adb(command1) except: print "命令执行失败" command2 = "shell rm -r /mnt/sdcard/."+package+"/dict/2lastLoginInfo.dat" try: driver.adb(command2) except: print "命令执行失败" print command2 def closeactivity(self,luadriver): ''' 关闭活动页面 ''' self.hall_page = Hall_Page() time.sleep(20) # try: # if(self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")')!=None): # self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")').click() # except: # print "未出现允许按钮" self.hall_page.wait_element("头像",90) # try: # if(self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")')!=None): # self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")').click() # except: # print "未出现允许按钮" try: self.hall_page.wait_element("新手任务",8).click() except: print "未出现新手任务按钮" try: self.hall_page.wait_element("确认登陆",2).click() except: print "未出现登陆按钮" try: self.hall_page.wait_element("立即升级绑定账号",2).click() self.sign_page.wait_element("关闭1",2).click() except: print "未出现立即升级绑定账号按钮" #2017-9-27 JessicZeng 增加关闭版本升级框 try: self.hall_page.wait_element("资源下载-取消",2).click() except: print "未出现版本升级框" self.closeActivityBtn() # try: # luadriver.find_element_by_name("允许").click() # except: # print "未出现按钮" def closeactivity_switchserver(self,luadriver): ''' 关闭活动页面,切换到指定服,然后再关闭弹出的活动页面 :param luadriver: :param switchserver: :return: ''' self.closeactivity(luadriver) self.switchserver_init() self.closeactivity(luadriver) def switchserver(self): ''' 根据cfg文件切换正式服,测试服,预发布服 @return: ''' self.hall_page = Hall_Page() env = self.get_config_value('casecfg', 'env') if env=='0': try: self.hall_page.wait_element("正式服").click() except: print "切换到正式服失败" elif env =='1': try: self.hall_page.wait_element("测试服").click() except: print "切换到测试服失败" elif env =='2': try: self.hall_page.wait_element("预发布").click() except: print "切换到预发布失败" else: try: self.hall_page.wait_element("预发布").click() except: print "切换到预发布服失败" time.sleep(5) def switchserver_init(self): ''' 根据cfg文件切换正式服,测试服,预发布服 @return: ''' self.hall_page = Hall_Page() env = self.get_config_value('casecfg', 'env') if self.hall_page.element_is_exist("测试按钮"): self.hall_page.wait_element("测试按钮").click() if self.hall_page.element_is_exist("切换环境"): self.hall_page.wait_element("切换环境").click() if env == '0': try: # while self.hall_page.element_is_exist("正式1", 2): self.hall_page.get_element("正式1").click() except: print "切换到正式服失败" elif env == '1': try: # while self.hall_page.element_is_exist("测试1",2): self.hall_page.get_element("测试1").click() except: print "切换到测试服失败" elif env == '2': try: # while self.hall_page.element_is_exist("预发布1", 2): self.hall_page.get_element("预发布1").click() except: print "切换到预发布失败" else: try: # while self.hall_page.element_is_exist("预发布1", 2): self.hall_page.get_element("预发布1").click() except: print "切换到预发布服失败" else: self.hall_page.wait_element("关闭测试页面").click() if env=='0': try: self.hall_page.wait_element("正式服").click() except: print "切换到正式服失败" elif env =='1': try: self.hall_page.wait_element("测试服").click() except: print "切换到测试服失败" elif env =='2': try: self.hall_page.wait_element("预发布").click() except: print "切换到预发布失败" else: try: self.hall_page.wait_element("预发布").click() except: print "切换到预发布服失败" time.sleep(15) def closeActivityBtn(self): ''' 关闭活动弹框 :return: ''' self.sign_page = Sign_Page() self.hall_page = Hall_Page() try: self.hall_page.wait_element("新手任务",6).click() except: print "未出现新手任务按钮" i = 0 while (i < 5): i += 1 try: self.sign_page.wait_element("关闭1",3).click() except: print "关闭对话框" def switchnetwork(self, luadriver, network): ''' 测试用例运行过程中切换网络 ''' if(network == '无网络'): print "设置为无网络状态" luadriver.set_network_connection(ConnectionType.NO_CONNECTION) if(network == 'WIFI模式'): print "设置为WIFI模式" luadriver.set_network_connection(ConnectionType.WIFI_ONLY) if(network == '数据网络'): print "设置为数据网络模式" luadriver.set_network_connection(ConnectionType.DATA_ONLY) if(network == '飞行模式'): print "设置为飞行模式" luadriver.set_network_connection(ConnectionType.AIRPLANE_MODE) if(network == '全部网络打开模式'): print "设置为全部网络打开模式" luadriver.set_network_connection(ConnectionType.ALL_NETWORK_ON) def network_connect(self): ''' 2个线程的方式启动网络 ''' # print self.luadriver.network_connection if self.luadriver.network_connection != 2: t1 = threading.Thread(target=self.switch_network) t2 = threading.Thread(target=self.closebtn) t1.start() t2.start() t1.join() t2.join() def switch_network(self): ''' 测试用例运行过程中切换网络 ''' cmd = "shell am start -n com.example.unlock/.Unlock" print "adb start:" + str(time.time()) self.luadriver.adb(cmd) print "adb end:" + str(time.time()) def closebtn(self): time.sleep(1) print "closebtn" + str(time.time()) try: self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("确定|允许")').click() print "close1" + str(time.time()) except: print "1" + str(time.time()) try: self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("确定|允许")').click() print "close2" + str(time.time()) except: print "2" + str(time.time()) try: self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("确定|允许")').click() print "close3" + str(time.time()) except: print "3" + str(time.time()) def swipeelement(self,element1,element2): # swipe_startx = element1.location['x']+element1.size['width']/2 # swipe_starty = element1.location['y']+element1.size['height']/2 swipe_startx = element1.location['x'] swipe_starty = element1.location['y'] # swipe_endx = element2.location['x']+element1.size['width']/2 # swipe_endy = element2.location['y']+element1.size['height']/2 swipe_endx = element2.location['x'] swipe_endy = element2.location['y'] print swipe_startx, swipe_starty, swipe_endx, swipe_endy self.luadriver.swipe(swipe_startx, swipe_starty, swipe_endx, swipe_endy,1000) def get_user(self): ''' 获取账号信息 ''' global user_info user_info = user_util.gimme_afree_account() while user_info ==None: time.sleep(5) user_info = user_util.gimme_afree_account() return user_info def release_user(self,user): ''' 释放用户 ''' print "release" print user try: user_util.release_account(user) except: print "release user fail" def get_cid(self): '''获取用户cid''' self.personinfo_page = Personinfo_Page() self.personinfo_page.wait_element("头像").click() cid = self.personinfo_page.wait_element("账号ID").get_attribute('text') print "获取的用户cid为: %s" % cid self.personinfo_page.wait_element("关闭").click() if (self.personinfo_page.element_is_exist("关闭")): # 如果弹破产弹框,则关闭 self.personinfo_page.wait_element("关闭").click() return cid def get_mid(self): cid = self.get_cid() time.sleep(3) config = ConfigHelper(constant.cfg_path) region = config.getValue('casecfg', 'region') mid = PHPInterface.get_mid(cid, region) print "用户mid为:%s" % mid return mid def set_coin(self,mid,value): # 获取用户银币信息 result_userinfo = PHPInterface.get_user_info(mid) myuser_info = json.loads(result_userinfo) coin = myuser_info.get('result', {'coin': None}).get('coin') AddMoney = int(value) - int(coin) result = PHPInterface.add_money(mid, AddMoney) print "用户银币数为:%s" % AddMoney,"加金币执行结果:",result def set_crystal(self,mid,value): # 设置金条数据 result_userinfo = PHPInterface.get_user_info(mid) myuser_info = json.loads(result_userinfo) crystal = myuser_info.get('result', {'crystal': None}).get('crystal') # 获取当前金条值 print "用户金条数为:%s" % crystal AddMoney = int(value) - int(crystal) PHPInterface.add_crystal(mid, AddMoney) def loginuser(self,user,passwd): self.login_page = Login_Page() self.setting_page = Setting_Page() self.hall_page = Hall_Page() time.sleep(6) self.setting_page.wait_element("切换账号").click() time.sleep(2) try: self.setting_page.wait_element("继续登录").click() except: print "不需要继续切换" try: self.setting_page.wait_element("删除历史账号").click() except: print "无历史账号" time.sleep(1) self.setting_page.wait_element("手机号码").send_keys(user) time.sleep(1) self.setting_page.wait_element("密码").send_keys(passwd) time.sleep(1) self.setting_page.wait_element("确认登陆").click() time.sleep(10) self.hall_page.wait_element("同步标志") time.sleep(1) def get_idle_userinfo_and_mid(self): ''' 获取一个空闲账号的mid :return: ''' user_info = self.get_user() print user_info UserCID = user_info.get('cid') config = ConfigHelper(cfg_path) region = config.getValue('casecfg', 'region') UserMID = PHPInterface.get_mid(UserCID, region) mid_and_userinfo = {} mid_and_userinfo['userinfo'] = user_info mid_and_userinfo['mid'] = UserMID return mid_and_userinfo def unlock(self): #解锁 self.luadriver.adb("shell am start -n com.example.unlock/.Unlock") time.sleep(4) self.luadriver.keyevent(3) # home time.sleep(3) self.luadriver.adb("shell am start -n com.example.unlock/.Unlock") self.luadriver.keyevent(3) # home time.sleep(3) print "读配置,拉起游戏" config=ConfigHelper(constant.cfg_path) self.luadriver.start_activity(config.getValue('appium','apppackage'), config.getValue('appium','appactivity')) def get_config_value(self,section,key): #从cfg.ini文件获取配置项的值 config = ConfigHelper(constant.cfg_path) value =config.getValue(section, key) return value def set_config_value(self,section,key,value): #设置cfg.ini文件获取配置项的值 config = ConfigHelper(constant.cfg_path) config.modifConfig(section, key,value) return True def recover_user(self,mid): #初始化用户 self.set_coin(mid,'10000') self.set_crystal(mid,"0") PHPInterface.set_vip(mid,"-1") self.set_safeBoxMoney(mid,0,0) self.set_safeBoxMoney(mid,0,1) def random_str(self,len): '''生成随机字符''' str = "" for i in range(len): str += (random.choice("safsdfsdfoewrweorewcvmdfadfdsafdskafaklvoreiutwuerpmvcmvasieqwoejandfsxmndje")) return str def set_safeBoxMoney(self,mid, money, money_type): #money_type=0银币,1为金条 safeBoxInfo = PHPInterface.get_safebox(mid) if money_type == 0: safeBoxMoney=int(safeBoxInfo.get("safebox")) else: safeBoxMoney = int(safeBoxInfo.get("crystalsafebox")) if safeBoxMoney - money > 0: PHPInterface.withdraw_safebox(mid, safeBoxMoney - money, money_type) if money_type ==0: PHPInterface.add_money(mid, -(safeBoxMoney - money)) else: PHPInterface.add_crystal(mid, -(safeBoxMoney - money)) else: if money_type ==0: PHPInterface.add_money(mid, money - safeBoxMoney) else: PHPInterface.add_crystal(mid, money - safeBoxMoney) PHPInterface.deposit_safebox(mid, money - safeBoxMoney, money_type) def room_set_cheat(self, game_list, switch=1): for i in range(len(game_list)): gameId = filter(lambda ch: ch in '0123456789', game_list[i].get_attribute("name")) if switch == 1: print "设置子游戏:%s 标准场为作弊场" % gameId else: print "设置子游戏:%s 标准场为非作弊场" % gameId for i in range(4): PHPInterface.set_cheat(gameid=gameId, playmode=i, switch=switch) def set_robot(self,gameid,level=12,robotflag=0): ''' 设置机器人开关 ''' gamecfg = PHPInterface.get_levelconfig(gameid, 0, 0, level) robotflag1 = gamecfg.get('values', {'ADDROBOTFLAG': None}).get('ADDROBOTFLAG') if (robotflag1 != robotflag): result = PHPInterface.set_robot_flag(gameid, 0, 0, level, robotflag=robotflag) print result return True def checkPopVisible(self,driver,page,flagElName="同步标志"): ''' 根据page同步标志判断弹框是否存在,直至元素不存在或者操作次数操作3次 :param page: 操作页 :param flagElName: 同步标志元素name :return: ''' cnt = 0 while cnt < 3: try: page.get_element(flagElName) if driver != None : driver.keyevent(4) print "关闭弹框",page except: break cnt = cnt + 1
class PerTest_QIPAIHALL_Rank(TestCase): ''' 排行榜操作 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 5 global rank_item_count rank_item_count = 4 #一页显示item个数 def pre_test(self): self.common = Common() self.hall_page = Hall_Page() self.rankPage = Rank_Page() def run_test(self): ''' 测试步骤 排行榜内容会重置,当关闭或切换tab后回到默认位置 eg。关闭后再打开默认显示今日内容 切换到新tag后,list index变为0 操作步骤: 1、检测同步标志是否出现 2、点击第一个item,操作加好友 然后关闭用户信息弹框回到排行榜页面 3、点击第二个item,操作举报(不良头像,然后点击举报按钮) 4、滑动列表到底 5、切换到富豪榜,滑动一页数据 6、切换到昨日排行榜,滑动昨日之富豪榜一页数据 7、切换tab到昨日收益榜 滑动一页数据 8、关闭弹框,返回大厅 ''' self.hall_page.wait_element("同步标志") #点击排行榜大厅入口,进入排行榜 self.start_step("点击大厅排行榜入口") self.common.sendTagBroadcast(EnumSceneName.Rank, EnumSceneType.Start) try: self.hall_page.get_element("排行榜", 0).click() time.sleep(2) self.rankPage.wait_element("同步标志") self.common.taskScreenShot("openRankPop.jpg") headEls = self.rankPage.get_elements("用户头像") # 查看排行第一的用户信息,并执行加好友操作 if len(headEls) >= 1: self.start_step("查看rank1的用户信息,并加为好友") headEls[0].click() self.rankPage.wait_element("用户信息框同步标志") self.common.taskScreenShot("playerInfoPop.jpg") time.sleep(1) self.rankPage.get_element("加好友", 0).click() time.sleep(1) self.rankPage.get_element("用户信息框关闭按钮", 0).click() # 查看排行第二的用户信息,并执行举报操作 if len(headEls) >= 2: self.start_step("查看rank2的用户信息,并执行查看举报弹框然后取消举报") headEls[1].click() self.rankPage.wait_element("用户信息框同步标志") time.sleep(1) self.rankPage.get_element("举报", 0).click() time.sleep(1) self.common.taskScreenShot("reportOtherpop.jpg") self.rankPage.wait_element("色情昵称").click() time.sleep(1) self.rankPage.get_element("取消举报", 0).click() # 滑动今日收益排行榜,并滑动到底 self.start_step("滑动今日收益榜,并滑动到底") self.common.taskScreenShot("todayIncomeRank.jpg") self.swipeListView(True) # 切换到昨日富豪榜,并将列表滑动一页 self.start_step("滑动一页昨日富豪榜") self.rankPage.get_element("日期", 0).click() time.sleep(1) self.common.taskScreenShot("yesterdayRegalRank.jpg") # 当文字发生改变时,表示切换成功 while self.rankPage.get_element("日期文字").get_attribute( "text") == '昨日': None self.swipeListView(False) # 返回大厅 self.rankPage.get_element("返回大厅", 0).click() except: self.common.platformLog("排行榜操作失败") finally: self.common.checkPopVisible(self.rankPage) self.hall_page.wait_element("同步标志") time.sleep(5) self.common.sendTagBroadcast(EnumSceneName.Rank, EnumSceneType.Stop) def swipeListView(self, loop): ''' 滑动指定列表 :param listName: 列表元素名 :param itemName: 列表item元素名 :param loop: 是否循环滑动到底 :return: ''' listView = None itemViews = None try: listView = self.rankPage.get_element("排行榜列表") # itemViews = self.rankPage.get_elements("排行榜item") except: self.common.platformLog("排行榜指定列表元素不存在,结束列表滑动测试") return cnt = 1 while cnt < 10: # for item in itemViews: # Common.printStr("item x y:",item.location["x"]," ",item.location["y"]) # self.com.swipeList(listView) # if loop == False: # break # itemViews = self.rankPage.get_elements("排行榜item") self.common.swipeList(listView) if loop == False: break cnt = cnt + 1 time.sleep(0.2) time.sleep(1)
class kick_base(TestCase): ''' 房间内踢人脚本基类 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 30 global mid global kickCard_cnt #各游戏对应id 203:斗地主,20:干瞪眼,7:血流成河, 2002:双扣 23:拖三批(七人焖鸡、斗鸡) # 2601:葫芦岛麻将 2603:K十五 25:升级 3:斗牛 #20:预发布环境有不能正常玩牌的子游戏,不进行测试 #23、3:每局游戏时间太短不足以操作玩家头像 global global_black_list global_black_list = ["game20", "game23", "game3"] # 为True,本地调试时不执行关闭活动弹框逻辑 global isDebug isDebug = False def pre_test(self): self.start_step("初始化环境") self.common = Common() self.hall_page = Hall_Page() self.game_page = Game_Page() self.yuepai_page = Yuepai_Page() self.backpack_page = Backpack_Page() self.start_step("初始化driver") global mid mid = self.common.get_config_value("casecfg", "mid") self.luadriver = self.common.setupdriver() if isDebug != True: self.common.closeactivity(self.luadriver) else: time.sleep(10) def wait_login_suc(self): '''等待大厅登录成功标志加载完成''' end_time = time.time() + 120 while True: try: if self.hall_page.element_is_exist("登录成功标志", 1): self.common.platformLog("大厅登录成功") return True elif self.hall_page.element_is_exist("重连游戏", 1): self.hall_page.get_element("重连游戏").click() time.sleep(2) elif self.hall_page.element_is_exist("重新登陆", 1): self.hall_page.get_element("重新登陆").click() time.sleep(2) except: self.common.platformLog("等待大厅登录成功过程中,获取元素失败") return False if time.time() > end_time: self.common.platformLog("大厅未在指定时间内登录成功") return False def changeServer(self): ''' 子游戏返回列表后通过切换环境,来确保每次都重新登录 避免某些接口设置不生效 默认从正式环境切换到当前测试环境 :return: ''' try: self.hall_page.wait_element("正式服").click() self.common.closeactivity(self.luadriver) except: print "切换到正式服失败" self.common.switchserver() self.common.closeactivity(self.luadriver) def set_PlayerData(self, VIPType, kickCnt): ''' 设置玩家VIP及踢人卡数量,由于有界面操作 只能放在进入大厅成功后调用 :param VIPCnt: 是否有VIP :param kickCnt: 踢人卡张数 踢人卡id为36 None:则是不设置踢人卡数量 :return: ''' self.start_step("设置玩家数据") if PHPInterface.set_vip(mid, VIPType) == 0: self.common.platformLog("接口设置VIP信息失败") return False else: self.common.platformLog("设置VIP状态成功") #目前道具接口有问题,设置为0 会返回失败 当设置数量为0时,强制返回True status = False if PHPInterface.add_props(mid, 36, kickCnt) == 0 and kickCnt != 0: self.common.platformLog("设置踢人卡数量失败") status = False else: global kickCard_cnt kickCard_cnt = kickCnt status = True self.common.platformLog("测试开始前设置被测玩家初始数据", mid, VIPType, kickCnt, "设置VIP和踢人卡结果:", status) return status def check_player_data(self, VIPType, kickCnt): ''' 检测当前用户数据是否与设置一致,若不一致则切换测试环境来刷新用户数据 :param VIPType: :param kickCnt: :return: ''' need_change = False if (VIPType in [4, 5, 6] and self.hall_page.element_is_exist("vip标识", 1)): #有VIP标识 pass elif (VIPType == -1 and self.hall_page.element_not_exist("vip标识", 1)): #无VIP标识 pass else: need_change = True if need_change == False and kickCnt != self.get_KickCnt(): need_change = True if need_change == True: self.changeServer() if self.wait_login_suc(): self.common.platformLog("切换测试环境后,大厅登录成功") return True else: self.common.platformLog("切换测试环境后,大厅登录失败") return False else: self.common.platformLog("玩家VIP和踢人卡数量正确,不需切换环境") return True def wait_in_game(self): ''' 等待牌局开始,超过60s 则返回失败,停止后续测试操作 :param gamePage 避免重复new :return: True:牌局中 False:未在牌局中 ''' gamePage = Game_Page() cnt = 0 isIn = False while cnt < 30: if self.el_not_exist(gamePage, "房间标志"): isIn = False break if self.el_not_exist(gamePage, "换桌") and self.el_not_exist( gamePage, "准备"): isIn = True print "牌局已经开始" break cnt += 1 time.sleep(1) self.common.platformLog("牌局是否进行中:", isIn) return isIn def el_not_exist(self, page, el_name): ''' 判断元素不存在 :param element: ''' try: if (page.get_element(el_name) == None): return True else: return False except: return True def set_Robot(self, gameid, basechiptype=0, playmode=1, roomlevel=1, robotflag=0): #七人焖鸡默认的七人玩法,对应的playmod是3 其余游戏均为0 if gameid == '23': playmode = 3 return PHPInterface.set_robot_flag(gameid, basechiptype, playmode, roomlevel, robotflag) def get_KickCnt(self): ''' :return: 踢人卡张数 默认为None 表示获取踢人卡失败 ''' self.start_step("获取玩家物品箱踢人卡数量") self.common.platformLog("开始获取踢人卡*************") kick_cnt = 0 try: self.hall_page.get_element("物品箱").click() self.backpack_page.wait_element("物品箱同步标志") item_namesEl = self.backpack_page.get_elements("item名称") item_cntsEl = self.backpack_page.get_elements("item数量") # 获取两个元素列表成功 index = 0 for el in item_namesEl: if el.get_attribute('text') == "踢人卡": kick_cnt = int(item_cntsEl[index].get_attribute('text')) break index += 1 except: self.common.platformLog("打开物品箱获取踢人卡数量失败") finally: self.common.checkPopVisible(self.luadriver, self.backpack_page) self.hall_page.wait_element("同步标志") self.common.platformLog("从物品箱获取到的踢人卡数量", kick_cnt) return kick_cnt def loop_GameList(self, testFunc, isNext, VIPType, kickCnt, def_black_list=None): game_list = self.game_page.get_game_list() for gameElement in game_list: try: gameId = gameElement.get_attribute("name") self.common.platformLog("当前测试子游戏:", gameId) #判断该子游戏是否是可测游戏 if def_black_list != None: black_list = def_black_list else: black_list = global_black_list if black_list != None and gameId in black_list: self.common.platformLog(gameId, "该子游戏不符合用例前置条件,不进行测试") continue #若从子游戏返回大厅后登录大厅失败,结束测试 if self.wait_login_suc(): self.common.platformLog("登录大厅成功") else: self.assert_equal("登录大厅失败,停止后续所有测试步骤", True, False) self.hall_page.screenshot("登录大厅失败.png") break #根据条件设置玩家数据 global kickCard_cnt if self.set_PlayerData(VIPType, kickCnt) == False: self.assert_equal(gameId + "设置玩家VIP信息失败", True, False) continue else: time.sleep(2) self.hall_page.wait_element("可点击标志", 2).click() time.sleep(1) if self.check_player_data(VIPType, kickCnt) == False: self.assert_equal(gameId + "玩家数据不匹配切换环境后,登录失败,退出该用例测试", True, False) break if isNext and self.hall_page.element_is_exist("右三角", 3): self.hall_page.get_element("右三角").click() time.sleep(1) self.common.platformLog("点击大厅子游戏入口") time.sleep(1) gameElement.click() if (self.game_page.game_is_download() == False): self.log_info("下载游戏ID:%s 失败" % gameId) self.game_page.screenshot(gameId + "_下载子游戏失败.png") try: self.hall_page.wait_element("关闭对话框").click() except: self.common.platformLog("关闭弹框") continue self.start_step("开启机器人") if self.set_Robot( re.search('\d+', gameId).group(), 0, 0, 12, 1): self.common.platformLog("开始机器人成功") else: self.assert_equal(gameId + "开启机器人失败", True, False) return 0 try: self.start_step("点击入口进入房间") if self.game_page.element_is_exist("新房间类型", 2): gameType_Els = self.game_page.get_elements("新房间类型") gameType_Els[0].click() elif self.game_page.element_not_exist("广播", 2): gameType_tabEls = self.game_page.game_play_way() gameType_tabEls[0][1].click() # 确保进入的是普通场 #点击房间场次,进入房间 if self.game_page.element_is_exist("新初级场场次", 2): self.game_page.get_element("新初级场场次").click() elif self.game_page.element_is_exist("房间场次", 2): self.game_page.get_element("房间场次").click() except: self.assert_equal(gameId + "大厅进入房间失败", True, False) self.game_page.screenshot(game_id + "_大厅进入房间失败" + ".png") try: self.start_step("开始具体子游戏操作:" + gameId) testFunc(gameId) except: self.game_page.screenshot(game_id + "_房间内操作子游戏失败" + ".png") self.assert_equal(gameId + "房间内操作子游戏失败", True, False) except: self.assert_equal(gameId + "子游戏循环操作失败", True, False) finally: while True: if self.hall_page.element_is_exist("排行榜", 5): break self.luadriver.back() def run_test_base(self, stepFunc, VIPType, kickCnt, def_black_list=None): ''' :param VIPType: VIP类型 :param kickCnt: 踢人卡数量 :param stepFunc: 具体测试步骤方法 :param def_black_list: 自定义子游戏黑名单 :return: ''' self.start_step("等待页面加载完成") # 若从子游戏返回大厅后登录大厅失败,结束测试 if self.wait_login_suc(): self.common.platformLog("run_test_base登录大厅成功") else: self.assert_equal("run_test_base登录大厅失败,停止后续所有测试步骤", True, False) self.hall_page.screenshot("登录大厅失败.png") return 0 time.sleep(8) self.loop_GameList(stepFunc, False, VIPType, kickCnt, def_black_list) try: self.hall_page.wait_element("右三角").click() time.sleep(8) self.loop_GameList(stepFunc, True, VIPType, kickCnt, def_black_list) except: self.common.platformLog("没有右三角按钮") def post_test(self): # ''' # 测试用例执行完成后,清理测试环境 # 设置VIP为过期状态,踢人卡数量为0 # ''' self.start_step("清理测试环境") self.set_PlayerData(-1, 0) self.common.set_coin(mid, '10000') self.common.closedriver()
class logout_base(TestCase): ''' 牌局开始后物理返回基类 ''' owner = "JessicZeng" status = EnumStatus.Design priority = EnumPriority.High timeout = 30 global isDebug isDebug = False def wait_in_game(self): ''' 等待牌局开始,超过60s 则返回失败,停止后续测试操作 :param gamePage 避免重复new :return: True:牌局中 False:未在牌局中 ''' gamePage = Game_Page() cnt = 0 isIn = False while cnt < 30: if self.el_not_exist(gamePage,"房间标志"): isIn = False break; if self.el_not_exist(gamePage, "换桌") and self.el_not_exist(gamePage, "准备"): isIn = True break cnt += 1 time.sleep(1) self.common.platformLog("牌局是否进行中:", isIn) return isIn def el_not_exist(self,page, el_name): ''' 判断元素不存在 :param element: ''' try: if (page.get_element(el_name) == None): return True else: return False except: return True def set_Robot(self, gameid, basechiptype=0, playmode=1, roomlevel=1, robotflag=0): #七人焖鸡默认的七人玩法,对应的playmod是3 其余游戏均为0 if gameid == '23': playmode = 3 return PHPInterface.set_robot_flag(gameid,basechiptype,playmode,roomlevel,robotflag) def pre_test(self): self.common = Common() self.hall_page = Hall_Page() self.game_page = Game_Page() self.yuepai_page = Yuepai_Page() self.start_step("初始化driver") global mid mid = self.common.get_config_value("casecfg", "mid") self.common.set_coin(mid, 10000) self.luadriver = self.common.setupdriver() if isDebug != True: self.common.closeactivity(self.luadriver) else : time.sleep(15) self.common.platformLog("开始设置游戏币") def loop_GameList(self,testFunc,isNext = False, black_list = None): self.common.platformLog("开始循环子游戏") game_list = self.game_page.get_game_list() for gameElement in game_list: try: gameId = gameElement.get_attribute("name") self.common.platformLog("当前测试子游戏:",gameId) if black_list != None and gameId in black_list : self.common.platformLog(gameId,"该游戏玩牌异常,不进行测试") continue self.common.platformLog("点击大厅子游戏入口") if self.hall_page.element_is_exist("登录成功标志", 90): self.common.platformLog("登录大厅成功") else: self.assert_equal("登录大厅失败", True, False) self.hall_page.screenshot("登录大厅失败.png") return 0 time.sleep(1) if isNext and self.hall_page.element_is_exist("右三角",3): self.hall_page.get_element("右三角").click() time.sleep(1) gameElement.click() if (self.game_page.game_is_download() == False): self.log_info("下载游戏ID:%s 失败" % gameId) self.game_page.screenshot(gameId + "_open_failed.png") try: self.hall_page.wait_element("关闭对话框").click() except: self.common.platformLog("关闭弹框") continue self.start_step("开启机器人") if self.set_Robot(re.search('\d+', gameId).group(), 0, 0, 12, 1) : self.common.platformLog("开始机器人成功") else : self.assert_equal(gameId + "开启机器人失败", True, False) return 0 # 适应斗地主新界面,进入房间 try: self.start_step("点击入口进入房间") #选择房间类型 if self.game_page.element_is_exist("新房间类型", 2): gameType_Els = self.game_page.get_elements("新房间类型") gameType_Els[0].click() elif self.game_page.element_not_exist("广播",2): gameType_tabEls = self.game_page.game_play_way() if gameType_tabEls != None and len(gameType_tabEls) > 0 : gameType_tabEls[0][1].click() # 确保进入的是普通场 #点击房间场次,进入房间 if self.game_page.element_is_exist("新初级场场次", 2): self.game_page.get_element("新初级场场次").click() elif self.game_page.element_is_exist("房间场次", 2): self.game_page.get_element("房间场次").click() except: self.assert_equal(gameId + "大厅进入房间失败", True, False) self.game_page.screenshot(game_id + "大厅进入房间失败" + ".png") try: self.start_step("开始具体子游戏操作:" + gameId) testFunc(gameId) except: self.game_page.screenshot(game_id + "房间内操作子游戏失败" + ".png") self.assert_equal(gameId + "房间内操作子游戏失败", True, False) except: self.assert_equal(gameId + "子游戏循环操作失败", True, False) finally: while True: if self.hall_page.element_is_exist("排行榜", 5): break self.luadriver.back() def run_test_base(self,stepFunc,black_list): ''' :param VIPType: VIP类型 :param kickCnt: 踢人卡数量 :param stepFunc: 具体测试步骤方法 :return: ''' self.start_step("等待页面加载完成") if self.hall_page.element_is_exist("登录成功标志", 90): self.common.platformLog("登录大厅成功") else: self.assert_equal("登录大厅失败", True, False) self.hall_page.screenshot("登录大厅失败.png") return 0 time.sleep(8) self.loop_GameList(stepFunc,False, black_list) try: self.hall_page.wait_element("右三角").click() time.sleep(8) self.loop_GameList(stepFunc,True, black_list) except: self.common.platformLog("没有右三角按钮") def post_test(self): # ''' # 测试用例执行完成后,清理测试环境 # ''' self.common.recover_user(mid) self.common.closedriver()
class Common(): def setupdriver(self,agrs={}): '''初始化driver luadriver 用于游戏操作,对应appium ''' # 初始化Luadriver self.luaobj = LuaDriver() self.luaobj.creatLuaDriver(agrs) self.luadriver = self.luaobj.getLuaDriver() return self.luadriver def closedriver(self): '''关闭driver ''' self.luaobj.closeLuadriver() def closefloatBall(self): self.hall_page = Hall_Page() self.setting_page = Setting_Page() self.hall_page.wait_element("设置").click() time.sleep(2) try: self.setting_page.wait_element("关闭浮动球").click() except: print "浮动球已经关闭" time.sleep(3) try: self.setting_page.wait_element("页面返回").click() except: print "已经关闭" time.sleep(2) def deletefile(self,driver): print "----删除自动登录文件----" config = ConfigHelper(constant.cfg_path) package =config.getValue('appium', 'apppackage') #正式服 command = "shell rm -r /mnt/sdcard/."+package+"/dict/lastLoginInfo.dat" # command = "shell rm -r /mnt/sdcard/.com.boyaa.engineqpsc/dict/lastLoginInfo.dat" print command try: driver.adb(command) except: print "命令执行失败" #预发布 1lastLoginInfo.dat command1 = "shell rm -r /mnt/sdcard/."+package+"/dict/1lastLoginInfo.dat" print command1 try: driver.adb(command1) except: print "命令执行失败" # 预发布 2lastLoginInfo.dat command2 = "shell rm -r /mnt/sdcard/."+package+"/dict/2lastLoginInfo.dat" try: driver.adb(command2) except: print "命令执行失败" print command2 def closeactivity(self,luadriver): ''' 关闭活动页面 ''' self.hall_page = Hall_Page() time.sleep(1) # try: # if(self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")')!=None): # self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")').click() # except: # print "未出现允许按钮" self.hall_page.wait_element("头像",90) # try: # if(self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")')!=None): # self.luadriver.find_element_by_android_uiautomator('new UiSelector().textMatches("允许")').click() # except: # print "未出现允许按钮" try: self.hall_page.wait_element("新手任务",6).click() except: print "未出现新手任务按钮" try: self.hall_page.wait_element("确认登陆",6).click() except: print "未出现登陆按钮" try: self.hall_page.wait_element("立即升级绑定账号",6).click() self.sign_page.wait_element("关闭1").click() except: print "未出现立即升级绑定账号按钮" self.closeActivityBtn() # try: # luadriver.find_element_by_name("允许").click() # except: # print "未出现按钮" def closeactivity_switchserver(self,luadriver): ''' 关闭活动页面,切换到指定服,然后再关闭弹出的活动页面 :param luadriver: :param switchserver: :return: ''' self.closeactivity(luadriver) self.switchserver() self.closeactivity(luadriver) def switchserver(self): ''' 根据cfg文件切换正式服,测试服,预发布服 @return: ''' self.hall_page = Hall_Page() env = self.get_config_value('casecfg', 'env') if self.hall_page.element_is_exist("测试按钮"): self.hall_page.wait_element("测试按钮").click() if self.hall_page.element_is_exist("切换环境"): self.hall_page.wait_element("切换环境").click() if env == '0': try: while self.hall_page.element_is_exist("正式1", 2): self.hall_page.get_element("正式1").click() except: print "切换到正式服失败" elif env == '1': try: while self.hall_page.element_is_exist("测试1",2): self.hall_page.get_element("测试1").click() except: print "切换到测试服失败" elif env == '2': try: while self.hall_page.element_is_exist("预发布1", 2): self.hall_page.get_element("预发布1").click() except: print "切换到预发布失败" else: try: while self.hall_page.element_is_exist("预发布1", 2): self.hall_page.get_element("预发布1").click() except: print "切换到预发布服失败" else: self.hall_page.wait_element("关闭测试页面").click() if env=='0': try: self.hall_page.wait_element("正式服").click() except: print "切换到正式服失败" elif env =='1': try: self.hall_page.wait_element("测试服").click() except: print "切换到测试服失败" elif env =='2': try: self.hall_page.wait_element("预发布").click() except: print "切换到预发布失败" else: try: self.hall_page.wait_element("预发布").click() except: print "切换到预发布服失败" time.sleep(5) def closeActivityBtn(self): ''' 关闭活动弹框 :return: ''' self.hall_page = Hall_Page() self.sign_page = Sign_Page() i = 0 while (i < 4): i += 1 try: self.sign_page.wait_element("关闭1").click() time.sleep(1) except: try: self.sign_page.wait_element("关闭1").click() time.sleep(1) except: print "关闭对话框" def closeactivity_switchserver_reservenotice(self,luadriver,switchserver):#切换服务器但保留公告页面 self.hall_page = Hall_Page() self.sign_page = Sign_Page() time.sleep(15) try: luadriver.find_element_by_name("允许").click() except: print "未出现按钮" time.sleep(5) try: self.hall_page.wait_element("确认登陆").click() except: print "未出现登陆按钮" i = 0 while (i < 3): i += 1 try: self.sign_page.wait_element("关闭1").click() time.sleep(1) except: try: self.sign_page.wait_element("关闭1").click() time.sleep(1) except: print "关闭对话框" try: self.hall_page.wait_element("新手任务").click() time.sleep(2) except: print "未出现新手任务按钮" try: luadriver.find_element_by_name("允许").click() except: print "未出现按钮" try: self.hall_page.wait_element(switchserver).click() time.sleep(1) except: print "未出现%s按钮"%switchserver time.sleep(15) try: luadriver.find_element_by_name("允许").click() except: "未出现按钮" time.sleep(2) def switchnetwork(self,luadriver, network): ''' 测试用例运行过程中切换网络 ''' if(network == '无网络'): print "设置为无网络状态" luadriver.set_network_connection(ConnectionType.NO_CONNECTION) # print luadriver.network_connection if(network == 'WIFI模式'): print "设置为WIFI模式" luadriver.set_network_connection(ConnectionType.WIFI_ONLY) if(network == '数据网络'): print "设置为数据网络模式" luadriver.set_network_connection(ConnectionType.DATA_ONLY) if(network == '飞行模式'): print "设置为飞行模式" luadriver.set_network_connection(ConnectionType.AIRPLANE_MODE) if(network == '全部网络打开模式'): print "设置为全部网络打开模式" luadriver.set_network_connection(ConnectionType.ALL_NETWORK_ON) def isloginuser(self,luadriver): ''' 判断是否是注册账号登陆,如果不是则切换到注册账号 :param user: :param passwd: :return: ''' self.login_page = Login_Page() self.setting_page = Setting_Page() self.hall_page = Hall_Page() # # 每个用例都需要关闭活动,把这个放在初始化里面实现 # self.closeactivity(luadriver) self.hall_page.wait_element("头像").click() time.sleep(6) try: if(self.setting_page.wait_element("立即升级").get_attribute('text') != u"立即升级"): return True else: return False except: return False def loginuser(self,user,passwd): self.login_page = Login_Page() self.setting_page = Setting_Page() self.hall_page = Hall_Page() time.sleep(6) self.setting_page.wait_element("切换账号").click() time.sleep(2) try: self.setting_page.wait_element("继续登录").click() except: print "不需要继续切换" try: self.setting_page.wait_element("删除历史账号").click() except: print "无历史账号" time.sleep(1) self.setting_page.wait_element("手机号码").send_keys(user) time.sleep(1) self.setting_page.wait_element("密码").send_keys(passwd) time.sleep(1) self.setting_page.wait_element("确认登陆").click() time.sleep(10) self.hall_page.wait_element("同步标志") time.sleep(1) def swipeelement(self,element1,element2): # element1_size_width = element1.size['width'] # element1_size_height = element1.size["height"] # element1_1_x = element1.location["x"] # element1_1_y = element1.location["y"] # swipe_startx = element1.location['x']+element1.size['width']/2 # swipe_starty = element1.location['y']+element1.size['height']/2 swipe_startx = element1.location['x'] swipe_starty = element1.location['y'] # swipe_endx = element2.location['x']+element1.size['width']/2 # swipe_endy = element2.location['y']+element1.size['height']/2 swipe_endx = element2.location['x'] swipe_endy = element2.location['y'] print swipe_startx, swipe_starty, swipe_endx, swipe_endy self.luadriver.swipe(swipe_startx, swipe_starty, swipe_endx, swipe_endy,1000) def restart(self): self.luaobj = LuaDriver() self.luaobj.closeLuadriver() self.luaobj.creatLuaDriver() self.luadriver = self.luaobj.getLuaDriver() self.closeActivityBtn() return self.luadriver def random_str(self,len): '''生成随机字符''' str = "" for i in range(len): str += (random.choice("safsdfsdfoewrweorewcvmdfadfdsafdskafaklvoreiutwuerpmvcmvasieqwoejandfsxmndje")) return str def getdata(self,string): string1 = string.encode('gbk') print type(string1) data = filter(str.isdigit, string1) print data return data def closeactivityprepublish(self, luadriver): self.hall_page = Hall_Page() self.sign_page = Sign_Page() try: luadriver.find_element_by_name("允许").click() except: "未出现按钮" time.sleep(5) try: self.hall_page.wait_element("立即升级绑定账号").click() time.sleep(1) self.sign_page.wait_element("关闭1").click() except: print "未出现立即升级绑定账号按钮" try: luadriver.find_element_by_name("允许").click() except: "未出现按钮" try: self.hall_page.wait_element("确认登陆").click() except: "未出现登陆按钮" self.closeActivityBtn() try: self.hall_page.wait_element("新手任务").click() time.sleep(2) except: print "未出现新手任务按钮" try: self.hall_page.wait_element("预发布").click() except: "未出现预发布按钮" time.sleep(5) try: luadriver.find_element_by_name("允许").click() except: "未出现按钮" time.sleep(5) try: luadriver.find_element_by_name("允许").click() except: "未出现按钮" time.sleep(2) try: self.hall_page.wait_element("立即升级绑定账号").click() time.sleep(1) self.sign_page.wait_element("关闭1").click() except: print "未出现立即升级绑定账号按钮" self.closeActivityBtn() def get_user(self): ''' 获取账号信息 @return: ''' global user_info user_info = user_util.gimme_afree_account() while user_info ==None: time.sleep(5) user_info = user_util.gimme_afree_account() return user_info def release_user(self,user_mid): print "release" print user_mid try: user_util.release_account(user_mid) except: print "release user fail" def get_cid(self): '''获取用户cid''' self.personinfo_page = Personinfo_Page() # self.start_step("获取用户mid") self.personinfo_page.wait_element("头像").click() time.sleep(6) cid = self.personinfo_page.wait_element("账号ID").get_attribute('text') print "获取的用户cid为: %s" % cid self.game_page.wait_element("关闭对话框").click() time.sleep(3) if (self.game_page.element_is_exist("关闭对话框")): # 如果弹破产弹框,则关闭 self.game_page.wait_element("关闭对话框").click() time.sleep(3) return cid 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 get_safebox_money(self): '''从保险箱取出全部存款''' self.safebox_page = Safebox_Page() # self.start_step("从保险箱取出所有存款") self.hall_page.wait_element("保险箱").click() time.sleep(2) self.safebox_page.wait_element("取出").click() if (self.safebox_page.element_is_exist("确定---保险箱")): slider = self.safebox_page.wait_element("滚动条") addgoldbtn = self.safebox_page.wait_element("增加金条/银条数目") x = slider.location['x'] y = slider.location['y'] x1 = addgoldbtn.location['x'] y1 = addgoldbtn.location['y'] self.luadriver.swipe(x, y, x1, y1) self.safebox_page.wait_element("确定---保险箱").click() time.sleep(2) self.luadriver.keyevent(4) else: print ("保险箱没有银币存款") time.sleep(2) self.luadriver.keyevent(4) def get_safebox_crystal(self): '''从保险箱取出全部金条''' self.safebox_page = Safebox_Page() self.hall_page.wait_element("保险箱").click() time.sleep(2) self.safebox_page.wait_element("金条保险箱").click() time.sleep(2) self.safebox_page.wait_element("取出").click() if (self.safebox_page.element_is_exist("确定---保险箱")): slider = self.safebox_page.wait_element("滚动条") addgoldbtn = self.safebox_page.wait_element("增加金条/银条数目") x = slider.location['x'] y = slider.location['y'] x1 = addgoldbtn.location['x'] y1 = addgoldbtn.location['y'] self.luadriver.swipe(x, y, x1, y1) self.safebox_page.wait_element("确定---保险箱").click() time.sleep(2) self.luadriver.keyevent(4) else: print ("保险箱没有金条存款") self.luadriver.keyevent(4) def get_game_list(self): ''' 获取当前界面子游戏列表名 :return: 游戏列表名 ''' self.game_page = Game_Page() elements = self.game_page.get_elements("子游戏列表") print len(elements) #去重,同时去除game0(约牌,比赛场)和game-1(更多游戏) elementsblack = ["game0","game-1"] game_list = [] for i in range(len(elements)): name =elements[i].get_attribute("name") print name if name not in elementsblack: elementsblack.append(name) game_list.append(elements[i]) print len(game_list) return game_list def get_config_value(self,section,key): #从cfg.ini文件获取配置项的值 config = ConfigHelper(constant.cfg_path) value =config.getValue(section, key) return value def get_cid(self): '''获取用户cid''' self.personinfo_page = Personinfo_Page() self.personinfo_page.wait_element("头像").click() cid = self.personinfo_page.wait_element("账号ID").get_attribute('text') print "获取的用户cid为: %s" % cid self.personinfo_page.wait_element("关闭").click() if (self.personinfo_page.element_is_exist("关闭")): # 如果弹破产弹框,则关闭 self.personinfo_page.wait_element("关闭").click() return cid def get_mid(self): cid = self.get_cid() time.sleep(3) config = ConfigHelper(constant.cfg_path) region = config.getValue('casecfg', 'region') mid = PHPInterface.get_mid(cid, region) print "用户mid为:%s" % mid return mid def set_coin(self,mid,value): # 获取用户银币信息 result_userinfo = PHPInterface.get_user_info(mid) myuser_info = json.loads(result_userinfo) coin = myuser_info.get('result', {'coin': None}).get('coin') AddMoney = int(value) - int(coin) result = PHPInterface.add_money(mid, AddMoney) # print "用户银币数为:%s" % AddMoney def set_crystal(self,mid,value): # 设置金条数据 result_userinfo = PHPInterface.get_user_info(mid) myuser_info = json.loads(result_userinfo) crystal = myuser_info.get('result', {'crystal': None}).get('crystal') # 获取当前金条值 print "用户金条数为:%s" % crystal AddMoney = int(value) - int(crystal) PHPInterface.add_crystal(mid, AddMoney) def set_config_value(self,section,key,value): #设置cfg.ini文件获取配置项的值 config = ConfigHelper(constant.cfg_path) config.modifConfig(section, key,value) return True def recover_user(self,mid): #初始化用户 self.set_coin(mid,'10000') self.set_crystal(mid,"0") PHPInterface.set_vip(mid,"-1") self.set_safeBoxMoney(mid,0,0) self.set_safeBoxMoney(mid,0,1) def set_safeBoxMoney(self, mid, money, money_type): # money_type=0银币,1为金条 safeBoxInfo = PHPInterface.get_safebox(mid) if money_type == 0: safeBoxMoney = int(safeBoxInfo.get("safebox")) else: safeBoxMoney = int(safeBoxInfo.get("crystalsafebox")) if safeBoxMoney - money > 0: PHPInterface.withdraw_safebox(mid, safeBoxMoney - money, money_type) if money_type == 0: PHPInterface.add_money(mid, -(safeBoxMoney - money)) else: PHPInterface.add_crystal(mid, -(safeBoxMoney - money)) else: if money_type == 0: PHPInterface.add_money(mid, money - safeBoxMoney) else: PHPInterface.add_crystal(mid, money - safeBoxMoney) PHPInterface.deposit_safebox(mid, money - safeBoxMoney, money_type)
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)