def _get_attribute(self, name, *loc): try: attribute = self._find_element(*loc).get_attribute(name) log.info("获取到元素属性:%s" % name) return attribute except: log.error("Error:未获取元素到属性:%s" % name)
def _get_property(self, name, *loc): try: property = self._find_element(*loc).get_property(name) log.info("获取到元素属性:%s" % name) return property except: log.error("Error:未获取元素到属性:%s" % name)
def _open(self): """ 打开浏览器获取url地址 :param url: :return: """ self._driver.get(self._url) log.info("打开 URL 地址:%s" % self._url)
def open(self): """ 打开浏览器获取url地址 :param url: :return: """ self.driver.get(self._url) self.driver.maximize_window() self.driver.implicitly_wait(20) log.info("打开 URL 地址:%s" %self._url)
def check_text(self, text, confirm_text): log.info( f"{text}:{self.register_h.get_ele_text(text)},{confirm_text}:confirm_text" ) if confirm_text in self.register_h.get_ele_text(text): print("获取错误信息成功") return True else: print("获取错误信息失败") return False
def test_refund(self, caseid, desc, precondition, parameterize, url, method, header, data, shared, check): log.info("CaseId: <- {} ->".format(caseid)) log.info("Desc: {}".format(desc)) header = cotool().set_header(header) params = cotool().set_params(parameterize, data) res = httprequest(url, method, header, params) if shared: cotool.extract_variable(res, shared) cotool().assert_res(res, check) allure.dynamic.story("CaseID: < {} > - {}".format(caseid, desc))
def _excute_script(self, script): """ 执行 script 语句 :param script: :return: """ try: self._driver.execute_script(script) log.info("执行 script 语句: %s" % script) except Exception as e: print("Error:script语句执行失败, 错误:%s" % e) log.error("script语句执行失败, 错误:%s" % e)
def deal_data(self, data): ''' 封装整体方法 :param data: 传入的数据 :return: url, method, header, params, shared, check ''' data = get_data.get_api_data(data) desc, parameterize, url, method, header, param, shared, check = data log.info('描述信息: %s' % desc) header = self.set_header(header) params = self.set_params(parameterize, param) return url, method, header, params, shared, check
def _switch_to(self, *loc): """ 切入 frame :param loc: :return: """ try: frame = self._find_element(*loc) self._driver.switch_to.frame(frame) log.info("切入 frame 成功") except: log.error("切入 frame 失败")
def set_token_to_config(self): partner, leader = self.get_platform_token() student = self.get_students_token() cookie = self.get_jsessionid() try: rc.set_token('partner', str(partner)) rc.set_token('leader', str(leader)) rc.set_token('students', str(student)) rc.set_token('cookie', str(cookie)) log.info("凭证获取成功并写入 /common/config.txt 配置文件中") except Exception as e: log.error("凭证获取失败,请检查!错误: %s" %e)
def get_value_by_js(self, *loc): """ 通过js获取元素指定的值 :param loc: :return: """ try: element = self.driver.find_element(*loc) value = self.driver.execute_script("return arguments[0].value", element) log.info("通过js获取元素的值:%s" %value) return str(value) except: log.error("Error:通过js未获取的元素的值")
def send_email(self): self.email_content() try: self.smtp.connect(self.email_host) self.smtp = SMTP_SSL(self.email_host, timeout=5) # self.smtp.ehlo_or_helo_if_needed() self.smtp.login(self.username, self.password) self.smtp.sendmail(self.username, self.recievers, self.msg.as_string().encode()) log.info("##### 邮件发送成功 !!!!!") except SMTPException as e: log.error("////// 发送邮件失败,错误:%s" % e) finally: self.smtp.close() self.smtp.quit()
def set_token_to_config(self): ''' 将凭证数据写入配置文件 :return: None ''' leader = self.get_platform_token() # students = self.get_students_token() cookie = self.get_jsessionid() try: # rc.set_token('partner', str(partner)) rc.set_token('leader', str(leader)) # rc.set_token('students', str(students)) rc.set_token('cookie', str(cookie)) log.info("凭证获取成功并写入 /common/config.txt 配置文件中") except Exception as e: log.error("凭证获取失败,请检查!错误: %s" % e)
def extract_variable(self, res, shared): ''' 提取变量方法 :param res: 响应内容response :param shared: 提取response中的参数名 :return: ''' if shared is not None: for k, v in shared.items(): if "-" not in v: value = gv.get_jsonpath_value(res, v) else: key, num = str(v).split("-") value = gv.get_jsonpath_value(obj=res, key=key, num=int(num)) GLOBAL_VAR[k] = value setattr(const, k, value) log.info("提取变量: [ {}: {} ]".format(k, value))
def test_mainlink(self, caseid, desc, precondition, parameterize, url, method, header, data, shared, check): log.info("CaseId: <- {} ->".format(caseid)) log.info("Desc: {}".format(desc)) if str(caseid) == "10022": time.sleep(30) header = cotool().set_header(header) params = cotool().set_params(parameterize, data) res = httprequest(url, method, header, params) if shared: cotool.extract_variable(res, shared) if check: cotool().assert_res(res, check) if str(caseid) == "10017": tools.create_qr_code(GLOBAL_VAR["creativityCode"]) time.sleep(180) allure.dynamic.story("CaseID: < {} > - {}".format(caseid, desc))
def quick_rqt(self, data, **kwargs): ''' 封装整体方法 :param data: 传入的数据 :param kwargs: 传入的字典会加入到data中 :return: res ''' data = get_data.get_api_data(data) desc, parameterize, url, method, header, param, shared, check = data log.info('描述信息: %s' % desc) header = self.set_header(header) params = self.set_params(parameterize, param) if kwargs: params = dict(params, **kwargs) res = httprequest(url, method, header, params) self.extract_variable(res, shared) return res
def check_file(self): """ 排序后读取最新的报告文件 :return: """ REPORT_PATH = os.path.join(rc.PROJECT_PATH, "report") if not os.path.exists(REPORT_PATH): os.mkdir(REPORT_PATH) listdir = os.listdir(REPORT_PATH) if len(listdir) == 0: log.info("报告存放路径为空,请检查文件夹") return FileNotFoundError else: listdir.sort( key=lambda x: os.path.getmtime(REPORT_PATH + "\\" + x)) att_file = os.path.join(REPORT_PATH, listdir[-1]) return att_file
def handle_param(self, data, **kwargs): ''' 封装整体方法 :param data: 传入的数据 :return: None ''' data = get_data.get_api_data(data) desc, parameterize, url, method, header, param, shared, check = data log.info('描述信息: %s' % desc) header = self.set_header(header) params = self.set_params(parameterize, param) if kwargs: for k, v in kwargs.items(): params[k] = v res = httprequest(url, method, header, params) self.extract_variable(res, shared) self.assert_res(res, check) return res
def open_browser(self): global driver """ 选择浏览器驱动,获取driver :return: """ self.browser = rc.get_browser("browser") if self.browser == "chrome": driver = webdriver.Chrome() elif self.browser == "firefox": driver = webdriver.Firefox() elif self.browser == "safari": driver = webdriver.Safari() elif self.browser == "opera": driver = webdriver.Opera() elif self.browser == "ie": driver = webdriver.Ie() log.info("启动浏览器:%s" % driver.name) return driver
def extract_variable(self, res, shared): ''' 提取变量方法 期望值 :param res: 响应内容response :param shared: 提取response中的参数名 :return: ''' # 通过判断shared字段是否为空,得出是否需要取值,为空则跳过 if shared is not None: # 如果不为空,则遍历shared字典,进行response取值 for k, v in shared.items(): if "-" not in v: value = gv.get_jsonpath_value(res, v) else: key, num = str(v).split("-") value = gv.get_jsonpath_value(obj=res, key=key, num=int(num)) setattr(const, k, value) GLOBAL_VAR[k] = value log.info("提取变量: [ {}: {} ]".format(k, value))
def test_democase(self, caseid, desc, precondition, parameterize, url, method, header, data, shared, check): # 打印日志信息 log.info("CaseId: <- {} ->".format(caseid)) log.info("Desc: {}".format(desc)) # 判断是否需要前置运行所需接口 if precondition: print("我需要前置条件") # 处理header header = cotool().set_header(header) # 处理params中的参数 params = cotool().set_params(parameterize, data) res = httprequest(url, method, header, params) # 对res进行提取变量处理 if shared: cotool.extract_variable(res, shared) # 断言code及msg,后期取断言data中的字段是否存在于res中 cotool().assert_res(res, check) # allure记录信息 allure.dynamic.story("CaseID: < {} > - {}".format(caseid, desc))
def send_email(self): self.email_header() self.email_content() self.email_attachment() try: # self.smtp.connect(self.email_host) self.smtp = SMTP_SSL(self.email_host) self.smtp.ehlo_or_helo_if_needed() self.smtp.login(self.username, self.password) # login的user参数与sendmail的from_addr参数需一致,否则报错501:mail from address must be same as authorization user self.smtp.sendmail(self.username, self.msg["To"].split(";"), self.msg.as_string()) log.info("##### 邮件发送成功 !!!!!") except TimeoutError: log.error("////// 发送邮件超时,请检查网络连接") except Exception as e: log.error("////// 发送邮件失败,错误:%s" % e) finally: # self.smtp.close() self.smtp.quit()
def main(self): suit = self.set_suit() REPORT_DIR = os.path.join(rc.PROJECT_PATH, "report") date = time.strftime("%Y-%m-%d %H:%M") reportname = REPORT_DIR + date + ".html" try: if suit is not None: log.info("******************** TEST START ********************") with open(reportname, "w+", encoding="utf-8") as file: bstrunner = BSTestRunner(stream=file, title=self.title, description=self.description) bstrunner.run(suit) except Exception as e: log.error("run test 失败,错误:%s" %e) finally: log.info("******************** TEST END ********************") if self.on_off == "on": ce.send_email() elif self.on_off == "off": log.info("邮件控制器选择:不发送邮件")
def assert_list(self, res, check, key): ''' 校验列表数据方法 :param res: response返回的json数据 :param check: 预期结果 :param key: 校验的字段,key :return: ''' if res['status'] == '0': res1 = jsonpath.jsonpath(res, '$..%s' % key) act = res1[0] exp = check[key] if ((len(act) == len(exp)) and (all(i in act for i in exp))): log.info('校验类型: [-in], 结果: [Passed], 预期: {}'.format(exp)) else: log.info('校验类型: [-in], 结果: [Failed], 实际: {}'.format(act)) else: log.info('校验类型: [-in], 结果: [Failed], 实际: {}'.format(res))
def close_db(self): self.db.close() print("###### Database closed!") log.info("###### 正在关闭数据库连接 /////")
def close(self): self.sleep(0.5) self.driver.close() log.info("关闭浏览器驱动")
def __init__(self): env = rc.get_env().title() log.info("************** 当前运行环境: %s *************" % env) self.partner, self.leader, self.students, self.cookie = rc.get_account_info(env)
def click_baidu(self): self.click_action(*self._submit_btn_loc) log.info("点击按钮:百度一下")
def input_value(self, value="python"): self.send_value(value, *self._input_box_loc) log.info("定位输入框:输入:%s" % value)
def _sleep(secs): time.sleep(secs) log.info("等待 %s 秒" % secs)