肖sir__po框架之ui自動化框架

xiaolehua發表於2024-04-20

po框架
一、ui自動化po框架介紹
(1)PO是Page Object的縮寫(pom模型)
(2)業務流程與頁面元素操作分離的模式,可以簡單理解為每個頁面下面都有一個配置class, 配置class就用來維護頁面元素或操作方法
(3)提高測試用例的可維護性、可讀取性
對比:傳統的設計測試用例存在的弊端:
1.易讀性差
2.複用性差
3.可維護性差
4.擴充套件性差

==============================================================================
二、ui自動化框架6個包

‘’'1、先建立一個cms專案
(1)建立第一個conf包存放所有配置檔案資訊(比如專案路徑和資料,用例的路徑)
可以封裝路徑
‘‘ini是一種配置檔案
在ui自動化測試中配置檔案的種類
ini、Excel、.py、yaml、txt’’’

(2)在建立第二個Data包放資料(測試資料)

在data包中建立一個TestData目錄(放測試資料)
測試環境的一些url地址和賬號密碼可以放在TestDta中
(3)在建立第三個report包==存放測試報告
在report包中建立一個Testrepot目錄(存放報告)
(4)在建立第四個public公共公開的包(存放一些功能用例)
在public包中建立pages存放元素層流程層(封裝所有頁面的公共方法,基類)
在public包中建立utils包(處理公共類公共函式都存放在此)
可以在utils中來讀取pages中封裝的登入的流程(封裝讀取ini檔案或者EXCEL表格的工具類和工具函式
(5)在建立第五個testcase用例包用來存放用例
編寫測試用例
(6)在建立第六個run包用來執行
透過執行測試用例中封裝好的用例在執行然後在repot中生成測試報告
框架的思想:把整個用例結構

==============================================================================
三、框架的編寫(實戰)

1、先conf包中新建cms_path將專案中的專案包的路徑都列印出來

import os
base_path=os.path.dirname(os.path.dirname(__file__))
print(base_path) #專案路徑
conf_path=os.path.join(base_path,'conf')
print(conf_path) #conf路徑
data_path=os.path.join(base_path,'data')
print(data_path) #data路徑
public_path=os.path.join(base_path,'public')
print(public_path) #public路徑
pages_path=os.path.join(base_path,'public','pages')
print(pages_path) #pages路徑
utils_path=os.path.join(base_path,'public','utils')
print(utils_path) #pages路徑
report_path=os.path.join(base_path,'report')
print(report_path) #report路徑
run_path=os.path.join(base_path,'run')
print(run_path) #data路徑
testcase_path=os.path.join(base_path,'testcase')
print(testcase_path) #data路徑


2、在conf包中新建一個cms_conf.ini的檔案:
將cms中url、賬號、密碼寫上

[test_data]
url=http://cms.e70w.com/manage/login.do
username=admin
pwd=123456

新建好了ini檔案,就要讀取ini檔案
3、在public中utils中新建 read_conf.py來讀取ini檔案

from configparser import ConfigParser
from conf.cms_path import *

class Read_Tni(ConfigParser):
def __init__(self,filename):
super(Read_Tni,self).__init__() #用來呼叫父類(或超類)的方法的 #在子類中呼叫父類的方法時,你可以使用 super() 函式。
#用了返回的臨時物件的 __init__ 方法#呼叫了父類的建構函式
以上程式碼:
super(Read_Ini, self).__init__() 這行程式碼的作用是在 Read_Ini 類中呼叫其父類(ConfigParser)的建構函式,確保父類的初始化程式碼被正確執行。這是在子類中重寫父類方法時常見的做法,以確保父類的原始行為不會被意外地覆蓋或遺漏
self.filename=filename #將傳入的filename引數值賦給類的例項變數(即屬性)filename
self.read(self.filename) #這行程式碼呼叫了ConfigParser類的read方法,用於讀取與例項關聯的.ini檔案
def read_data_ini(self,section=None,option=None):
value=self.get(section,option)
return value
file_path=os.path.join(conf_path,'cms_conf.ini')
read=Read_Tni(file_path)
url=read.read_data_ini('test_data','url')
# print(url)
username=read.read_data_ini('test_data','username')
# print(username)
pwd=read.read_data_ini('test_data','pwd')
# print(pwd)

4、在data包下新建一個excel 表格,填寫資訊如下
(1)開啟data存放地址


(2)xlsx中填寫的內容

寫好以上內容,進行儲存。有了excel表格就要讀取excel中的內容

==================================
5、我們要讀取excel表格:在util中新建read_excel.py檔案,透過xlrd
在下載 下載 :pip install xlrd==1.2.0


import xlrd
from conf.cms_path import *
import os
class Read_Excel(object):
def __init__(self,filename,sheet_name):
self.wookbook=xlrd.open_workbook(filename)
self.sheetname=self.wookbook.sheet_by_name(sheet_name)
def get_excel_data(self,row,col):
value=self.sheetname.cell(row,col).value
return value
if __name__ == '__main__':
file=os.path.join(data_path,'data.xlsx')
dx=Read_Excel(file,'cms_data')
url=dx.get_excel_data(1,0)
print(url)
username=dx.get_excel_data(1,1)
print(username)
pwd= dx.get_excel_data(1, 2)
print(pwd)


===================================
在public中pages包下新建兩個:BasePages和pages_elemnet 兩個py檔案:
BasePages包:

import unittest #匯入unittest 框架
from time import *
# 除錯程式碼
from selenium import webdriver
driver = webdriver.Chrome() #建立一個除錯程式碼
class BasePage(unittest.TestCase): #建立一個BasePage類,這個類繼承unittest框架中TestCase這個類
@classmethod #類方法你#類的# 裝飾器
def set_driver(cls,driver): #設定driver屬性,裡面driver是一個引數,
#入參是一個driver物件,把建立好的driver物件傳進來,變成BasePage這個類的屬性
#把傳進來的谷歌瀏覽器物件作為當前類、基類屬性,基類的變數
cls.driver = driver #類變數
@classmethod
def get_driver(cls): #單例設計模式# 獲取driver屬性
return cls.driver
# baidu_input=("id","kw")
@classmethod
def find_element(cls,element):
type = element[0] #id
value = element[1] #kw
if type == "id":
elem = cls.driver.find_element_by_id(value)
elif type == "xpath":
elem = cls.driver.find_element_by_xpath(value)
elif type == "class":
elem = cls.driver.find_element_by_class_name(value)
elif type == "name":
elem = cls.driver.find_element_by_name(value)
elif type == "css":
elem = cls.driver.find_element_by_css_selector(value)
elif type == "link_text":
elem = cls.driver.find_element_by_link_text(value)
elif type == "partial":
elem = cls.driver.find_element_by_partial_link_text(value)
else:
raise ValueError("plese input corrt paramters")
return elem
@classmethod #封裝輸入函式
def sendKeys(cls,elem,text):
return elem.send_keys(text)
@classmethod #封裝點選操作
def click(cls,elem):
return elem.click()
@classmethod
def wait(cls,sec):
'''封裝一個隱式等待'''
return driver.implicitly_wait(sec)

@classmethod
def sleep(cls,sec):
return sleep(sec)

@classmethod
def frame(cls,elem):
'''定位iframe框'''
return cls.driver.switch_to.frame(elem)

@classmethod
def outframe(cls):
return cls.driver.switch_to.default_content()

@classmethod
def get_text(cls,element):
'''封裝根據網頁元素拿到text值'''
value = BasePage.find_element(element).text
return value

if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
baidu_input = ("id","kw")
elem = BasePage.find_element(baidu_input).send_keys("多測師")
# elem = BasePage.find_element(baidu_input)
# BasePage.sendKeys(elem,"多測師")

以上是將定位元素和方法封裝好,在將
=============================================================
在新建:pages_element.py 包;將實際我們定位的(定位方法,定位地址)
class Pages_Element():
#1.輸入使用者名稱
userName = ("id", "userAccount")
#2.輸入密碼
passWord = ("id", "loginPwd")
#3.點選登陸
loginBtn = ("id", "loginBtn")
#4.斷言
desktop = ("xpath", "/html/body/div/section/div[1]/div[1]/ul/li/span")
# 5.點選使用者中心
user_center = ("xpath",'//*[@id="menu-user"]/dt')
#6.點選使用者管理
user_manager = ("link_text","使用者管理")
#7.定位外層iframe框
iframe = ("xpath","/html/body/div/section/div[2]/div[2]/iframe")
#8.點選新增使用者
user_add = ("partial","新增使用者")
以上是資料和定位方法,元素都確定好,開始編寫用例
=============================================================
我們在編寫測試用例:登陸用例
```python
from public.pages.Base_page import BasePage
from selenium import webdriver
from public.utils.read_excel import Read_Excel
from public.utils.read_conf import *
from public.pages.pages_element import Pages_Element as p
import unittest
class Test_Login(BasePage):
@classmethod
def setUpClass(cls) -> None:
driver= webdriver.Chrome() #建立一個唯一的driver物件
BasePage.set_driver(driver)
@classmethod
def tearDownClass(cls) -> None:
BasePage.sleep(2)

def test_01_login(self):
driver=BasePage.get_driver()
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(20)
elem=BasePage.find_element(p.userName)
BasePage.sendKeys(elem,username)
elem=BasePage.find_element(p.passWord)
BasePage.sendKeys(elem,pwd)
elem=BasePage.find_element(p.loginBtn)
BasePage.click(elem)
# v=BasePage.get_text(p.desktop)
# assert v=='我的桌面'
# driver.quit()
def test_02_login2(self):
elem = BasePage.find_element(p.user_center)
BasePage.click(elem)
BasePage.sleep(2)
elem2 = BasePage.find_element(p.user_manager)
BasePage.click(elem2)
BasePage.sleep(1)
elem2 = BasePage.find_element(p.iframe)
BasePage.frame(elem2)
BasePage.sleep(2)
elem3 = BasePage.find_element(p.user_add)
BasePage.click(elem3)
if __name__ == '__main__':
unittest.main()

=============================================================

在run包下新建:run_allcase
import time
import unittest
from public.utils.HTMLTestRunnerNew import HTMLTestRunner
from conf.cms_path import *
#定義生成報告的路徑以及檔名稱
now = time.strftime(‘%Y-%m-%d-%H-%M-%S’)

print(now)
filename = report_path+ “/” + str(now) + “_ui_report.html”

print(filename)
def auto_run():
discover = unittest.defaultTestLoader.discover(start_dir=testcase_path,
pattern=“test_*.py”)
f = open(filename,“wb”)
runner = HTMLTestRunner(stream=f,
title=“Cms後臺系統UI自動化測試報告”,
description=“用例執行情況如下”,
tester=“dcs”)
runner.run(discover)
f.close() #關閉檔案
if name == ‘main’:
auto_run()

=============================================================
在檢視報告包:
report包:

接著在testcase包編寫:test_add

from public.pages.Base_page import BasePage
from public.pages.pages_element import Pages_Element as p

class User_Center(BasePage):

@classmethod
def setUpClass(cls) -> None:
BasePage.sleep(1)

@classmethod
def tearDownClass(cls) -> None:
BasePage.sleep(1)

def test_02_user_center(self):
elem = BasePage.find_element(p.user_center)
BasePage.click(elem)
BasePage.sleep(2)
elem2 = BasePage.find_element(p.user_manager)
BasePage.click(elem2)
BasePage.sleep(1)
elem2 = BasePage.find_element(p.iframe)
BasePage.frame(elem2)
BasePage.sleep(2)
elem3 = BasePage.find_element(p.user_add)
BasePage.click(elem3)

相關文章