Python郵件發(fā)送SMTP(Simple Mail Transfer Protocol)· 即簡(jiǎn)單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳輸郵件的規(guī)范,通過(guò)它來(lái)控制郵件的中轉(zhuǎn)方式。SMTP 協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。SMTP 服務(wù)器就是遵循 SMTP 協(xié)議的發(fā)送郵件服務(wù)器。 SMTP 認(rèn)證· SMTP 認(rèn)證,簡(jiǎn)單地說(shuō)就是要求必須在提供了賬戶名和密碼之后才可以登錄 SMTP 服務(wù)器,這就使得那些垃圾郵件的散播者無(wú)可乘之機(jī)。 · 增加 SMTP 認(rèn)證的目的是為了使用戶避免受到垃圾郵件的侵?jǐn)_。 更多資料: http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html smtplib模塊Python內(nèi)置對(duì)SMTP的支持,可以發(fā)送純文本郵件、HTML郵件以及帶附件的郵件。 Python對(duì)SMTP支持有smtplib和email兩個(gè)模塊,email負(fù)責(zé)構(gòu)造郵件,smtplib負(fù)責(zé)發(fā)送郵件。 注意:使用前需要開(kāi)啟SMTP服務(wù) 案例:使用163郵箱來(lái)結(jié)合smtp模塊發(fā)送郵件 準(zhǔn)備工作: import smtplib #發(fā)送郵件模塊 from email.mime.text import MIMEText #定義郵件內(nèi)容 from email.header import Header #定義郵件標(biāo)題 #發(fā)送郵箱服務(wù)器 smtpserver='smtp.163.com' #發(fā)送郵箱用戶名密碼 user='yuexiaolu2015@163.com' password='…' #發(fā)送和接收郵箱 sender='yuexiaolu2015@163.com' receive='yuexiaolu2015@126.com' #發(fā)送郵件主題和內(nèi)容 subject='Web Selenium 自動(dòng)化測(cè)試報(bào)告' content='<html><h1 style="color:red">我要自學(xué)網(wǎng),自學(xué)成才!</h1></html>' #HTML郵件正文 msg=MIMEText(content,'html','utf-8') msg['Subject']=Header(subject,'utf-8') msg['From']='yuexiaolu2015@163.com' msg['To'] = 'yuexiaolu2015@126.com' #SSL協(xié)議端口號(hào)要使用465 smtp = smtplib.SMTP_SSL(smtpserver, 465) #HELO 向服務(wù)器標(biāo)識(shí)用戶身份 smtp.helo(smtpserver) #服務(wù)器返回結(jié)果確認(rèn) smtp.ehlo(smtpserver) #登錄郵箱服務(wù)器用戶名和密碼 smtp.login(user,password) print("開(kāi)始發(fā)送郵件...") smtp.sendmail(sender,receive,msg.as_string()) smtp.quit() print("郵件發(fā)送完成!") 發(fā)送帶附件的郵件案例:發(fā)送E:\Python_script\目錄下 logo.png圖片文件到指定的郵箱import smtplib #發(fā)送郵件模塊 from email.mime.text import MIMEText #定義郵件內(nèi)容 from email.mime.multipart import MIMEMultipart #用于傳送附件 #發(fā)送郵箱服務(wù)器 smtpserver='smtp.163.com' #發(fā)送郵箱用戶名密碼 user='yuexiaolu2015@163.com' password='070337shu' #發(fā)送和接收郵箱 sender='yuexiaolu2015@163.com' receives=['yuexiaolu2015@126.com','yuexiaolu2015@sina.com'] #發(fā)送郵件主題和內(nèi)容 subject='Web Selenium 附件發(fā)送測(cè)試' content='<html><h1 style="color:red">我要自學(xué)網(wǎng),自學(xué)成才!</h1></html>' #構(gòu)造附件內(nèi)容 send_file=open(r"E:\Python_script\logo.png",'rb').read() att=MIMEText(send_file,'base64','utf-8') att["Content-Type"]='application/octet-stream' att["Content-Disposition"]='attachment;filename="logo.png"' #構(gòu)建發(fā)送與接收信息 msgRoot=MIMEMultipart() msgRoot.attach(MIMEText(content, 'html', 'utf-8')) msgRoot['subject']=subject msgRoot['From']=sender msgRoot['To'] = ','.join(receives) msgRoot.attach(att) #SSL協(xié)議端口號(hào)要使用465 smtp = smtplib.SMTP_SSL(smtpserver, 465) #HELO 向服務(wù)器標(biāo)識(shí)用戶身份 smtp.helo(smtpserver) #服務(wù)器返回結(jié)果確認(rèn) smtp.ehlo(smtpserver) #登錄郵箱服務(wù)器用戶名和密碼 smtp.login(user,password) print("Start send email...") smtp.sendmail(sender,receives,msgRoot.as_string()) smtp.quit() print("Send End!") 整合測(cè)試報(bào)告發(fā)送案例:獲取…\Test_Baidu\test_report目錄下最新的測(cè)試報(bào)告import os #用于訪問(wèn)操作系統(tǒng)功能的模塊 #報(bào)告存放位置 report_dir='./test_report' #os.listdir() 方法用于返回指定的文件夾包含的文件或文件夾的名字的列表 lists=os.listdir(report_dir) #按時(shí)間順序?qū)υ撃夸浳募A下面的文件進(jìn)行排序 lists.sort(key=lambda fn:os.path.getatime(report_dir+'\\'+fn)) print(lists) print("latest report is :"+lists[-1]) #輸出最新報(bào)告的路徑 file=os.path.join(report_dir,lists[-1]) print(file) Python os模塊相關(guān)知識(shí): http://www.cnblogs.com/MnCu8261/p/5483657.html lambda 介紹 http://www.cnblogs.com/evening/archive/2012/03/29/2423554.html發(fā)送測(cè)試報(bào)告 案例:將E:\Python_script\unittest\Test_Baidu生成的最新測(cè)試報(bào)告發(fā)送到指定郵箱。 import unittest from BSTestRunner import BSTestRunner import time import smtplib #發(fā)送郵件模塊 from email.mime.text import MIMEText #定義郵件內(nèi)容 from email.header import Header #定義郵件標(biāo)題 import os def send_mail(latest_report): f=open(latest_report,'rb') mail_content=f.read() f.close() smtpserver='smtp.163.com' # 發(fā)送郵箱用戶名密碼 user = 'yuexiaolu2015@163.com' password = '…' # 發(fā)送和接收郵箱 sender = 'yuexiaolu2015@163.com' receives = ['yuexiaolu2015@126.com', 'yuexiaolu2015@sina.com'] # 發(fā)送郵件主題和內(nèi)容 subject = 'Web Selenium 自動(dòng)化測(cè)試報(bào)告' # HTML郵件正文 msg = MIMEText(mail_content, 'html', 'utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['From'] = sender msg['To'] = ','.join(receives) smtp = smtplib.SMTP_SSL(smtpserver, 465) # HELO 向服務(wù)器標(biāo)識(shí)用戶身份 smtp.helo(smtpserver) # 服務(wù)器返回結(jié)果確認(rèn) smtp.ehlo(smtpserver) # 登錄郵箱服務(wù)器用戶名和密碼 smtp.login(user, password) print("Start send Email...") smtp.sendmail(sender, receives, msg.as_string()) smtp.quit() print("Send Email end!") def latest_report(report_dir): lists = os.listdir(report_dir) # 按時(shí)間順序?qū)υ撃夸浳募A下面的文件進(jìn)行排序 lists.sort(key=lambda fn: os.path.getatime(report_dir + '\\' + fn)) print(("new report is :" + lists[-1])) file = os.path.join(report_dir, lists[-1]) print(file) return file if __name__ == '__main__': test_dir='./test_case' report_dir='./test_report' discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py") now = time.strftime("%Y-%m-%d %H_%M_%S") report_name = report_dir + '/' + now + 'result.html' with open(report_name, 'wb') as f: runner = BSTestRunner(stream=f, title="Test Report", description="baidu search") runner.run(discover) f.close() #h獲取最新測(cè)試報(bào)告 latest_report=latest_report(report_dir) #發(fā)送郵件報(bào)告 send_mail(latest_report) 163郵箱發(fā)生失敗的常見(jiàn)問(wèn)題http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html 補(bǔ)充知識(shí)點(diǎn)——By 元素定位 from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com/") driver.implicitly_wait(5) driver.find_element(By.ID,'kw').clear() driver.find_element(By.NAME,'wd').send_keys("Selenium ") driver.find_element(By.CLASS_NAME,'s_ipt').send_keys("自學(xué)網(wǎng) ") driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("自動(dòng)化測(cè)試") sleep(3) driver.find_element(By.ID,'su').click() sleep(3) driver.quit() · find_element(By.ID,"loginName") · find_element(By.NAME,"SubjectName") · find_element(By.CLASS_NAME,"u-btn-levred") · find_element(By.TAG_NAME,"input") · find_element(By.LINK_TEXT,"退出") · find_element(By.PARTIAL_LINK_TEXT,"退") · find_element(By.XPATH,".//*[@id='Title") · find_element(By.CSS_SELECTOR,"[type=submit]") 補(bǔ)充知識(shí)點(diǎn)——方法的參數(shù)個(gè)數(shù) def fun_args1(args): print("args is %s" %args) def fun_args2(args1,args2): print("args is %s and %s" %(args1,args2)) def fun_var_args(*args): for value in args: print("args:", value) # fun_args1('51zxw') # fun_args1() # fun_args2('51zxw','Python') # fun_args2('51zxw') fun_var_args("Python") fun_var_args("hello","51zxw") fun_var_args("Selenium",'Python','51zxw') fun_var_args() Page Object Page Object是Selenium自動(dòng)化測(cè)試項(xiàng)目開(kāi)發(fā)實(shí)踐的最佳設(shè)計(jì)模式之一,通過(guò)對(duì)界面元素和功能模塊的封裝減少冗余代碼,同時(shí)在后期維護(hù)中,若元素定位或功能模塊發(fā)生變化,只需要調(diào)整頁(yè)面元素或功能模塊封裝的代碼,提高測(cè)試用例的可維護(hù)性。 from time import sleep class Page(): '''頁(yè)面基礎(chǔ)類''' #初始化 def __init__(self, dirver): self.base_url = 'http://localhost' self.driver = dirver self.timeout = 10 #打開(kāi)不同的子頁(yè)面 def _open(self, url): url_ = self.base_url + url print("Test page is: %s" %url_) self.driver.maximize_window() self.driver.get(url_) sleep(2) assert self.driver.current_url == url_, 'Did ont land on %s' % url_ def open(self): self._open(self.url) #元素定位方法封裝 def find_element(self,*loc): return self.driver.find_element(*loc) from BasePage import * from selenium.webdriver.common.by import By class LoginPage(Page): '''首頁(yè)登錄頁(yè)面''' url='/' #定位器 username_loc=(By.NAME,'username') password_loc=(By.NAME,'password') submit_loc=(By.NAME,'Submit') #用戶名輸入框元素 def type_username(self,username): self.find_element(*self.username_loc).clear() self.find_element(*self.username_loc).send_keys(username) #密碼輸入框元素 def type_password(self,password): self.find_element(*self.password_loc).clear() self.find_element(*self.password_loc).send_keys(password) #登錄按鈕元素 def type_submit(self): self.find_element(*self.submit_loc).click() #登錄功能模塊封裝 def test_user_login(driver,username,password): '''測(cè)試用戶名密碼是否可以登錄''' login_page=LoginPage(driver) login_page.open() login_page.type_username(username) login_page.type_password(password) login_page.type_submit() loin_test.py from LoginPage import * from selenium import webdriver driver=webdriver.Firefox() username = '51zxw' password = '123456' test_user_login(driver, username, password) sleep(3) driver.quit() 參考文檔: http://blog.csdn.net/menglei8625/article/details/7721746 |
|