文章目錄
- 一、什么是 POM
- 二、如何基于 POM 進行自動化框架架構?
- 1、base 層封裝
- 2、pageobjects 層封裝
- 3、TestCases 層封裝
- 三、元素和方法分離&數據分離
- 1、哪些部分可以進行分離
- 2、示例代碼
- 四、總結
一、什么是 POM
POM page object model 頁面對象模型 WEB 自動化測試框架應用最為廣泛的一種框架設計模式
設計思路: web 項目由很多頁面組成,把每個頁面當做頁面對象來進行設計
Python 專題: 什么是對象?通過類描述一組對象 對象=屬性+方法
某電商項目 = n 個 頁面
登錄頁面=對每個頁面設計對應頁面類=相同屬性+相同的方法
class LoginPage:
#屬性?元素、頁面標題…
#方法?你在頁面進行操作/行為:點擊、定位、輸入…等等元素及頁面的操作
每個頁面有相同的屬性及方法 比如:點擊、輸入、元素定位
基于 POM 進行設計分為四層進行架構:
- 第一層 basepage 層 每個頁面有相同的屬性及方法 比如:點擊、輸入、元素定位
- 第二層 pageobjects 層 針對每個頁面定義頁面類 每個頁面有獨有的屬性及方法
登錄頁面 LoginPage 類
注冊頁面 RegisterPage 類 - 第三層 TestCases 層 用例層包含項目的業務流程
- 第四層 TestData 測試數據
二、如何基于 POM 進行自動化框架架構?
1、base 層封裝
from selenium import webdriver
import timeclass BasePage:"""BasePage:定義每個頁面的相同屬性及方法相同屬性?獲取瀏覽器驅動對象(數據)相同方法?元素定位、點擊、輸入...等等操作"""def __init__(self,driver=webdriver.Edge()):self.driver = driverdef locator(self,loc):"""元素定位"""# 參數loc,里面包含兩個參數# loc = (By.LINK_TEXT,'登錄')# *loc,是把外面括號去掉,變成2個參數return self.driver.find_element(*loc) # WebElement 對象def input(self,loc,value):"""輸入"""self.locator(loc).send_keys(value)def click(self,loc):"""點擊"""self.locator(loc).click()def sleep(self,s):time.sleep(s)
2、pageobjects 層封裝
from TestPOM.base.basepage import BasePage
from selenium.webdriver.common.by import By
class LoginPage(BasePage):"""登錄頁面類=頁面獨有的屬性及方法頁面獨有的屬性:頁面元素定位方法:登錄頁面的操作"""# 登錄頁面的屬性el_login = (By.XPATH, '//button[text()="登錄"]')el_username = (By.NAME, "accounts")el_password = (By.XPATH, '//input[@type="password"]')url = "http://116.62.63.211/shop/user/logininfo.html"# 方法def login(self, username, password):# 實現登錄步驟self.driver.get(self.url)self.sleep(1)# 輸入用戶名self.input(loc=self.el_username, value=username)# 輸入密碼self.input(loc=self.el_password, value=password)# 點擊登錄self.click(loc=self.el_login)self.sleep(1)
3、TestCases 層封裝
import unittest
from TestPOM.pageobjects.webpage import LoginPageclass TestLogin(unittest.TestCase):def test_login(self):# 實例化對象loginPage = LoginPage()username = "hc_test"password = "hctest123"loginPage.login(username=username, password=password)
三、元素和方法分離&數據分離
1、哪些部分可以進行分離
- 1、頁面對象類-元素定位+方法再一次進行分離:元素定位層+業務流程層,更利于團隊分工合作
- 2、項目數據分離
- a、項目的全局配置數據進行分離:項目地址/根地址、頁面地址、數據庫賬號及地址、測試報告路徑、數據路徑
- b、業務流程中的數據進行分離
2、示例代碼
a、Global_Datas.py 項目的全局配置數據
# 根路徑
base_url = "http://116.62.63.211/shop"
# 登錄路徑
login_url = base_url + "/user/logininfo.html"
b、login_datas.py 登錄業務流程中的數據
success = ("hc_test","hctest123")
fail = ("hc_test","hctest123456")
c、login_page_loc.py 登錄頁面的定位元素:
from selenium.webdriver.common.by import By"""
登錄頁面類=頁面獨有的屬性及方法
頁面獨有的屬性:頁面元素定位
方法:登錄頁面的操作
"""
class LoginPageLoc:el_login = (By.XPATH, '//button[text()="登錄"]')el_username = (By.NAME, "accounts")el_password = (By.XPATH, '//input[@type="password"]')
d、login_page.py 登錄頁面的操作方法
from TestPOM.base.basepage import BasePage
from TestPOM.pagelocators.login_page_loc import LoginPageLoc as Locs
from TestPOM.testdatas import Global_Datas as GDatasfrom selenium.webdriver.common.by import By
class LoginPage(BasePage):# 方法def login(self, username, password):# 實現登錄步驟self.driver.get(GDatas.login_url)self.sleep(1)# 輸入用戶名self.input(loc=Locs.el_username, value=username)# 輸入密碼self.input(loc=Locs.el_password, value=password)# 點擊登錄self.click(loc=Locs.el_login)self.sleep(1)
e、testcase_login.py 登錄頁面的用例
import unittest
from TestPOM.pageobjects.login_page import LoginPage
from TestPOM.testdatas import login_datas as ldclass TestLogin(unittest.TestCase):def test_login(self):# 實例化對象loginPage = LoginPage()loginPage.login(username=ld.success[0], password=ld.success[1])
四、總結
pom : 把每個頁面或每個模塊當做一個對象來進行編程 實現某個業務流程的測試=調用頁面對象的一些屬性及方法實現測試
數據驅動: 用外部數據驅動測試
關鍵字驅動: 所有業務流程封裝成對應的函數 實現某個業務流程的測試=調用多個關鍵字
方法,實現業務流程的測試