PO封裝設計模式 -- Web頁面端測試


一、已登錄頁面 -->新建PO封裝的包 -- 以下源碼適用於python3以上的版本

 代碼優化新增 Image -->對操作步驟進行截圖

 二、basepage 包基礎類的封裝如下:

from selenium.webdriver.support.wait import WebDriverWait #顯示等待
from selenium.webdriver.support import expected_conditions as EC #判斷元素是否定位到

#頁面的基礎類 -->為后續類調用

class HomePage():
'''構造方法'''
def __init__(self,url,dr):
self.url = url
self.dr = dr

#封裝元素定位方式
def find_element(self,*loc):
try:
#入參本身就是元組 不需要加*
WebDriverWait(self.dr,10).until(EC.visibility_of_element_located(loc))
return self.dr.find_element(*loc)
except:
print(*loc + '元素定位在頁面中無法找到')

三、page 包封裝登錄頁面的類如下:
from selenium.webdriver.common.by import By #定位方式
from time import sleep
from TestCase.Gjs_Po.basepage.HomePage import *

#登錄頁面的類
class GjsLoginPage(HomePage):
#定位器
#輸入賬號
username_loc = (By.ID,"mobilePhone")
# 輸入密碼
password_loc = (By.ID,"password")
# 點擊登錄按鈕
loginButton_loc = (By.CSS_SELECTOR,"#loginBtn")
# 登錄后驗證信息
loginInfo_loc = (By.CSS_SELECTOR,'#realName')
# 點擊安全登錄
logout_loc = (By.CSS_SELECTOR,"a.fc-blue.mr-5")
#用戶名為空 --獲取錯誤信息
userNull_loc = (By.CSS_SELECTOR, "span.error")
#密碼為空 --獲取錯誤信息
passwordNull_loc = (By.CSS_SELECTOR, "span.error")
#用戶名輸入非法字符--獲取錯誤信息
usernameFeifa_loc = (By.CSS_SELECTOR, "span.error")


#打開登錄頁面
def openLoginPage(self):
self.dr.get(self.url)
self.dr.refresh()
self.dr.maximize_window()
sleep(0.5)

#輸入用戶名
def input_username(self,username):
#注意 self前面加上 *
self.find_element(*self.username_loc).send_keys(username)

#輸入密碼
def input_password(self,password):
self.find_element(*self.password_loc).send_keys(password)

#點擊登錄按鈕
def click_btn(self):
self.find_element(*self.loginButton_loc).click()

##登錄后驗證信息
def getInfo(self):
return self.find_element(*self.loginInfo_loc).text

#點擊安全退出
def logout_btn(self):
self.find_element(*self.logout_loc).click()

#用戶名為空
def usernameNull(self):
return self.find_element(*self.userNull_loc).text

#密碼為空
def passwordNull(self):
return self.find_element(*self.passwordNull_loc).text

#用戶名輸入非法字符--獲取錯誤信息
def userFeiFa(self):
return self.find_element(*self.usernameFeifa_loc).text

四、common 登錄用到的數據封裝Helper類 如下:
import xlrd
import os
import logging
import time

class Helper(object):

def readExcels(self,nrow):
# 讀取Excel數據 nrow是輸入的行數
table = xlrd.open_workbook('D:\Project\TestCase\Gjs_Po\data\Gjsinfo.xlsx', 'r')
sheet = table.sheet_by_index(0)
return sheet.row_values(nrow)

def readusername(self,nrow):
# 讀取用戶名
return str(self.readExcels(nrow)[0]) # 強制轉換為str

def readpassword(self,nrow):
# 讀取密碼
return str(self.readExcels(nrow)[1])

def readAssertText(self,nrow):
# 讀取預期結果
return str(self.readExcels(nrow)[2])

def dirName(self,filename=None,filePath=None):
#定義日志文件 filename = log.md 為存儲日志
return os.path.join(os.path.dirname(os.path.dirname(__file__)),filePath,filename)

def log(self,log_content):
'''日志定義級別'''
# 定義文件
logFile = logging.FileHandler(self.dirName('logInfo.md','log'), 'a',encoding='utf-8')
# log格式
fmt = logging.Formatter(fmt='%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s')
logFile.setFormatter(fmt)

# 定義日志
logger1 = logging.Logger('logTest', level=logging.DEBUG)
logger1.addHandler(logFile)
logger1.info(log_content)
logFile.close()

def SaveImage(self,driver,Filename):
"""用例失敗截圖"""
Rawpath = os.path.join(os.path.dirname(os.path.dirname(__file__)),"Image")
NewPicture = Rawpath + "\\" + time.strftime("%Y_%m_%d_%H_%M_%S") + "_" + Filename
driver.get_screenshot_as_file(NewPicture)

測試固件分離:
from selenium import webdriver
from TestCase.Gjs_Po.page.GjsLoginpage import *
import unittest

class MyunitTests(unittest.TestCase):

def setUp(self)-> None:
self.url = 'https://www.gjfax.com/toLogin'
self.dr = webdriver.Chrome()
self.dr.implicitly_wait(10)

#實例化一個對象
self.loginpage = GjsLoginPage(self.url,self.dr)

def tearDown(self)-> None:
self.dr.quit()


五、testCases 測試用例封裝,繼承unittest、Helper類,如下:
from TestCase.Gjs_Po.common.helper import *
from TestCase.Gjs_Po.common.ownUnit import *
import unittest

#類的繼承
class GjsTestLogin(MyunitTests,Helper):
#測試正常的登錄
def test_login_success(self):
#打開登錄頁面
self.loginpage.openLoginPage()
self.log('測試正常:自動化測試 -->打開登錄頁面')
#輸入用戶名
self.loginpage.input_username(self.readusername(1))
self.log('測試正常:自動化測試 -->輸入用戶名')
#輸入密碼
self.loginpage.input_password(self.readpassword(1))
self.log('測試正常:自動化測試 -->輸入密碼')
#點擊登錄
self.loginpage.click_btn()
self.log('測試正常:自動化測試 -->點擊登錄')
#斷言
self.assertEqual(self.loginpage.getInfo(),self.readAssertText(1))
self.log('測試正常:自動化測試 -->斷言登錄后信息是否符合預期')
self.SaveImage(self.dr,"login_success.png")
#點擊退出
self.loginpage.logout_btn()
self.log('測試正常:自動化測試 -->點擊安全退出')
self.log('第一條用例執行結束')

#測試密碼為空
def test_password_null(self):
# 打開登錄頁面
self.loginpage.openLoginPage()
self.log('測試密碼為空:自動化測試 -->點擊登錄頁面')
# 輸入用戶名
self.loginpage.input_username(self.readusername(2))
self.log('測試密碼為空:自動化測試 -->輸入用戶名')
# 不輸入密碼
self.loginpage.input_password(self.readpassword(2))
self.log('測試密碼為空:自動化測試 -->不輸入密碼')
# 點擊登錄
self.loginpage.click_btn()
self.log('測試密碼為空:自動化測試 -->點擊登錄')
# 斷言
self.assertEqual(self.loginpage.passwordNull(), self.readAssertText(2))
self.log('測試密碼為空:自動化測試 -->斷言密碼為空信息是否符合預期')
self.SaveImage(self.dr,"login_passwordNull.png")
self.log('第二條用例執行結束')

#測試用戶名為空
def test_username_null(self):
# 打開登錄頁面
self.loginpage.openLoginPage()
self.log('測試用戶名為空:自動化測試 -->點擊登錄頁面')
# 輸入用戶名
self.loginpage.input_username(self.readusername(3))
self.log('測試用戶名為空:自動化測試 -->不輸入用戶名')
# 輸入密碼
self.loginpage.input_password(self.readpassword(3))
self.log('測試用戶名為空:自動化測試 -->輸入密碼')
# 點擊登錄
self.loginpage.click_btn()
self.log('測試用戶名為空:自動化測試 -->點擊登錄')
# 斷言
self.assertEqual(self.loginpage.usernameNull(), self.readAssertText(3))
self.log('測試用戶名為空:自動化測試 -->斷言用戶名為空信息是否符合預期')
self.SaveImage(self.dr,"login_usernameNull.png")
self.log('第三條用例執行結束')

#測試用戶名輸入非法字符
def test_username_Feifa(self):
# 打開登錄頁面
self.loginpage.openLoginPage()
self.log('測試用戶名輸入非法:自動化測試 -->點擊登錄頁面')
# 輸入非法用戶名
self.loginpage.input_username(self.readusername(4))
self.log('測試用戶名輸入非法:自動化測試 -->輸入非法用戶名')
# 輸入密碼
self.loginpage.input_password(self.readpassword(4))
self.log('測試用戶名輸入非法:自動化測試 -->輸入密碼')
# 點擊登錄
self.loginpage.click_btn()
self.log('測試用戶名輸入非法:自動化測試 -->點擊登錄')
# 斷言
self.assertEqual(self.loginpage.userFeiFa(), self.readAssertText(2))
self.log('測試用戶名輸入非法:自動化測試 -->斷言用戶名輸入非法信息是否符合預期')
self.SaveImage(self.dr,"login_usernameFeifa.png")
self.log('第四條用例執行結束')

if __name__ == '__main__':
unittest.main(verbosity=2)

六、mail郵件的類封裝如下:
import smtplib
import os
from email.mime.multipart import MIMEMultipart #郵件附件類
from email.mime.text import MIMEText #郵件模板類
from email.header import Header #郵件頭部模板

#發送帶附件的函數
def semd_mail(file_new):
with open(file_new, "rb") as fp:
mail_body = fp.read()

#基本信息
smtpserver = "smtp.163.com"
port = 25
sender = "1879781xxxx@163.com"
psw = "qqqxxx" #163郵箱密碼
receiver = "1512500xxx@qq.com"

#定義郵箱主題
msg = MIMEMultipart()
msg['subject'] = Header(u"自動化測試報告","utf-8")
msg['from'] = sender
msg["to"] = receiver

#不加msg['from'] msg["to"]會報錯,是因為"收件人和發件人沒有定義"
#HTML 郵件正文,直接發送附件的代碼
body = MIMEText(mail_body,"html","utf-8")
msg.attach(body)
# 附件
att = MIMEText(mail_body,"base64","utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename="test_report.html'
msg.attach(att)

#鏈接郵件服務器發送郵件
try:
smtp = smtplib.SMTP()
smtp.connect(smtpserver) # 連服務器
smtp.login(sender, psw)
except:
smtp = smtplib.SMTP_SSL(smtpserver, port)
smtp.login(sender, psw) # 登錄
smtp.sendmail(sender, receiver, msg.as_string()) # 發送
print("郵件發送成功")
smtp.quit()


#查找最新的郵件
def new_file(report_path):
result_path = report_path
lists = os.listdir(result_path)
lists.sort() #從小到大排序
file = [x for x in lists if x.endswith(".html")]
file_new_name = os.path.join(result_path,file[-1])
return file_new_name
七、runAllcase.py 一鍵執行測試用例 Main()執行
from TestCase.Gjs_Po.common.HTMLTestRunner import *
from TestCase.Gjs_Po.mail.sendmail163 import *
#實現的邏輯
#先生成測試報告
#查找最新的測試報告文件,通過new_file函數找到最新的測試報告,把返回的結果return file_new_name
#把new_file函數,file_new_name文件傳入到send_mail 讀取出來,然后以郵件的附件形式加載到郵件模板中,設置參數,鏈接服務器發送最新的測試報告#


if __name__ == '__main__':
report = os.path.dirname(__file__) #D:/Project/TestCase/Gjs_Po
test_path = os.path.join(report,"testcase") #測試用例文件夾
suite = unittest.defaultTestLoader.discover(
start_dir=test_path,pattern="Gjs_login*.py",top_level_dir=None)
report_path = os.path.join(report,"report") #測試報告文件夾
if not os.path.exists(report_path):
os.mkdir(report_path)
else:
print('存在report報告文件夾')
now = time.strftime("%Y-%m-%d %H_%M_%S") #時間戳
file_name = report_path + '\\' + now + "report_test.html" #測試報告文件名
fp = open(file_name,"wb")
runner = HTMLTestRunner(
stream = fp,
title = 'GJs自動化測試報告',
description = 'u"系統環境:Windows7 瀏覽器:Chrome 用例執行情況:"'
)
runner.run(suite) #執行測試用例
fp.close()

new_report = new_file(report_path) #獲取最新的報告文件
semd_mail(new_report) #發送最新的測試報告


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM