def mail(): try: # 创建一个带附件的实例 message = MIMEMultipart() message['From']=formataddr([usernmae,sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号 log1.info('发件人姓名:%s' % usernmae) log1.info('发件人邮箱:%s' % sender) message['To']=';'.join(addressed_eamils) # 括号里的对应收件人邮箱昵称、收件人邮箱账号 log1.info('收件人邮箱:' + ';'.join(addressed_eamils)) message['Subject']=rq + "接口自动化测试报告.html" # 邮件的主题,也可以说是标题 # 邮件正文内容 message.attach(MIMEText('附件为接口自动化测试报告.html', 'plain', 'utf-8')) # 构造附件1,传送当前目录下的 test.txt 文件 att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8') log1.info('读取附件') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "接口自动化测试报告.html")) # 附件名称非中文时的写法 # att["Content-Disposition"] = 'attachment; filename="test.html")' message.attach(att1) log1.info('添加附件') server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25 log1.info('连接QQ邮箱smtp服务') server.login(sender,password) # 括号中对应的是发件人邮箱账号、邮箱密码 log1.info('连接成功') server.sendmail(sender, addressed_eamils, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 server.quit() # 关闭连接 log1.info("邮件发送成功") except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False log1.error("邮件发送失败",exc_info=1)
def switch_frame(self): iframe = self.find_element('classname=>embed-responsive-item') try: self.driver.switch_to_frame(iframe) # logger.info("The element \' %s \' was clicked." % iframe.text) except NameError as e: log1.error("Failed to click the element with %s" % e)
def open_browser(self): """打开浏览器,访问url""" browser = config.config_read('environment', 'browser') log1.info('读取浏览器配置,值为%s' % browser) url = config.config_read('environment', 'url') log1.info('读取url,值为%s' % url) # noinspection PyBroadException try: if browser == 'chrome': option = webdriver.ChromeOptions() option.add_argument('disable-infobars') self.driver = webdriver.Chrome(chrome_options=option) log1.info('打开chrome浏览器') elif browser == 'firefox': self.driver = webdriver.Firefox() log1.info('打开firefox浏览器') else: log1.error('浏览器配置有误,应为chrome或firefox') self.driver.get(url) log1.info('访问url') self.driver.maximize_window() log1.info('浏览器最大化') self.driver.implicitly_wait(3) log1.info('设置静态等待时间3秒') return self.driver except BaseException: log1.error('浏览器打开报错', exc_info=1)
def download(self, company, downfile_path): down_file_path = downfile_path + "{}.zip".format(self.down_file_name) for ii in range(n0): y = 463 + (len(self.dict["TIVIEW"])//15)*20 pyautogui.moveTo(x=156, y=y, duration=w3, tween=pyautogui.linear) pyautogui.click() sleep(w4) code_path = self.base_dir + "\\code_pic\\download-showPic.jpg" self.remove_down_file(code_path) pyautogui.moveTo(x=650, y=517, duration=w3, tween=pyautogui.linear) pyautogui.rightClick() sleep(w2) pyautogui.typewrite(['down', 'down', 'enter']) sleep(w2) # 将地址以及文件名复制 pyperclip.copy(code_path) sleep(0.8) pyautogui.hotkey('ctrlleft', 'V') pyautogui.press('enter') sleep(w2) try: code = discern_code(code_path) except: pyautogui.moveTo(x=914, y=570, duration=w3, tween=pyautogui.linear) pyautogui.click() continue if not code: break # code = input("code:") pyautogui.moveTo(x=572, y=517, duration=w3, tween=pyautogui.linear) pyautogui.click() pyperclip.copy(code) sleep(0.8) pyautogui.hotkey('ctrlleft', 'V') pyautogui.moveTo(x=972, y=570, duration=w3, tween=pyautogui.linear) pyautogui.click() sleep(w4) pyperclip.copy(down_file_path) sleep(0.8) pyautogui.hotkey('ctrlleft', 'V') pyautogui.press('enter') sleep(w1) # 判断下载是否成功 if not os.path.exists(down_file_path): sleep(w1) pyautogui.moveTo(x=914, y=570, duration=w3, tween=pyautogui.linear) pyautogui.click() self.dr.refresh() sleep(2) continue else: break if not os.path.exists(down_file_path): log1.info("{}下载失败".format(self.down_file_name)) else: try: send_mail.run(self.dict) # 发送邮件 log1.info("邮件发送OK") except Exception as e: log1.error("{}{}邮件发送失败:{}".format(company, self.dict["ID"], e))
def get_element(self, selector): """定位元素""" by = selector[0] value = selector[1] bys = ['id', 'name', 'class', 'tag', 'link', 'plink', 'css', 'xpath'] element = None if by in bys: try: if by == 'id': element = self.driver.find_element_by_id(value) elif by == 'name': element = self.driver.find_element_by_name(value) elif by == 'class': element = self.driver.find_element_by_class_name(value) elif by == 'tag': element = self.driver.find_element_by_tag_name(value) elif by == 'link': element = self.driver.find_element_by_link_text(value) elif by == 'plink': element = self.driver.find_element_by_partial_link_text( value) elif by == 'css': element = self.driver.find_element_by_css_selector(value) elif by == 'xpath': element = self.driver.find_element_by_xpath(value) log1.info('元素定位成功。定位方式:%s,使用的值:%s' % (by, value)) return element except NoSuchElementException: log1.error('没有定位到元素,定位方式:%s,使用的值:%s' % (by, value), exc_info=1) self.get_img() # 调用截图 else: log1.error( '元素定位方式错误,请使用id,name,class,tag,link,plink,css,xpath为定位方式参数')
def move_to_elenmt(self, selector): try: above = self.find_element(selector) ActionChains(self.driver).move_to_element(above).perform() log1.info("元素定位成功:%s" % selector) except BaseException: log1.error("元素定位失败:%s" % selector) self.get_img()
def use_js(self, js): """调用js""" # noinspection PyBroadException try: self.driver.execute_script(js) log1.info('js执行成功,js内容为:%s' % js) except BaseException: log1.error('js执行报错', exc_info=1)
def mobile_num(self): '''随机生成手机号''' try: lis = ['189','159','187','136','176','134'] var = random.choice(lis)+''.join(str(random.choice(range(10)))for i in range(8)) print('号码%s'%var) return var except BaseException as e: log1.error("生成失败!",exc_info=1)
def click(self, selector): '''点击元素''' element = self.find_element(selector) try: element.click() log1.info('点击元素成功') except BaseException: log1.error('点击元素报错', exc_info=1) self.get_img()
def switch_ifarme(self, selector): """切换farm""" element = self.get_element(selector) # noinspection PyBroadException try: self.driver.switch_to.frame(element) log1.info('切换frame成功') except BaseException: log1.error('切换frame报错', exc_info=1)
def post(self,url,data=None,headers=None,files=None): try: result = requests.post(url,data=data,headers= headers,files = files) log1.info('请求内容:%s' %data) log1.info('响应码:%d' %result.status_code) response_json = result.json() log1.info('响应体:%s' %response_json) return response_json,result.status_code except BaseException as e: log1.error("请求失败!", exc_info=1)
def save_data(self, dict): # 保存数据 try: apd = dict["APD"] APD_Date = datetime.strptime(apd, "%Y.%m.%d") if self.m_apd and (self.m_apd - APD_Date).days >= 0: return True insert_db(dict) except Exception as e: log1.error(e) return True
def select(self, id): select1 = self.find_element(id) try: options_list = select1.find_elements_by_tag_name('option') del options_list[0] s1 = choice(options_list) Select(select1).select_by_visible_text(s1.text) log1.info("随机选的是:%s" % s1.text) except NameError as e: log1.error("Failed to click the element with %s" % e)
def get(self,url,params=None,headers=None,files=None): '''封装get方法,return响应码和相应内容''' try: result = requests.get(url,params=params,headers=headers,files=files) log1.info('请求内容:%s' %params) log1.info('响应码:%d' % result.status_code) response_json = result.json() log1.info('响应内容:%s' % response_json) return result.status_code, response_json except BaseException as e: log1.error('请求失败', exc_info=1)
def inqut(self, selector, value): '''输入内容''' element = self.find_element(selector) element.clear() log1.info('清空输入内容') try: element.send_keys(value) log1.info('输入的内容:%s' % value) except BaseException: log1.error('内容输入报错', exc_info=1) self.get_img()
def get_img(self): '''截图''' path = os.path.join(getcwd.get_cwd(), 'screenshots/') # 拼接截图保存路径 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 按格式获取当前时间 screen_name = path + rq + '.png' # 拼接截图文件名 try: self.driver.get_screenshot_as_file(screen_name) log1.info("截图保存成功") except BaseException: log1.error("截图失败", exc_info=1)
def type(self, selector, value): """往输入框输入内容""" element = self.get_element(selector) element.clear() # noinspection PyBroadException try: element.send_keys(value) log1.info('输入的内容:%s' % value) except BaseException: log1.error('内容输入报错', exc_info=1) self.get_img()
def post_json(self,url,data=None,headers=None): try: data = json.dumps(data).encode('utf-8')# python数据类型转化成json类型 result = requests.post(url,data=data,headers=headers) log1.info('请求内容:%s' %data) log1.info('响应代码:%d' %result.status_code) response_json = result.json() log1.info('响应体:%s' %response_json) return response_json,result.status_code except BaseException as e: log1.error('请求失败!', exc_info=1)
def get_img(self): jt_path = os.path.join(getcwd.get_cwd(), 'img/') #拼接截图保存路径 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) #按格式获取当前时间 img_name = jt_path + rq + '.png' #拼接截图文件名 # noinspection PyBroadException try: self.driver.get_screenshot_as_file(img_name) log1.info('截图保存成功') except BaseException: log1.error('截图失败', exc_info=1)
def post(self, url, data=None, headers=None, files=None): '''封装post请求,return响应码和响应内容''' try: r = requests.post(url, data=data, headers=headers, files=files) log1.info("请求的内容:%s" % data) status_code = r.status_code # 获取返回的状态码 log1.info("获取返回的状态码:%d" % status_code) response_json = r.json() # 响应内容,json类型转化成python数据类型 log1.info("响应内容:%s" % response_json) return status_code, response_json # 返回响应码,响应内容 except BaseException as e: log1.error("请求失败!", exc_info=1)
def get(url, params=None, headers=None, files=None): # return response code and content # try: r = requests.get(url, params=params, headers=headers, files=files) log1.info("request content:%s" % params) status_code = r.status_code # status code log1.info("get status code:%d" % status_code) response_json = r.json() # response content log1.info("response content:%s" % response_json) return status_code, response_json except BaseException as e: log1.error("request fail!", exc_info=1)
def post_json(url, data=None, headers=None): # send value via json,return response code and content try: data = json.dumps(data).encode('utf-8') r = requests.post(url, data=data, headers=headers) log1.info("requests content:%s" % data) status_code = r.status_code # response code log1.info("status code:%d" % status_code) response = r.json() log1.info("response content:%s" % response) return status_code, response # return response code and content except BaseException as e: log1.error("request fail!", exc_info=1)
def test_login3(self): """密码不正确""" case_name = '密码不正确' log1.info("执行测试用例:%s" % case_name) login = LoginPage(self.driver) login.login('xuhaixiang1993', ' 12314') error_text = login.get_login_error() try: self.assertEqual(error_text, 'Incorrect username or password.') log1.info("测试用例执行成功:%s" % case_name + '\n') except AssertionError: log1.error("测试用例执行失败:%s" % case_name + '\n') raise
def test_login2(self): """密码为空""" case_name = '密码为空' log1.info("执行测试用例:%s" % case_name) login = LoginPage(self.driver) login.login('LJDY1077', '') error_text = login.get_login_error() try: self.assertEqual(error_text, '密码不能为空。') log1.info("测试用例执行成功:%s" % case_name + '\n') except AssertionError: log1.error("测试用例执行失败:%s" % case_name + '\n') raise
def test_login3(self): """密码不正确""" case_name = '密码不正确' log1.info("执行测试用例:%s" % case_name) login = LoginPage(self.driver) login.login('WQ68', '12314') error_text = login.get_login_error2() try: self.assertEqual(error_text, '用户名或密码错误,再输错4次该用户将被锁定15分钟。') log1.info("测试用例执行成功:%s" % case_name + '\n') except AssertionError: log1.error("测试用例执行失败:%s" % case_name + '\n') raise
def post_json(self, url, data=None, headers=None): '''封装post方法,并用json格式传值,return响应码和响应内容''' try: data = json.dumps(data).encode('utf-8') # python数据类型转化为json数据类型 r = requests.post(url, data=data, headers=headers) log1.info("请求的内容:%s" % data) status_code = r.status_code # 获取返回的状态码 log1.info("获取返回的状态码:%d" % status_code) response = r.json() # 响应内容,json类型转化成python数据类型 log1.info("响应内容:%s" % response) return status_code, response # 返回响应码,响应内容 except BaseException as e: log1.error("请求失败!", exc_info=1)
def test_login1(self): """用户名为空""" case_name = '用户为空' log1.info("执行测试用例:%s" % case_name) login = LoginPage(self.driver) login.login(' ', '12324') error_text = login.get_login_error() try: self.assertEqual(error_text, 'Incorrect username or password.') log1.info("测试用例执行成功:%s" % case_name + '\n') except AssertionError: log1.error("测试用例执行失败:%s" % case_name + '\n') raise
def post(url, data=None, headers=None, files=None): # return response code and content # try: r = requests.post(url, data=data, headers=headers, files=files) log1.info("requests content:%s" % data) status_code = r.status_code log1.info("status code:%d" % status_code) response_json = r.json() log1.info("response content:%s" % response_json) return status_code, response_json # return response code and content # except BaseException as e: log1.error("requests fail", exc_info=1)
def test_login4(self): """登录成功""" # 想要执行成功,需使用GitHub账号和密码 case_name = '登录成功' log1.info("执行测试用例:%s" % case_name) login = LoginPage(self.driver) login.login('username', 'password') login_title = login.get_title() try: self.assertEqual(login_title, 'GitHub') log1.info("测试用例执行成功:%s" % case_name + '\n') except AssertionError: log1.error("测试用例执行失败:%s" % case_name + '\n') raise
def switch_menue(self, parentelement, secelement, targetelement): """三级菜单切换""" self.my_sleep(3) # noinspection PyBroadException try: self.driver.switch_to_default_content() self.click(parentelement) log1.info('成功点击一级菜单:%s' % parentelement) self.click(secelement) log1.info('成功点击二级菜单:%s' % secelement) self.click(targetelement) log1.info('成功点击三级菜单:%s' % targetelement) except BaseException: log1.error('切换菜单报错', exc_info=1)