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_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 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 save_scree_imge(self, img_info): '''保存截图''' start_time = time.time() filename = '{}__{}__操作.png'.format(start_time, img_info) file_path = os.path.join(ERROR_IMG, filename) self.driver.save_screenshot(file_path) log.info('错误页面截图成功,图表保存路径:{}'.format(file_path))
def save_error_image(self, img_info): # img_info 错误截图信息 record_time = time.time() # 记录时间 img_name = F'{img_info}_{record_time}.png' # 拼接图片名 主要包含用例执行信息,执行时间 file_path = os.path.join(ERROR_IMG, img_name) # 拼接组成文件路径 self.driver.save_screenshot(file_path) # 调用方法进行保存 log.info(F"错误页面截屏成功,保存路径为{file_path}")
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_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_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 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 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_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 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 pre_method(): log.info("----------开始执行登录的用例--------") driver = webdriver.Chrome() login_page=LoginPage(driver) index_page=IndexPage(driver) yield login_page,index_page driver.quit() log.info("-----------登录的用例执行完毕---------")
def fixture(): log.info("--------------开始执行登录的用例----------") driver = webdriver.Chrome() login_page = LoginPage(driver) userInfo_page = UserInfoPage(driver) yield login_page, userInfo_page driver.quit() log.info("---------------登录的测试用例执行完毕-------")
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 save_scree_image(self, img_info): """ 对当前页面进行截图 :param img_info: 错误截图信息 :return: """ start_time = time.time() filename = '{}_{}.png'.format(img_info, start_time) file_path = os.path.join(ERROR_IMG, filename) self.driver.save_screenshot(file_path) log.info("错误页面截图成功,图表保存的路径:{}".format(file_path))
def login_fixture(): """登录功能的前置后置""" # 前置条件 log.info("开始执行登录的用例") driver = webdriver.Chrome() login_page = LoginPage(driver) index_page = IndexPage(driver) yield login_page, index_page # 后置条件 driver.quit() log.info("登录的用例执行完毕")
def test_register(self, case): # 第一步,准备用例数据 (请求方法,请求地址,请求参数,请求头 # 请求方法 method = case["method"] # 请求url url = case["url"] # 请求参数是否有手机号需要替换 # 判断 if "#phone#" in case["data"]: phone = self.random_phone() case["data"] = case["data"].replace("#phone#", phone) data = eval(case["data"]) headers = eval(conf.get("env", "headers")) expected = eval(case["expected"]) # 用例所在行 row = case["case_id"] + 1 # 第二步,发送请求获取实际结果 response = request(method=method, url=url, json=data, headers=headers) res = response.json() # print("实际结果:",res) print("预期结果:", expected) print("实际结果:", res) # 第三步,断言 try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) # 判断是否需要进行sql校验 if case["check_sql"]: sql = case["check_sql"].replace("#phong#", data["mobile_phone"]) res = self.db.find_count(sql) self.assertTrue(1, res) except AssertionError as e: # ---------------------将结果回写excel 中 log.error("用例---- {}----执行未通过".format(case["title"])) log.info("预期结果:", expected) log.info("实际结果:", res) log.exception(e) # log.error(e) log.exception(e) # 这样可以异常情况打印到日志文件中! self.excel.write_data(row=row, column=8, value="未通过") raise e else: # ----------------------将结果回写excel 中 log.error("用例---- {}----执行通过".format(case["title"])) self.excel.write_data(row=row, column=8, value="通过")
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_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 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 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 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_add(self, case): # 第一步:准备数据 # 请求方法 method = case["method"] # 请求地址 url = os.path.join(conf.get("env", "BASE_URL")) + case["url"] # 请求参数 data = eval(replace_data(case["data"])) # 请求头 headers = eval(conf.get("env", "headers")) headers["Authorization"] = getattr(EnvData, "token") # 预期结果 expected = eval(case["expected"]) log.info("--------预期结果:{}----------".format(expected)) # 回写的行 row = case["case_id"] + 1 # 数据库前置查询 if case["check_sql"]: start_count = self.db.find_count(replace_data(case["check_sql"])) # 第二步:接口调用 response = requests.request(method=method, url=url, json=data, headers=headers) # 实际结果 res = response.json() log.info("--------实际结果:{}----------".format(res)) # 数据断言和数据库断言 try: self.assertEqual(expected["code"], res["code"]) self.assertEqual(expected["msg"], res["msg"]) # 数据库后置查询 if case["check_sql"]: end_count = self.db.find_count(replace_data(case["check_sql"])) self.assertEqual(1, end_count - start_count) except AssertionError as e: # 结果回写到excel中 log.error("用例--{}--执行未通过".format(case["title"])) log.debug("预期结果:{}".format(expected)) log.debug("实际结果:{}".format(res)) log.exception(e) self.excel.write_excel(row, 8, value="未通过") else: # 结果回写excel中 log.info("用例--{}--执行通过".format(case["title"])) self.excel.write_excel(row, 8, value="通过")
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()