def wait_element_visibility(self, locator, img_info, timeout=20, poll_frequency=0.5): '''等待元素可见''' # 等待元素之前获取当前时间 start_time = time.time() try: ele_visibility = WebDriverWait( self.driver, timeout, poll_frequency).until( EC.visibility_of_element_located(locator)) except Exception as e: # 输出日志 log.error('元素--{}--等待可见超时'.format(locator)) log.exception(e) # 对当前页面进行截图 self.save_scree_imge(img_info) raise e else: # 元素等待出现之后获取实际时间 end_time = time.time() log.info('元素--{}--等待成功,耗时:{}秒'.format(locator, end_time - start_time)) return ele_visibility
def test_loans(self,cas): url = conf.get('env','url') + cas['url'] data = eval(cas['data']) headers = eval(conf.get('env','headers')) method = cas['method'] expected = eval(cas['expected']) row = cas['case_id'] + 1 respones = request(url=url,method=method,params=data,headers=headers) res = respones.json() try: self.assertEqual(expected['code'],res['code']) self.assertEqual(expected['msg'],res['msg']) #判断返回的数据条数 self.assertEqual(expected['len'],len(res['data'])) except AssertionError as e: log.error('用例--{}--未通过'.format(cas['title'])) log.debug('预期结果{}'.format(expected)) log.debug('实际结果{}:'.format(res)) log.exception(e) self.execl.write(row=row, column=8, value='不通过') raise e else: log.info('用例--{}--通过'.format(cas['title'])) self.execl.write(row=row, column=8, value='通过')
def test_audit(self, cas): url = conf.get('env', 'url') + cas['url'] method = cas['method'] data = eval(replace_data(cas['data'])) headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'admin_token') expected = eval(cas['expected']) row = cas['case_id'] + 1 respones1 = request(url=url, method=method, json=data, headers=headers) res1 = respones1.json() if cas['title'] == '审核通过' and res1['msg'] == 'OK': setattr(EnvData, 'pass_loan_id', str(data['loan_id'])) print('预期结果:', expected) print('实际结果:', res1) try: self.assertEqual(expected['code'], res1['code']) self.assertEqual(expected['msg'], res1['msg']) #判断审核状态是否符合预期的结果 if cas['check_sql']: sql = replace_data(cas['check_sql']) status = self.bb.find_one(sql)['status'] self.assertEqual(expected['status'], status) except AssertionError as e: log.error('这条用例{}没有通过'.format(cas['title'])) log.exception(e) self.exce.write(row=row, column=8, value='不通过') raise e else: log.info('这条用例{}执行通过'.format(cas['title'])) self.exce.write(row=row, column=8, value='通过')
def test_login(self, cas): url = cas['url'] method = cas['method'] headers = eval(conf.get('env', 'headers')) data = eval(cas['data']) expected = eval(cas['expected']) row = cas['case_id'] + 1 respons = request(url=url, method=method, json=data, headers=headers) res = respons.json() print('实际结果:', res) print('预期结果:', expected) try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) except AssertionError as e: log.error('用例{}没有通过,错误等级为error'.format(cas['title'])) log.debug('预期结果{}'.format(cas['expected'])) log.debug('实际结果{}'.format(res)) log.exception(e) self.excel.write(row=row, column=8, value='未通过') raise e else: log.info('用例{}执行通过'.format(cas['title'])) self.excel.write(row=row, column=8, value='通过')
def test_register(self, cas): url = cas['url'] method = cas['method'] if '#phone#' in cas['data']: phon = self.phone_replace() setattr(EnvData, 'mobile_phone', phon) cas['data'] = replace_data(cas['data']) data = eval(cas['data']) headers = eval(conf.get('env', 'headers')) expected = eval(cas['expected']) row = cas['case_id'] + 1 respones = request(url=url, method=method, json=data, headers=headers) res = respones.json() try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) if cas['check_sql']: sql = replace_data(cas['check_sql']) f = self.my.find_count(sql) self.assertEqual(1, f) except AssertionError as e: log.error('这条用例{}报错'.format(cas['title'])) log.exception(e) self.exce.write(row=row, column=8, value='不通过') raise e else: log.info('这条用例{}通过了'.format(cas['title'])) self.exce.write(row=row, column=8, value='通过')
def wait_element_visibility(self, locator, img_info, timeout=15, poll_frequency=0.5): """ 等待元素可见 :param locator: 定位表达式 :param img_info: 错误截图文件名 :param timeout: 等待超时时间 :param poll_frequency: 等待轮询时间 :return: """ start_time = time.time() try: ele = WebDriverWait(self.driver, timeout, poll_frequency).until( EC.visibility_of_element_located(locator)) except Exception as e: # 输出日志 log.error("元素--{}--等待可见超时".format(locator)) log.exception(e) self.save_scree_image(img_info) raise e else: # 元素等待出现以后,获取实际 end_time = time.time() log.info("元素--{}--等待成功,等待时间{}秒".format(locator, end_time - start_time)) return ele
def test_loans(self, cas): cas['url'] = replace_data(cas['url']) url = conf.get('env', 'url') + cas['url'] headers = eval(conf.get('env', 'headers')) headers["Authorization"] = getattr(EnvData, "token") method = cas['method'] expected = eval(cas['expected']) row = cas['case_id'] + 1 respones = request(url=url, method=method, headers=headers) res = respones.json() try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) except AssertionError as e: log.error('用例--{}--未通过'.format(cas['title'])) log.debug('预期结果{}'.format(expected)) log.debug('实际结果{}:'.format(res)) log.exception(e) self.execl.write(row=row, column=8, value='不通过') raise e else: log.info('用例--{}--通过'.format(cas['title'])) self.execl.write(row=row, column=8, value='通过')
def wait_element_presence(self, locator, img_info, timeout=15, poll_frequency=0.5): """ 等待元素被加载 :param locator: 定位表达式 :param img_info: 错误截图信息 :param timeout: 超时时间 :param poll_frequency: 轮询时间 :return: """ # 等待元素之前获取当前的时间 start_time = time.time() try: ele = WebDriverWait(self.driver, timeout, poll_frequency).until( EC.presence_of_element_located(locator)) except Exception as e: # 输出日志 log.error("元素--{}--等待被加载超时".format(locator)) log.exception(e) # 对当前页面进行截图 self.save_scree_image(img_info) raise e else: # 元素等待出现之后,获取实际 end_time = time.time() log.info("元素--{}--加载等待成功,等待时间{}秒".format(locator, end_time - start_time)) return ele
def test_update(self, cas): url = conf.get('env', 'url') + cas['url'] method = cas['method'] cas['data'] = replace_data(cas['data']) data = eval(cas['data']) headers = eval(conf.get('env', 'headers')) headers['Authorization'] = getattr(EnvData, 'token') expected = eval(cas['expected']) row = cas['case_id'] + 1 respones = request(url=url, method=method, json=data, headers=headers) res = respones.json() try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) #判断数据库中是否更新昵称 if cas['check_sql']: sql = replace_data(cas['check_sql']) s = self.bb.find_one(sql)['reg_name'] self.assertEqual(data['reg_name'], s) except AssertionError as e: log.error('该用例{}报错'.format(cas['title'])) log.exception(e) self.exce.write(row=row, column=8, value='不通过') raise e else: log.info('该用例{}通过'.format(cas['title'])) self.exce.write(row=row, column=8, value='通过')
def wait_element_clickable(self, locator, img_info, timeout=15, poll_frequency=0.5): """ 等待元素可点击 :param locator: 定位表达式 :param img_info: 错误截图文件名 :param timeout: 等待超时时间 :param poll_frequency: 等待轮询时间 :return: """ # 等待元素之前获取当前的时间 start_time = time.time() try: ele = WebDriverWait(self.driver, timeout, poll_frequency).until( EC.element_to_be_clickable(locator)) except Exception as e: # 输出日志 log.error("元素--{}--等待可点击超时".format(locator)) log.exception(e) # 对当前页面进行截图 self.save_scree_image(img_info) raise e else: # 元素等待出现之后,获取实际 end_time = time.time() log.info("元素--{}--可点击等待成功,等待时间{}秒".format(locator, end_time - start_time)) return ele
def click_ele(self, locator, img_info): try: ele = self.driver.find_element(*locator).click() except Exception as e: log.error(F"点击元素--{locator}--失败") log.exception(e) # 进行截图 self.save_error_image(img_info) else: log.info(F"元素--{locator}--点击成功")
def get_ele(self, locator, img_info): try: ele = self.driver.find_element(*locator) except Exception as e: log.error(F"获取元素--{locator}--失败") log.exception(e) # 进行截图 self.save_error_image(img_info) else: log.info(F"元素--{locator}--获取成功") return ele
def get_element_text(self, locator, img_info): try: text = self.driver.find_element(*locator).text except Exception as e: # 日志输出 log.error("元素--{}--获取文本失败".format(locator)) log.exception(e) self.save_scree_image(img_info) raise e else: log.info("元素--{}--获取文本失败".format(locator)) return text
def click_ele(self, locator, img_info): # 点击元素 try: self.driver.find_element(*locator).click() except Exception as e: # 输出日志 log.error("元素--{}--点击元素失败".format(locator)) log.exception(e) # 对当前页面进行截图 self.save_error_image(img_info) raise e else: log.info("元素--{}--点击成功".format(locator))
def get_ele_text(self, locator, img_info): # 获取元素包含text信息 需要传入loactor 还要进行拆包 try: text = self.driver.find_element(*locator).text except Exception as e: # 输出日志 log.error("元素--{}--获取文本失败".format(locator)) log.exception(e) # 对当前页面进行截图 self.save_error_image(img_info) raise e else: log.info("元素--{}--获取文本成功".format(locator)) return text
def get_ele(self, locator, img_info): # 获取到元素节点 try: ele = self.driver.find_element(*locator) except Exception as e: # 输出日志 log.error("获取元素--{}--失败".format(locator)) log.exception(e) # 对当前页面进行截图 imginfo 错误截图信息由调用处传入 self.save_error_image(img_info) raise e else: log.info("元素--{}--获取成功".format(locator)) return ele
def input_text(self, locator, input, img_info): try: self.driver.find_element(*locator).send_keys(input) except Exception as e: # 输出日志 log.error("输入文本--{}--失败".format(locator)) log.exception(e) # 对当前页面进行截图 # filename = '{}_{}.png'.format(img_info, start_time) # file_path = os.path.join(ERROR_IMG, filename) self.save_error_image(img_info) raise e else: log.info(F"文本内容输入--{locator}--成功")
def get_ele_attr(self, locator, img_info, attr_name): try: ele = self.driver.find_element(*locator) attr_value = ele.get_attribute(attr_name) except Exception as e: # 输出日志 log.error(F"获取元素--{locator}--属性失败") log.exception(e) # 对当前页面进行截图 self.save_error_image(img_info) raise e else: log.info(F"获取元素--{locator}--属性成功") return attr_value
def test_register(self, cases): # 第一步:准备用例数据 # 请求方法 method = cases["method"] # 请求地址 url = cases["url"] # 请求参数(参数化替换) # 判断data中是否有需要替换的参数 if "#phone#" in cases["data"]: phone = self.random_phone() cases["data"] = cases["data"].replace("#phone#", phone) data = eval(cases["data"]) # 请求头 headers = eval(conf.get("env", "headers")) # 预期结果 expected = eval(cases["expected"]) # 用例所在行 row = cases["case_id"] + 1 # 调用接口请求 response = request(method=method, url=url, json=data, headers=headers) # 获取实际结果 res = response.json() print("预期结果为:", expected) print("实际结果为:", res) # 断言 try: # 断言两个字段是否相同 self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) # 判断是否需要数据库断言 if cases["check_sql"]: sql = cases["check_sql"].replace("#phone#", data["mobile_phone"]) res = self.db.find_count(sql) self.assertEqual(1, res) except AssertionError as e: # 断言结果回写到excel中 log.error("用例---{}----执行未通过".format(cases["title"])) log.debug("预期结果为:{}".format(expected)) log.debug("实际结果为:{}".format(res)) log.exception(e) self.excel.write_excel(row=row, column=8, value="不通过") # 抛出异常 raise e else: # 结果回写到excel中 log.info("用例---{}----执行通过".format(cases["title"])) self.excel.write_excel(row=row, column=8, value="通过")
def test_recharge(self, cas): # 准备数据 url = conf.get('env', 'url') + cas['url'] cas['data'] = cas['data'].replace('#member_id#', self.member_id) data = eval(cas['data']) method = cas['method'] headers = eval(conf.get('env', 'headers')) headers['Authorization'] = self.token expected = eval(cas['expected']) row = cas['case_id'] + 1 if cas['check_sql']: sql = cas['check_sql'].format(self.member_id) money_data = self.bb.find_one(sql)['leave_amount'] print("充值之前的钱:", money_data) # 发送请求获取实际结果 repans = request(url=url, method=method, json=data, headers=headers) res = repans.json() if cas['check_sql']: sql = cas['check_sql'].format(self.member_id) money_data2 = self.bb.find_one(sql)['leave_amount'] print("充值之后的钱:", money_data2) print('预期结果:', expected) print('实际结果:', res) # 断言 try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) if cas['check_sql']: # 将准备的data数据中的amount数值类型转换为decimal my_data = decimal.Decimal(str(data['amount'])) self.assertEqual(my_data, money_data2 - money_data) except AssertionError as e: log.error('用例--{}--未通过'.format(cas['title'])) log.debug('预期结果{}'.format(expected)) log.debug('实际结果{}:'.format(res)) log.exception(e) self.excel.write(row=row, column=8, value='不通过') raise e else: log.info('用例--{}--通过'.format(cas['title'])) self.excel.write(row=row, column=8, value='通过')
def click_element(self, locator, img_info, timeout=15, poll_frequency=0.5): '''点击元素''' start_time = time.time() try: WebDriverWait(self.driver, timeout, poll_frequency).until( EC.element_to_be_clickable(locator)).click() except Exception as e: log.error('点击元素--{}--点击失败'.format(locator)) log.exception(e) # 点击失败时进行截图保存 self.save_scree_imge(img_info) raise e else: end_time = time.time() log.info('点击元素--{}--点击成功,耗时:{}秒'.format(locator, end_time - start_time))
def test_login_error(self,pre_method,case): '''异常用例,窗口上会有提示''' login_page,index_page =pre_method # 刷新页面提高用例执行效率 login_page.page_refresh() login_page.login(case['mobile'], case['pwd']) res = login_page.get_error_info() try: assert case['expected'] == res except AssertionError as e: log.error(F'-------用例执行失败---case为:{case}--------') log.exception(e) raise e else: log.info("---------用例执行通过--------")
class TestLogin: """测试登录""" @pytest.mark.slow @pytest.mark.parametrize("case", LoginCase.success_case_data) def test_login_pass(self, case, login_fixture): """正常登录的用例""" login_page, index_page = login_fixture login_page.click_re_mobile() # 进行登录的操作 login_page.login(case['mobile'], case['pwd']) # 获取登录之后的用户信息 res = index_page.get_my_user_info() # 断言用例执行是否通过 try: assert '登录成功' == res except AssertionError as e: log.error("用例执行失败") log.exception(e) raise e else: log.info("用例执行通过") # 退出登录,重新访问登录页面 index_page.click_quit() # 重新进入登录页面 login_page.page_refresh()
class TestLogin: ''' 思考需要的前置 并且吧前置给分出去 使用到 loginPage,userInfoPage两个页面, 要使用前置方法生成两个页面的对象''' # 正常登录用例 @pytest.mark.skip @pytest.mark.parametrize("case", LoginCase.success_case_data) def test_login_pass(self, case, fixture): login_page, userInfo_page = fixture login_page.login(case["user"], case["pwd"]) # 实际执行结果 res = userInfo_page.get_welcome() try: # 断言登录成功的条件 assert "登录成功" == res except AssertionError as e: log.error(F'-------用例执行失败---case为:{case}--------') log.exception(e) raise e else: log.info("---------用例执行通过--------") # 退出登录。重新访问登录页面 userInfo_page.quit_login() # 重新进入登录页面 login_page.page_refresh()
def test_withdraw(self, cas): # 准备用例数据 url = conf.get('env', 'url') + cas['url'] cas['data'] = cas['data'].replace('#member_id#', str(self.member_id)) data = eval(cas['data']) method = cas['method'] headers = eval(conf.get('env', 'headers')) headers['Authorization'] = self.token expected = eval(cas['expected']) row = cas['case_id'] + 1 # 查询取现之前的余额 if cas['check_sql']: sql = cas['check_sql'].format(self.member_id) start_money = self.bb.find_one(sql)['leave_amount'] print('取现前:', start_money) # 发送请求 response1 = request(method=method, url=url, headers=headers, json=data) res = response1.json() print('实际结果:', res) print('预期结果:', expected) # 断言 try: self.assertEqual(expected['code'], res['code']) self.assertEqual(expected['msg'], res['msg']) # 查询请求之后的账户余额 if cas['check_sql']: sql = cas['check_sql'].format(self.member_id) end_money = self.bb.find_one(sql)['leave_amount'] print('取现后:', end_money) # 用例数据中data,amount的数值类型转换 my_data = decimal.Decimal(str(data['amount'])) self.assertEqual(my_data, start_money - end_money) except AssertionError as e: log.error('用例--{}--未通过'.format(cas['title'])) log.debug('预期结果{}'.format(expected)) log.debug('实际结果{}:'.format(res)) log.exception(e) self.excel.write(row=row, column=8, value='不通过') raise e else: log.info('用例--{}--通过'.format(cas['title'])) self.excel.write(row=row, column=8, value='通过')
def click_element(self, locator, img_info): """ 点击元素 :param locator: 元素定位表达式 :param img_info: 错误截图信息 :return: """ try: self.driver.find_element(*locator).click() except Exception as e: # 输出日志 log.error("点击元素--{}--失败".format(locator)) log.exception(e) # 对当前页面进行截图 self.save_scree_image(img_info) raise e else: log.info("元素--{}--点击成功".format(locator))
def get_element(self, locator, img_info, timeout=15, poll_frequency=0.5): '''获取元素''' start_time = time.time() try: element = WebDriverWait( self.driver, timeout, poll_frequency).until( EC.visibility_of_element_located(locator)) except Exception as e: log.error('获取元素--{}--失败'.format(locator)) log.exception(e) # 获取元素属性失败时进行截图保存 self.save_scree_imge(img_info) raise e else: end_time = time.time() log.info('获取元素--{}--获取成功,耗时:{}秒'.format(locator, end_time - start_time)) return element
def window_move_element(self, locator, img_info, timeout=20, poll_frequency=0.5): '''移动出窗口到指定元素位置''' try: element = WebDriverWait( self.driver, timeout, poll_frequency).until( EC.visibility_of_element_located(locator)) except Exception as e: log.error('滚动窗口到--{}--滚动失败'.format(locator)) log.exception(e) # 滚动失败时进行截图保存 self.save_scree_imge(img_info) raise e return self.driver.execute_script('arguments[0].scrollIntoView();', element)
def clear_input(self, locator, img_info, timeout=20, poll_frequency=0.5): '''清空输入框''' start_time = time.time() try: element = WebDriverWait( self.driver, timeout, poll_frequency).until( EC.visibility_of_element_located(locator)) except Exception as e: log.error('清空输入框--{}--失败'.format(locator)) log.exception(e) # 清空失败时进行截图保存 self.save_scree_imge(img_info) raise e else: end_time = time.time() log.info('清空输入框--{}--清除成功,耗时:{}秒'.format(locator, end_time - start_time)) return element.clear()
def test_update_regname(self, case): # 1、准备数据 url = conf.get("env", "base_url") + case["url"] # 判断是否有昵称需要替换 if "#reg_name#" in case["data"]: # 随机生成一个昵称 reg_name = self.random_name() # print(reg_name) # 将参数中的#reg_name#替换成随机生成的昵称 case["data"] = replace_data(case["data"]) # 替换用户id data = replace_data(case["data"]) data = eval(data) headers = eval(conf.get("env", "headers")) headers["Authorization"] = getattr(EnvData, "token") expected = eval(case["expected"]) row = case["case_id"] + 1 # 2、发起请求,获取实际结果 response = request(url=url, method="patch", headers=headers, json=data) res = response.json() # 3、断言 try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) # 对需要进行数据库校验的用例进行校验 if case["check_sql"]: sql = replace_data(case["check_sql"]) new_regname = self.db.find_one_data(sql)["reg_name"] self.assertEqual(reg_name, new_regname) except AssertionError as e: # 结果写进日志和excel中 log.error("用例--{}--执行未通过") log.debug("预期结果:{}".format(expected)) log.debug("实际结果:{}".format(res)) result = "未通过" log.exception(e) else: log.info("用例--{}--执行通过".format(case["title"])) result = "通过" finally: self.excel.write_data(row=row, column=8, value=result)