def pre_send_mail(report_name): """发送邮件预处理""" cfg = ReadIni(isPageView=False, file_name="Email_config.ini") message = MIMEMultipart("related") current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) to_addr = cfg.Read_config("Emailer", "To_addr") cc_addr = cfg.Read_config("Emailer", "Cc_addr") user_list = to_addr.split(',') + cc_addr.split(',') sub = "【请阅】固定资产UI自动化测试报告" + current_time user = send_user message['Subject'] = sub message['From'] = user message['To'] = to_addr message['Cc'] = cc_addr # 添加内容(或图片)到邮件正文中 mail_content = """ <p>您好,以下为固资平台UI自动化测试报告,详情请下载附件报告,推荐使用Chrome浏览器查看!</p> <p>ps:请将两个文件放在同一个目录下,再查看html报告,否则无法查看近十次测试统计图。</p> """ # # 添加邮件正文信息 mail_body = MIMEText(mail_content, _subtype='html', _charset='utf-8') message.attach(mail_body) # 添加附件1 ctype, encoding = mimetypes.guess_type(report_name[0]) if ctype is None or encoding is not None: ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(report_name[0], 'rb'))[0], _subtype=subtype) att1.add_header("Content-Disposition", "attachment", filename=os.path.basename(report_name[0])) message.attach(att1) # 添加附件2 ctype, encoding = mimetypes.guess_type(report_name[1]) if ctype is None or encoding is not None: ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) att2 = MIMEImage((lambda f: (f.read(), f.close()))(open(report_name[1], 'rb'))[0], _subtype=subtype) att2.add_header("Content-Disposition", "attachment", filename=os.path.basename(report_name[1])) message.attach(att2) # 发送邮件 server = smtplib.SMTP() server.connect(email_host) server.login(send_user, password) server.sendmail(user, user_list, message.as_string()) server.close()
class LoginBusiness(BaseOperation): def __init__(self, driver): self.driver = driver self.efg = ReadIni(file_name='loginView.ini') self.cfg = ReadIni(isPageView=False) def openWeb(self): self.driver.get(self.cfg.Read_config('ALL_URL', 'test_url')) self.driver.maximize_window() def loginAction(self, line): """登录的操作""" data = self.get_csv_data('testLogin.csv', line) account = self.get_element('loginView', 'user', self.efg) pwd = self.get_element('loginView', 'pwd', self.efg) account.clear() account.send_keys(data[0]) logger.info('输入测试数据' + data[0]) pwd.clear() pwd.send_keys(data[1]) logger.info('输入测试数据' + data[1]) self.get_element('loginView', 'button', self.efg).click()
class BaseOperation: """系统操作基础类""" def __init__(self, driver): self.driver = driver self.cfg = ReadIni(isPageView=False) self.efg = ReadIni(file_name='local_element.ini') def OpenSystem(self): """AW: 登录系统""" try: efg = ReadIni(file_name='loginView.ini') url = self.cfg.Read_config('ALL_URL', 'test_url') user = self.cfg.Read_config('test_account', 'user_name') pd = self.cfg.Read_config('test_account', 'pass_word') self.driver.get(url) self.driver.maximize_window() account = self.get_element('loginView', 'user', efg) pwd = self.get_element('loginView', 'pwd', efg) account.clear() account.send_keys(user) logger.info('输入账号信息') pwd.clear() pwd.send_keys(pd) logger.info('输入密码信息') self.get_element('loginView', 'button', efg).click() time.sleep(5) try: self.closeNotice() time.sleep(3) logger.info('关闭公告弹窗') logger.info('成功登陆系统') except: logger.info('无弹窗,成功登陆系统') except Exception as e: logger.info('系统登陆失败' + e) ########################################################################## def closeNotice(self): """系统公告通知的关闭""" btw = self.get_Elements('BaseControl', 'close_notice', self.efg, 5).click() return btw def closeWindow(self): """关闭系统窗口""" self.driver.close() self.driver.quit() logger.info('Test case finished, system close...') ########################################################################## def topView(self): """点击功能列表首页""" btw = self.get_Elements('BaseControl', 'funclist', self.efg, 0).click() return btw def stoRage(self): """点击功能列表资产入库""" btw = self.get_Elements('BaseControl', 'funclist1', self.efg, 1).click() return btw def productMgr(self): """点击功能列表资产管理""" btw = self.get_Elements('BaseControl', 'funclist2', self.efg, 0).click() return btw def checkMgr(self): """点击功能列表盘点管理""" btw = self.get_Elements('BaseControl', 'funclist1', self.efg, 9).click() return btw def analyzeReport(self): """点击功能列表分析报表""" btw = self.get_Elements('BaseControl', 'funclist2', self.efg, 1).click() return btw def settingMgr(self): """点击功能列表分析报表""" btw = self.get_Elements('BaseControl', 'funclist2', self.efg, 2).click() return btw ######################################################################## def readNotice(self): """获取通知、提示""" res = self.get_element('BaseControl', 'warning', self.efg).text return res ######################################################################## def get_element(self, section, key, efg): """@note:获取配置文件中的页面元素,@section:元素模块,@key:元素id,name,classname,xpath,@efg:页面元素,@return:返回找到的元素""" data = efg.Read_config(section, key) by = data.split('>')[0] value = data.split('>')[1] logger.info("locate by:[" + by + "] value:[" + value + ']') try: if by == 'id': return WebDriverWait( self.driver, 10).until(lambda x: x.find_element_by_id(value)) elif by == 'name': return WebDriverWait( self.driver, 10).until(lambda x: x.find_element_by_name(value)) elif by == 'classname': return WebDriverWait( self.driver, 10).until(lambda x: x.find_element_by_class_name(value)) else: return WebDriverWait( self.driver, 10).until(lambda x: x.find_element_by_xpath(value)) except Exception: raise def get_Elements(self, section, key, efg, index): """@note:获取配置文件中的页面元素,@section:元素模块,@key:元素id,name,classname,xpath,@efg:页面元素,@index:元素索引,@return 返回找到的元素集合""" data = efg.Read_config(section, key) by = data.split('>')[0] value = data.split('>')[1] logger.info("locate by:[" + by + "] value:[" + value + '] is number ' + str(index + 1)) try: if by == 'id': return WebDriverWait( self.driver, 10).until(lambda x: x.find_elements_by_id(value)[index]) elif by == 'name': return WebDriverWait( self.driver, 10).until(lambda x: x.find_elements_by_name(value)[index]) elif by == 'classname': return WebDriverWait(self.driver, 10).until( lambda x: x.find_elements_by_class_name(value)[index]) else: return WebDriverWait( self.driver, 10).until(lambda x: x.find_elements_by_xpath(value)[index]) except Exception: raise def is_exist(self, method, exp): """@note: 判断元素是否存在, @method:定位方法, @exp:元素路径或名称""" try: self.driver.find_element(by=method, value=exp) logger.info('查找到%s元素' % exp) except NoSuchElementException: logger.info('未找到%s元素' % exp) return False else: return True def scoll(self, element, index=None): """@note:滚动页面, @path:滚动时参考的元素,路径或者元素对象,@index:up 元素在最上,down 元素在最下""" if index == 'up': self.driver.execute_script("arguments[0].scrollIntoView(true);", element) elif index == 'down': self.driver.execute_script("arguments[0].scrollIntoView(false);", element) else: self.driver.execute_script("arguments[0].scrollIntoView();", element) logger.info('页面滚动到选中元素位置') ######################################################################## def get_csv_data(self, filename, line): """读取.csv文件中的数据""" path = os.path.dirname(os.path.dirname(__file__)) data_path = path + '/data/' + filename logger.info('读取%s中的测试数据' % filename) with open(data_path, 'r', encoding='utf-8') as p: reader = csv.reader(p) for index, row in enumerate(reader, 1): if index == line: return row def save_csv_data(self, filename, data): """保存数据到.csv文件中""" path = os.path.dirname(os.path.dirname(__file__)) data_path = path + '/data/' + filename logger.info('写入数据到%s中' % filename) with open(data_path, 'w', encoding='utf-8', newline='') as p: csv_write = csv.writer(p) for i in data: csv_write.writerow(i) logger.info('数据保存成功')