class Test_ProjectPage(): driver = AutoDriver() ProjectPage = ProjectPage() @allure.feature("项目管理模块") @allure.story("新建项目--正向用例") @allure.title("新建项目场景测试") def test_01_addProject(self): """ 用例描述: 测试点:新建项目 用例步骤:1、创建新项目 检验:1、获取当前最新项目的title,与project_name做比较 :return: """ project_name = "项目" + str(random.randint(0, 99)) # with allure.step("step1: 统计当前项目个数"): # old_project = self.ProjectPage.get_project_num() # except_num = old_project + 1 with allure.step("step1: 新建项目"): self.ProjectPage.add_project(project_name) with allure.step("step2: 获取当前最新的项目名称"): actual_name = self.ProjectPage.get_project_name() with allure.step("step3: 断言"): assert actual_name == project_name
class Test_DevicePage(): driver = AutoDriver() ProjectPage = ProjectPage() DevicesPage = DevicesPage() @allure.feature("设备管理模块") @allure.story("修改设备名称--正向用例") @allure.title("修改设备测试") def test_01_editDeviceName(self): """
class MyInfoPage(ElementLoader): driver = AutoDriver() ProjectPage = ProjectPage() def __init__(self): ElementLoader.__init__(self, self.__class__.__name__) @allure.step("进入个人中心页") def into_myInfo(self): """ 进入个人中心页面 :return: """ #判断是否在项目列表页面,在则返回True flag = self.ProjectPage.is_project_page() if flag: into_btn = self.driver.find_element_until_visibility( self.locator("into_myinfo")) self.driver.click(into_btn) else: return "不在项目列表页面" @allure.step("判断是否在个人中心页") def is_myInfoPage(self): """ 判断是否在个人中心页面 :return: """ flag = self.driver.is_element(self.locator("myinfo_flag"), 3) return flag @allure.step("退出登录") def logout(self): """ 退出登录 :return: """ #判断是否在个人中心页面 flag = self.is_myInfoPage() if flag: logout_btn = self.driver.find_element_until_visibility( self.locator("myinfo_logout")) self.driver.click(logout_btn) v_done = self.driver.find_element_until_visibility( self.locator("v_done")) self.driver.click(v_done) else: return "not found"
class TestSmoke(): """ 冒烟测试:正向流程 """ driver = AutoDriver() LoginPage = LoginPage() ProjectPage = ProjectPage() RoomPage = RoomPage() DevicePage = DevicePage() RulePage = RulePage() MyInfoPage = MyInfoPage() @pytest.mark.skip(reason='skip testing this') @allure.feature("登录模块") @allure.story("登录--正向用例") @allure.title("登录测试") def test_01_login(self): """ 用例描述: 测试点:登录 用例步骤:1、调起app,判断app是否处于登录页,否则则操作logout 检验:1、操作登录后判断是否进入项目列表页面 :return: """ #判断是否在登录页 flag = self.LoginPage.is_in_login_page() if flag: self.LoginPage.app_login("18002549655", "Hyp123456") else: self.MyInfoPage.into_myInfo() self.MyInfoPage.logout() self.LoginPage.app_login("18002549655", "Hyp123456") flag_assert = self.ProjectPage.is_project_page() assert flag_assert, '登录失败' @allure.feature("项目管理模块") @allure.story("新建项目--正向用例") @allure.title("新建酒店项目测试") def test_02_addHotelProject(self): """ 用例描述: 测试点:新建项目 用例步骤:1、创建新项目 检验:1、获取当前最新项目的title,与project_name做比较 :return: """ project_name = "自动化" + str(random.randint(0, 99)) + "_创建" + str(random.randint(0, 99)) # with allure.step("step1: 统计当前项目个数"): # old_project = self.ProjectPage.get_project_num() # except_num = old_project + 1 with allure.step("step1: 新建项目"): self.ProjectPage.add_project(project_name) with allure.step("step2: 获取当前最新的项目名称"): actual_name = self.ProjectPage.get_project_name() with allure.step("step3: 断言"): assert actual_name == project_name @allure.feature("项目管理模块") @allure.story("删除项目--正向用例") @allure.title("删除酒店项目测试") def test_03_removeHotelProject(self): """ 用例描述: 测试点:删除项目 用例步骤:1、选择上个用例新建的项目,进入对应房间,操作删除项目 检验:1、 :return: """ self.DevicePage.into_devicePage() self.DevicePage.into_room_more() self.DevicePage.del_room() actual_toast = self.DevicePage.remove_toast() assert actual_toast == '移除成功' @allure.feature("房间管理模块") @allure.story("修改房间名称--正向用例") @allure.title("修改房间名称测试") def test_04_changeRoomName(self): """ 用例描述: 测试点:修改房间名称 用例步骤:1、从项目列表进入房间,进入房间更多页,操作修改名称 校验:1、获取修改后的房间title,与修改的name作校验 :return: """ #进入设备列表页面 self.DevicePage.into_devicePage() #进入房间更多页 self.DevicePage.into_room_more() NewName = str(random.randint(0,99)) + "楼_" + "房间_" + str(random.randint(0,99)) self.DevicePage.set_room_name(NewName) #返回设备列表页面,获取其房间名称 self.DevicePage.go_back() actual_name = self.DevicePage.get_roomName() assert actual_name == NewName, "修改房间名称失败,期望:%s, 实际:%s" % (NewName, actual_name) @allure.feature("设备管理模块") @allure.story("修改设备名称--正向用例") @allure.title("修改设备名称测试") def test_05_changeDeviceName(self): """ 用例描述: 测试点:修改设备名称 用例步骤:1、选择某个设备进去更多页 校验:1、获取修改后的设备name,与修改的name作校验 :return: """ #进入设备列表页面 #self.DevicePage.into_devicePage() #选择第一个设备进入设备更多页 self.DevicePage.into_deviceMore_page() NewName = "米兰_" + str(random.randint(0,99)) + "_设备_" + str(random.randint(0,99)) self.DevicePage.set_device_name(NewName) #actual_toast = self.DevicePage.sucess_toast() self.DevicePage.go_back() actual_name = self.DevicePage.get_device_name() assert actual_name == NewName @allure.feature("设备管理模块") @allure.story("修改设备开关名称--正向用例") @allure.title("修改设备开关名称测试") def test_06_changeOnOffName(self): """ 用例描述: 测试点:修改设备开关名称 用例步骤:1、选择某个设备进入更多页,操作开关重命名修改 校验:1、获取修改后的设备开关name,与修改的name作校验 :return: """ #进入设备列表页面 #self.DevicePage.into_devicePage() #选择第一个设备进入设备更多页 self.DevicePage.into_deviceMore_page() NewName = "修改的" + str(random.randint(0,99)) + "_开关" + str(random.randint(0,99)) self.DevicePage.set_device_function_name(NewName) actual_toast = self.DevicePage.sucess_toast() assert actual_toast == "修改成功" #回到设备更多页 self.DevicePage.back() @allure.feature("设备管理模块") @allure.story("修改设备位置--正向用例") @allure.title("修改设备位置测试") def test_07_changeDeviceLocation(self): """ 用例描述: 测试点:修改设备位置 用例步骤:1、选择某个设备进入更多页,操作设备位置修改 校验:1、获取修改后的设备位置,与修改的位置作校验/获取toast :return: """ # 进入设备列表页面 #self.DevicePage.into_devicePage() # 选择第一个设备进入设备更多页 #self.DevicePage.into_deviceMore_page() self.DevicePage.set_device_location() actual_toast = self.DevicePage.sucess_toast() assert actual_toast == "修改成功" # 回到设备更多页 self.DevicePage.back() @allure.feature("设备管理模块") @allure.story("修改设备点位--正向用例") @allure.title("修改设备点位测试") def test_08_changeDevicePoint(self): """ 用例描述: 测试点:修改设备点位 用例步骤:1、选择某个设备进入更多页,操作设备点位修改 校验:1、获取修改后的点位,与修改的点位作校验 :return: """ # 进入设备列表页面 #self.DevicePage.into_devicePage() # 选择第一个设备进入设备更多页 #self.DevicePage.into_deviceMore_page() NewName = str(random.randint(0,99)) + "楼_" + str(random.randint(0,99)) + "房间" self.DevicePage.set_device_pointName(NewName) actual_toast = self.DevicePage.sucess_toast() assert actual_toast == "修改成功" # 回到设备更多页 self.DevicePage.go_back() # 回到设备单控页 self.DevicePage.go_back() # 回到设备列表页面 self.DevicePage.go_back() #@pytest.mark.skip(reason='skip testing this') @allure.feature("联动管理模块") @allure.story("新建联动--正向用例") @allure.title("新建一键联动测试") def test_09_add_oneKeyRule(self): """ 用例描述: 测试点:新建一键联动 用例步骤:1、新建一键联动 校验:1、拿到最新一键联动的名称与创建的名称做比较 :return: """ self.RulePage.into_rulePage() rule_name = "一键联动" + str(random.randint(0,99)) self.RulePage.into_oneKey_page() self.RulePage.into_cloud_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.add_one_key_type() self.RulePage.add_actionOrCondition("cloud",0,0,0,1,1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name, "新建一键联动失败, 期望: %s, 实际: %s" % (rule_name, actual_name) @allure.feature("联动管理模块") @allure.story("编辑联动--正向用例") @allure.title("编辑一键联动测试") def test_10_edit_oneKeyRule(self): """ 用例描述: 测试点:编辑一键联动 用例步骤:1、编辑一键联动:名称及条件动作 校验:1、拿到最新一键联动的名称与创建的名称做比较 :return: """ #self.RulePage.into_rulePage() rule_name = "修改" + str(random.randint(0,99)) + "_" + "一键" + str(random.randint(0,99)) self.RulePage.into_oneKey_page() self.RulePage.into_oneKey_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.add_actionOrCondition("cloud",1,0,0,1,1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @allure.feature("联动管理模块") @allure.story("删除联动--正向用例") @allure.title("删除一键联动测试") def test_11_del_oneKeyRule(self): """ 用例描述: 测试点:删除一键联动 用例步骤:1、删除一键联动 校验:1、toast校验 :return: """ #self.RulePage.into_rulePage() self.RulePage.into_oneKey_page() self.RulePage.into_oneKey_rule() self.RulePage.del_rule() actual_toast = self.RulePage.remove_toast() assert actual_toast == "删除成功" @allure.feature("联动管理模块") @allure.story("新建联动--正向用例") @allure.title("新建云端联动测试") def test_12_add_autoCloudRule(self): """ 用例描述: 测试点:新建云端联动 用例步骤:1、新建云端联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "云端联动" + str(random.randint(0,9999)) self.RulePage.into_autoRule_page() self.RulePage.into_cloud_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.add_actionOrCondition("cloud",0,0,0,0,1) self.RulePage.add_actionOrCondition("cloud",1,0,0,1,1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name, "新建云端自动化联动失败, 期望: %s, 实际: %s" % (rule_name, actual_name) @allure.feature("联动管理模块") @allure.story("编辑联动--正向用例") @allure.title("编辑云端联动测试") def test_13_edit_autoCloudRule(self): """ 用例描述: 测试点:编辑云端联动 用例步骤:1、拿到最新建的云端联动,进行编辑:联动名称、动作、条件 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "修改" + str(random.randint(0,99)) + "_" + "云端" + str(random.randint(0,99)) self.RulePage.into_auto_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.add_actionOrCondition("cloud",0,0,1,0,1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @allure.feature("联动管理模块") @allure.story("删除联动--正向用例") @allure.title("删除云端联动测试") def test_14_del_autoCloudRule(self): """ 用例描述: 测试点:删除云端联动 用例步骤:1、删除云端联动 校验:1、toast校验 :return: """ #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.del_rule() actual_toast = self.RulePage.remove_toast() assert actual_toast == "删除成功" @allure.feature("联动管理模块") @allure.story("新建联动--正向用例") @allure.title("新建A2本地联动测试") def test_15_add_autoA2LocalRule(self): """ 用例描述: 测试点:新建A2本地联动 用例步骤:1、新建A2本地联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "新建" + str(random.randint(0,99)) + "_A2本地_" + str(random.randint(0,99)) #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_select_local_rule("A2") self.RulePage.set_rule_name(rule_name) self.RulePage.add_actionOrCondition("A2",0,0,0,0,1) self.RulePage.add_actionOrCondition("A2",0,0,1,1,1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @allure.feature("联动管理模块") @allure.story("编辑联动--正向用例") @allure.title("编辑A2本地联动测试") def test_16_edit_autoA2LocalRule(self): """ 用例描述: 测试点:编辑A2本地联动 用例步骤:1、编辑A2本地联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "修改" + str(random.randint(0, 99)) + "_" + "A2本地" + str(random.randint(0, 99)) #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @allure.feature("联动管理模块") @allure.story("删除联动--正向用例") @allure.title("删除A2本地联动测试") def test_17_del_autoA2LocalRule(self): """ 用例描述: 测试点:删除A2本地联动 用例步骤:1、删除A2本地联动 校验:1、获取toast提示 :return: """ #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.del_rule() actual_toast = self.RulePage.remove_toast() assert actual_toast == "删除成功" @pytest.mark.skip(reason='skip testing this') @allure.feature("联动管理模块") @allure.story("新建联动--正向用例") @allure.title("新建罗马本地联动测试") def test_18_add_autoAylaLocalRule(self): """ 用例描述: 测试点:新建罗马本地联动 用例步骤:1、新建罗马本地联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "新建" + str(random.randint(0, 99)) + "_罗马本地_" + str(random.randint(0, 99)) #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_select_local_rule("ayla") self.RulePage.set_rule_name(rule_name) self.RulePage.add_actionOrCondition("ayla", 0, 0, 0, 0, 1) self.RulePage.add_actionOrCondition("ayla", 0, 0, 1, 1, 1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @pytest.mark.skip(reason='skip testing this') @allure.feature("联动管理模块") @allure.story("编辑联动--正向用例") @allure.title("编辑罗马本地联动测试") def test_19_edit_autoAylaLocalRule(self): """ 用例描述: 测试点:编辑罗马本地联动 用例步骤:1、编辑罗马本地联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "修改" + str(random.randint(0, 99)) + "_" + "罗马本地" + str(random.randint(0, 99)) #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @pytest.mark.skip(reason='skip testing this') @allure.feature("联动管理模块") @allure.story("删除联动--正向用例") @allure.title("删除罗马本地联动测试") def test_20_del_autoAylaLocalRule(self): """ 用例描述: 测试点:删除罗马本地联动 用例步骤:1、删除罗马本地联动 校验:1、获取toast提示 :return: """ #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.del_rule() actual_toast = self.RulePage.remove_toast() assert actual_toast == "删除成功" @allure.feature("联动管理模块") @allure.story("新建联动--正向用例") @allure.title("新建米兰本地联动测试") def test_21_add_autoAliLocalRule(self): """ 用例描述: 测试点:新建米兰本地联动 用例步骤:1、新建米兰本地联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "新建" + str(random.randint(0, 99)) + "_米兰本地_" + str(random.randint(0, 99)) #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_select_local_rule("ali") self.RulePage.set_rule_name(rule_name) self.RulePage.add_actionOrCondition("ali", 0, 0, 0, 0, 1) self.RulePage.add_actionOrCondition("ali", 1, 0, 1, 1, 1) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @allure.feature("联动管理模块") @allure.story("编辑联动--正向用例") @allure.title("编辑米兰本地联动测试") def test_22_edit_autoAliLocalRule(self): """ 用例描述: 测试点:编辑米兰本地联动 用例步骤:1、编辑米兰本地联动 校验:1、拿到最新联动的名称与创建的名称做校验 :return: """ rule_name = "修改" + str(random.randint(0, 99)) + "_" + "米兰本地" + str(random.randint(0, 99)) #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.set_rule_name(rule_name) self.RulePage.save_rule() actual_name = self.RulePage.get_rule_name() assert actual_name == rule_name @allure.feature("联动管理模块") @allure.story("删除联动--正向用例") @allure.title("删除米兰本地联动测试") def test_23_del_autoAliLocalRule(self): """ 用例描述: 测试点:删除米兰本地联动 用例步骤:1、删除米兰本地联动 校验:1、获取toast提示 :return: """ #self.RulePage.into_rulePage() self.RulePage.into_autoRule_page() self.RulePage.into_auto_rule() self.RulePage.del_rule() actual_toast = self.RulePage.remove_toast() self.DevicePage.back() self.DevicePage.back() assert actual_toast == "删除成功" @allure.feature("方案模块") @allure.story("分享方案--正向用例") @allure.title("分享方案") def test_24_sharePlan(self): """ 用例描述: 前置条件:房间下有设备 测试点:分享方案 用例步骤:1、进入房间更多页,进入方案设置页,操作分享方案 校验:方案口令已复制 元素存在 :return: """ self.DevicePage.into_devicePage() self.DevicePage.into_room_more() self.DevicePage.into_plan_page() share_code = self.DevicePage.get_share_plan() self.DevicePage.go_to_room_list() self.DevicePage.go_back() assert share_code != None @allure.feature("方案模块") @allure.story("添加方案--正向用例") @allure.title("添加方案") #@pytest.mark.parametrize("plan_code", ["8659f82b95974d1b82449820b8e79822"]) def test_25_addPlan(self): """ 用例描述: 前置条件:先创建新房间 测试点:导入方案 用例步骤:1、先创建一个新房间,进入该房间,进行导入方案 :param plan_code: :return: """ plan_code = "8659f82b95974d1b82449820b8e79822" self.test_02_addProject() self.DevicePage.into_devicePage() self.DevicePage.into_room_more() self.DevicePage.into_plan_page() self.DevicePage.add_plan(plan_code) #actual_toast = self.DevicePage.add_sucess_toast() flag = self.DevicePage.is_add_plan_succ() assert flag self.DevicePage.go_back() self.DevicePage.go_back() self.test_03_removeProject() @allure.feature("项目管理") @allure.story("添加项目--正向用例") @allure.title("创建地产项目") def test_26_addEstateProject(self): """ 用例描述: 前置条件:切换到地产项目 测试点:创建地产项目 用例步骤:操作创建地产项目 校验:1、获取当前最新项目的title,与project_name做比较 :return: """ project_name = "自动化" + str(random.randint(0, 99)) + "_创建" + str(random.randint(0, 99)) self.ProjectPage.change_to_estate() self.ProjectPage.add_project(project_name) actual_name = self.ProjectPage.get_project_name() assert actual_name == project_name
class DevicePage(ElementLoader): driver = AutoDriver() #ElementLoader = ElementLoader() ProjectPage = ProjectPage() RoomPage = RoomPage() #device_names = driver.find_elements_until_visibility(ElementLoader.locator("device_name")) #more_btn = driver.find_element_until_visibility(ElementLoader.locator("room_more_btn")) def __init__(self): ElementLoader.__init__(self, self.__class__.__name__) @allure.step("进入设备列表页面") def into_devicePage(self): """ 进入设备列表页面 :return: """ #进入房间列表页面 self.ProjectPage.intoProjectInfo() #进入设备列表页面 self.RoomPage.into_rommPage() devicePage_btn = self.driver.find_element_until_visibility( self.locator("device_page")) self.driver.click(devicePage_btn) @allure.step("返回操作") def back(self): self.driver.click_device_btn(4) @allure.step("获取当前房间的name") def get_roomName(self): """获取当前房间name""" roomName_btn = self.driver.find_element_until_visibility( self.locator("roomName")) roomName = roomName_btn.text return roomName @allure.step("判断是否在device页面") def is_in_devicePage(self): """ 判断是否在device页面 :return: """ flag = self.driver.is_element(self.locator("device_page")) return flag @allure.step("获取设备名称") def get_device_name(self, num=0): """ 获取设备名称 :param num:默认获取第一个设备 :return: """ device_names = self.driver.find_elements_until_visibility( self.locator("device_name")) device_name = device_names[num].text return device_name @allure.step("获取设备数") def get_device_num(self): """ 获取设备 :return:设备数 """ #判断是否存在tv_device_online_status元素,不存在就返回0 device_names = self.driver.find_elements_until_visibility( self.locator("device_name")) flag = self.driver.is_element(self.locator("device_status")) if flag: device_nums = len(device_names) else: device_nums = 0 return device_nums @allure.step("设置房间名称") def set_room_name(self, roomName=None): """ 设置房间名称 :return: """ room_name_btn = self.driver.find_element_until_visibility( self.locator("room_name_btn")) self.driver.click(room_name_btn) roomName_text = self.driver.find_element_until_visibility( self.locator("name_text")) self.driver.send_keys(roomName_text, roomName) done_btn = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(done_btn) @allure.step("进入房间更多页") def into_room_more(self): """ 进入房间更多页 :return: """ roomMore_btn = self.driver.find_element_until_visibility( self.locator("room_more_btn")) self.driver.click(roomMore_btn) # flag = self.is_in_devicePage() # if flag: # # else: # return "not in devicePage" @allure.step("判断是否在房间更多页") def is_in_roomMorePage(self): """ 判断是否在房间更多页 :return: """ flag = self.driver.is_element(self.locator("room_name_btn")) return flag @allure.step("移除房间") def del_room(self): """ 删除房间 :return: """ flag = self.is_in_roomMorePage() if flag: remove_btn = self.driver.find_element_until_visibility( self.locator("btn_remove_room")) self.driver.click(remove_btn) v_done = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(v_done) else: return "not in roomMorePage" @allure.step("进入方案设置页") def into_plan_page(self): """ 进入方案分享页 :return: """ rl_room_plan = self.driver.find_element_until_visibility( self.locator("rl_room_plan")) rl_room_plan.click() @allure.step("添加方案") def add_plan(self, plan_code=None): """ 添加方案 :param plan_code: 方案包 :return: """ #判断房间是否已使用过方案,通过room_plan_type元素的text进行判断 room_plan_type_ele = self.driver.find_element_until_visibility( self.locator("room_plan_type")) room_plan_type_text = room_plan_type_ele.text if room_plan_type_text == "未使用": #操作添加方案按钮 add_plan_ele = self.driver.find_element_until_visibility( self.locator("add_plan")) self.driver.click(add_plan_ele) #输入方案包 code_text = self.driver.find_element_until_visibility( self.locator("code_text")) self.driver.send_keys(code_text, plan_code) #操作导入 done_btn = self.driver.find_element_until_visibility( self.locator("room_more_btn")) self.driver.click(done_btn) elif room_plan_type_text == "已使用": # 操作更换方案按钮 add_plan_ele = self.driver.find_element_until_visibility( self.locator("add_plan")) self.driver.click(add_plan_ele) #确定清空方案 v_done = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(v_done) # 输入方案包 code_text = self.driver.find_element_until_visibility( self.locator("code_text")) self.driver.send_keys(code_text, plan_code) # 操作导入 done_btn = self.driver.find_element_until_visibility( self.locator("room_more_btn")) self.driver.click(done_btn) @allure.step("分享方案") def get_share_plan(self): """ 分享方案 :return: """ #操作分享 share_btn = self.driver.find_element_until_visibility( self.locator("share_plan")) self.driver.click(share_btn) #获取分享码 share_code_flag = self.driver.is_element(self.locator("plan_code")) if share_code_flag: share_code_btn = self.driver.find_element_until_visibility( self.locator("plan_code")) share_code = share_code_btn.text else: share_code = None return share_code @allure.step("判断导入方案是否成功") def is_add_plan_succ(self): """ 判断待添加设备存在 :return: """ flag = self.driver.is_element(self.locator("device_no_add")) return flag @allure.step("返回房间列表页") def go_to_room_list(self): """ 前往房间列表 :return: """ v_done = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(v_done) @allure.step("进入设备更多页") def into_deviceMore_page(self, num=0): """ 进入设备更多页面,默认第一个设备 :param num: 默认第一个设备 :return: """ device_names = self.driver.find_elements_until_visibility( self.locator("device_name")) self.driver.click(device_names[num]) #time.sleep(2) #尝试切换context,用class_name不行,不切context使用原生的xpath可以,前提是包要确保需要开启webview远程调试功能:this.appView.setWebContentsDebuggingEnabled(true); #context = self.driver.get_all_contexts() #self.driver.switch_to_context("WEBVIEW_com.ayla.hotelsaas") #return context #判断当前是否存在设备更多页,false则是进入单控页 flag = self.driver.is_element(self.locator("device_more_title")) if flag: print("已进入设备更多页") else: more_btn = self.driver.find_element_until_visibility( self.locator("more_btn")) self.driver.click(more_btn) @allure.step("设置设备名称") def set_device_name(self, name=None): """ 设置设备名称 :param name: :return: """ #self.into_deviceMore_page(0) device_name_btn = self.driver.find_element_until_visibility( self.locator("device_name")) self.driver.click(device_name_btn) device_name_text = self.driver.find_element_until_visibility( self.locator("name_text")) self.driver.send_keys(device_name_text, name) done_btn = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(done_btn) @allure.step("设置开关重命名") def set_device_function_name(self, name=None): """ 设置开关重命名 :param name: :return: """ device_function_name = self.driver.find_element_until_visibility( self.locator("device_function_name")) self.driver.click(device_function_name) tv_nicknames = self.driver.find_elements_until_visibility( self.locator("tv_nickname")) self.driver.click(tv_nicknames[0]) nickname_text = self.driver.find_element_until_visibility( self.locator("name_text")) self.driver.send_keys(nickname_text, name) done_btn = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(done_btn) @allure.step("设置设备点位") def set_device_pointName(self, name=None): """ 设置设备点位 :param name: :return: """ rl_location = self.driver.find_element_until_visibility( self.locator("rl_location")) self.driver.click(rl_location) rl_region_name = self.driver.find_element_until_visibility( self.locator("rl_region_name")) self.driver.click(rl_region_name) region_name_text = self.driver.find_element_until_visibility( self.locator("name_text")) self.driver.send_keys(region_name_text, name) done_btn = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(done_btn) @allure.step("设置设备位置") def set_device_location(self, num=0): """ 设置设备位置 :param num: 默认设置第一个 :return: """ rl_location = self.driver.find_element_until_visibility( self.locator("rl_location")) self.driver.click(rl_location) device_location = self.driver.find_element_until_visibility( self.locator("device_location")) self.driver.click(device_location) device_location_types = self.driver.find_elements_until_visibility( self.locator("device_location_type")) self.driver.click(device_location_types[num]) @allure.step("返回操作") def go_back(self): """ 返回操作 :return: """ iv_left = self.driver.find_element_until_visibility( self.locator("iv_left")) self.driver.click(iv_left) # 以下用于toast验证 def remove_toast(self): """ 移除成功 :return: """ toast = self.driver.get_toast("移除成功").text return toast def sucess_toast(self): """ 修改成功 :return: """ toast = self.driver.get_toast("修改成功").text return toast def add_sucess_toast(self): """ 导入成功 :return: """ toast = self.driver.get_toast("导入成功").text
class RulePage(ElementLoader): driver = AutoDriver() ProjectPage = ProjectPage() RoomPage = RoomPage() def __init__(self): ElementLoader.__init__(self, self.__class__.__name__) @allure.step("进入规则模块") def into_rulePage(self): """ 进入规则模块 :return: """ # 进入房间列表页面 #self.ProjectPage.intoProjectInfo() # 进入设备列表页面 #self.RoomPage.into_rommPage() #进入规则列表页面 rulePage_btn = self.driver.find_element_until_visibility( self.locator("rule_page")) self.driver.click(rulePage_btn) @allure.step("进入一键联动列表") def into_oneKey_page(self): """ 进入一键联动列表 :return: """ onekey_page_btn = self.driver.find_element_until_visibility( self.locator("rule_onekey_list")) self.driver.click(onekey_page_btn) @allure.step("进入自动化列表页面") def into_autoRule_page(self): """ 进入自动化列表页面 :return: """ autoRule_page_btn = self.driver.find_element_until_visibility( self.locator("rule_auto_list")) self.driver.click(autoRule_page_btn) @allure.step("获取联动名称") def get_rule_name(self, num=0): """ 获取联动名称 :param num:默认为第一个 :return: 联动名称 """ rule_names = self.driver.find_elements_until_visibility( self.locator("device_names")) rule_name = rule_names[num].text return rule_name @allure.step("获取一键联动个数") def get_oneKey_rule_num(self): """ 从一键联动列表中获取一键联动的个数 :return: 一键联动的个数 """ oneKey_rules = self.driver.find_elements_until_visibility( self.locator("rule_names")) oneKey_rule_num = len(oneKey_rules) return oneKey_rule_num @allure.step("进入添加云端联动") def into_cloud_rule(self): """ 进入添加云端联动页面 :return: """ add_btn = self.driver.find_element_until_visibility( self.locator("add_btn")) self.driver.click(add_btn) cloud_rule_btn = self.driver.find_element_until_visibility( self.locator("cloud_rule_btn")) self.driver.click(cloud_rule_btn) @allure.step("进入添加本地联动") def into_local_rule(self, num=0): """ 进入添加本地联动页面,存在多个网关时,默认进入第一个 :return: """ add_btn = self.driver.find_element_until_visibility( self.locator("add_btn")) self.driver.click(add_btn) local_rule_btn = self.driver.find_element_until_visibility( self.locator("local_rule_btn")) self.driver.click(local_rule_btn) flag = self.driver.is_element(self.locator("select_net")) if flag: net_btn = self.driver.find_elements_until_visibility( self.locator("nets_icon")) self.driver.click(net_btn[num]) @allure.step("选择性进入本地联动添加页面") def into_select_local_rule(self, net_select='ayla'): """ 选择性进入本地联动添加页面 :param net_select: 默认进入罗马网关 :return: """ add_btn = self.driver.find_element_until_visibility( self.locator("add_btn")) self.driver.click(add_btn) local_rule_btn = self.driver.find_element_until_visibility( self.locator("local_rule_btn")) self.driver.click(local_rule_btn) flag = self.driver.is_element(self.locator("select_net")) if flag: if net_select == "ayla": ayla_net_btn = self.driver.find_element_until_visibility( self.locator("ayla_net")) self.driver.click(ayla_net_btn) elif net_select == "ali": ali_net_btn = self.driver.find_element_until_visibility( self.locator("ali_net")) self.driver.click(ali_net_btn) elif net_select == "A2": A2_net_btn = self.driver.find_element_until_visibility( self.locator("A2_net")) self.driver.click(A2_net_btn) else: return "暂无网关" else: return "not found" @allure.step("设置规则名称") def set_rule_name(self, ruleName=None): """ 设置规则名称 :return: """ rule_name_btn = self.driver.find_element_until_visibility( self.locator("rule_name")) self.driver.click(rule_name_btn) rule_name_text = self.driver.find_element_until_visibility( self.locator("rule_name_field")) self.driver.send_keys(rule_name_text, ruleName) ensure_btn = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(ensure_btn) @allure.step("添加一键执行按钮") def add_one_key_type(self): """ 条件添加一键执行按钮 :return: """ add_condition_btn = self.driver.find_element_until_visibility( self.locator("add_condition_btn")) self.driver.click(add_condition_btn) type_one_key = self.driver.find_element_until_visibility( self.locator("type_one_key")) self.driver.click(type_one_key) @allure.step("添加条件或动作") def add_actionOrCondition(self, rule_type="cloud", device_num=0, function1_num=0, function2_num=0, flag_AC=0, AC_num=1): """ 添加条件或动作 :param rule_type:联动的类型cloud:云端(会进入条件选择/动作选择页面),A2、米兰网关、罗马不会进入条件选择页面,A2、罗马会进入动作选择页 :param device_num:选择的设备,默认为第一个 :param function1_num:选择功能,默认第一个 :param function2_num:选择最终功能,默认第一个 :param flag_AC:默认为添加条件,值不为0是添加动作 :param AC_num:添加多少个,默认添加1个 :return: """ i = 0 while i < AC_num: if flag_AC == 0: """进入的是添加条件页面""" add_condition_btn = self.driver.find_element_until_visibility( self.locator("add_condition_btn")) self.driver.click(add_condition_btn) if rule_type == "cloud": # 进入选择设备功能页面 device_changed_btn = self.driver.find_element_until_visibility( self.locator("type_device_changed")) self.driver.click(device_changed_btn) else: """进入的是添加动作页面""" add_action_btn = self.driver.find_element_until_visibility( self.locator("add_action_btn")) self.driver.click(add_action_btn) if rule_type == "cloud" or rule_type == "A2" or rule_type == "ayla": # 进入选择设备功能页面 device_changed_btn = self.driver.find_element_until_visibility( self.locator("type_device_changed")) self.driver.click(device_changed_btn) flag = self.driver.is_element(self.locator("device_names")) if flag: device_names = self.driver.find_elements_until_visibility( self.locator("device_names")) self.driver.click(device_names[device_num]) function_name_btn = self.driver.find_elements_until_visibility( self.locator("function_name_btn")) self.driver.click(function_name_btn[function1_num]) cb_function_checkeds = self.driver.find_elements_until_visibility( self.locator("cb_function_checked")) self.driver.click(cb_function_checkeds[function2_num]) save_btn = self.driver.find_element_until_visibility( self.locator("save_btn")) self.driver.click(save_btn) else: print("暂无设备") i += 1 @allure.step("保存操作") def save_rule(self): """ 保存操作 :return: """ save_btn = self.driver.find_element_until_visibility( self.locator("save_btn")) self.driver.click(save_btn) @allure.step("统计联动个数") def rule_nums(self): """ 统计联动的个数:通过tv_device_name元素的个数统计 判断是否存在tv_device_name元素 :return: """ flag = self.driver.is_element(self.locator("device_names")) if flag: rule = self.driver.find_elements_until_visibility( self.locator("device_names")) rule_nums = len(oneKey) else: rule_nums = 0 return rule_nums @allure.step("获取某个联动的状态") def get_rule_status(self, mun=0): """ 获取某个联动当前的状态:开启/关闭 :param num:默认第一个 :return: """ flag = self.driver.is_element(self.locator("device_names")) if flag: rules = self.driver.find_elements_until_visibility( self.locator("rule_status")) rule_status = rules[mun].text return rule_status else: return "no rule" @allure.step("改变联动状态") def change_rule_status(self, num=0): """ 改变联动状态 :param mun:默认第一个 :return: """ flag = self.driver.is_element(self.locator("device_names")) if flag: status = self.driver.find_elements_until_visibility( self.locator("rule_status")) self.driver.click(status[num]) else: return "no rule" @allure.step("进入联动编辑页面") def into_auto_rule(self, num=0): """ 进入原有的联动(云端+本地)编辑页 :param num: 默认第一个 :return: """ rules = self.driver.find_elements_until_visibility( self.locator("device_names")) self.driver.click(rules[num]) @allure.step("进入一键联动编辑页面") def into_oneKey_rule(self, num=0): """ 进入原有的一键联动编辑页 :param num: 默认第一个 :return: """ edit_btn = self.driver.find_elements_until_visibility( self.locator("edit_onekey_btn")) self.driver.click(edit_btn[num]) #time.sleep(2) @allure.step("删除联动") def del_rule(self): """ 删除联动 :return: """ time.sleep(2) self.driver.swipe_control("u") #self.driver.swipeElement("rule_del_btn") # size = self.driver.getSize() # x = size['width'] # y = size['height'] # self.driver.swipe(x*0.5, y*0.5, x*0.5, y*0.2) rule_del_btn = self.driver.find_element_until_visibility( self.locator("rule_del_btn")) self.driver.click(rule_del_btn) ensure_btn = self.driver.find_element_until_visibility( self.locator("done_btn")) self.driver.click(ensure_btn) # 以下用于toast验证 def remove_toast(self): """ 删除成功 :return: """ toast = self.driver.get_toast("删除成功").text return toast
class Test_LoginPage(): driver = AutoDriver() LoginPage = LoginPage() ProjectPage = ProjectPage() # 截图相关 def add_img(self): self.imgs.append(self.driver.get_screenshot_by_base64()) return True # 截图相关 def cleanup(self): pass def setUp(self): print("登录页面:") self.imgs = [] # 截图相关 self.addCleanup(self.cleanup) # 截图相关 time.sleep(2) def tearDown(self): # self.driver.click_device_btn(4) pass def test_01_login(self): """账号为空""" self.LoginPage.app_login(login_data['account_null'], login_data['passwd_null']) expected_toast = toast_data['account_null'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.account_null_toast() print("实际的toast为", actual_toast) assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_02_login(self): """密码为空""" self.LoginPage.app_login(login_data['account_01'], login_data['passwd_null']) expected_toast = toast_data['password_null'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.password_null_toast() print("实际的toast为", actual_toast) assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_03_login(self): """错误的账号""" self.LoginPage.app_login(login_data['account_error'], login_data['passwd_error']) #self.driver.wait_activity_display('.ui.LoginActivity') expected_toast = toast_data['account_error'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.account_error_toast() print("实际的toast为", actual_toast) assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_04_login(self): """错误的密码""" self.LoginPage.app_login(login_data['account_01'], login_data['passwd_error']) #self.driver.wait_activity_display('.ui.LoginActivity') expected_toast = toast_data['password_error'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.password_error_toast() print("实际的toast为", actual_toast) assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_05_register(self): """ 错误的账号 """ self.LoginPage.user_register(register_data['register_user_name'], register_data['register_account_error'], register_data['register_pass_01']) expected_toast = toast_data['register_account_error'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.register_account_error_toast() print("实际的toast为", actual_toast) time.sleep(2) self.LoginPage.back_login_page() assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_06_register(self): """ 用户名为空 """ self.LoginPage.user_register(register_data['register_user_name_null'], register_data['register_account_01'], register_data['register_pass_01']) expected_toast = toast_data['register_user_null'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.register_username_null_toast() print("实际的toast为", actual_toast) time.sleep(2) self.LoginPage.back_login_page() assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_07_register(self): """ 密码小于6位 """ self.LoginPage.user_register(register_data['register_user_name'], register_data['register_account_01'], register_data['register_pass_error']) expected_toast = toast_data['register_pass_error'] print("期望的toast为", expected_toast) time.sleep(2) actual_toast = self.LoginPage.register_pass_error_toast() print("实际的toast为", actual_toast) time.sleep(2) self.LoginPage.back_login_page() assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_08_register(self): """注册成功""" self.LoginPage.user_register(register_data['register_username_02'], register_data['register_account_02'], register_data['register_pass_02']) self.driver.wait_activity_display(".ui.LoginActivity") expected_toast = toast_data['register_succ'] print("期望的toast为", expected_toast) time.sleep(4) actual_toast = self.LoginPage.register_succ_toast() print("实际的toast为", actual_toast) assert actual_toast == expected_toast, "验证结果,期望: %s, 实际: %s" % ( expected_toast, actual_toast) def test_09_login(self): """登录成功""" self.LoginPage.app_login(login_data['account_01'], login_data['passwd_01']) flag = self.ProjectPage.is_project_page() assert flag, '登录失败'