PO模式,全稱PageObject模式,即頁面對象模式。將頁面定位與業務操作分離。
po模式有以下幾個優點:
1.易讀性好
2.擴展性高
3.復用性強
4.維護性好
5.代碼冗余率低
了解了po模式及po模式的優點,可po模式在實際項目中到底該怎么做呢?接下來我們就來看看:
在本篇中我將po模式分為三層,分別是頁面定位層,頁面對象層,業務邏輯層;我將對每層逐一介紹。
一、頁面定位層:每個頁面作為一個模塊,將頁面元素定位表達式統一存放在該頁面

例:登錄頁面模塊部分代碼如下
from selenium.webdriver.common.by import By
class LoginPageLoc:
# 用戶名輸入框
user_loc = (By.XPATH, '//input[@name="phone"]')
# 密碼輸入框
passwd_loc = (By.XPATH, '//input[@name="password"]')
# 登陸按鈕
login_button_loc = (By.TAG_NAME, "button")
# 錯誤提示框
form_error_loc = (By.XPATH, '//div[@class="form-error-info"]')
# 頁面中dialog的提示
dialog_error_loc = (By.XPATH, '//div[@class="layui-layer-content"]')
二、頁面對象層:存放每個頁面對象操作

例:登錄頁面的登錄、獲取錯誤信息等操作
from PageLocators.login_page_loc import LoginPageLoc as loc
from Common.basepage import BasePage
# 說明,本框架對selenium庫中通用的元素行為方法做了二次封裝(添加日志與截圖),因此繼承封裝后的模塊basepase
class LoginPage(BasePage):
# 元素操作 # 登錄操作
def login(self,username,passwd):
self.input_text(loc.user_loc,username,"登錄頁面_用戶名輸入")
self.input_text(loc.passwd_loc,passwd,"登錄頁面_密碼輸入")
self.click_element(loc.login_button_loc,"登錄頁面_點擊登錄按鈕")
# 獲取提示信息
def get_error_msg(self):
return self.get_element_text(loc.form_error_loc,"登錄頁面_表單區域錯誤提示")
# 獲取頁面中的錯誤提示信息
def get_error_msg_from_dialog(self):
return self.get_element_text(loc.dialog_error_loc,"登錄頁面_頁面中間toast錯誤提示")
三、業務邏輯層:組合業務操作,即編寫測試用例

例:登錄功能,登錄成功測試用例
@ddt.ddt
class TestLogin(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.get(CD.login_url)
self.lp = LoginPage(self.driver)
def tearDown(self) -> None:
self.driver.quit()
# 正常場景 - 登錄成功。
def test_login_success(self):
logging.info("******* 登錄功能 - 正常場景用例:登錄成功 *******")
# 調用登錄頁面的登錄行為。
self.lp.login(LD.success_data["user"], LD.success_data["passwd"])
# 斷言 - 首頁當中,應該存在 退出元素。
self.assertTrue(HomePage(self.driver).check_user_exist())
# 斷言2 - 首頁url地址
self.assertEqual(self.driver.current_url,LD.success_data["check_url"])
登錄成功用例較簡單,未涉及過多流程和元素操作,可以看看下面一個投資成功的測試用例:
@ddt.ddt
class TestInvest(unittest.TestCase):
def setUp(self) -> None:
# 1、(前置)登陸頁面登陸;
self.driver = webdriver.Chrome()
self.driver.get(CD.login_url)
LoginPage(self.driver).login(CD.user,CD.passwd)
# 2.首頁選標,選擇頁面第一個標(默認此標符合此次用例投資標准)
HomePage(self.driver).click_first_bid()
self.bp = BidPage(self.driver)
def tearDown(self) -> None:
self.driver.quit()
# 正常場景 - 投資成功
def test_invest_success(self):
logging.info("******* 投資功能 - 正常場景用例:投資1000元成功。用戶可用余額減少1000,標余額減少1000 *******")
# 3、標頁面獲取用戶余額;
user_money_before_invest = self.bp.get_user_money()
# 4、標頁面獲取 標的余額;
bid_money_before_invest = self.bp.get_bid_left_money()
# 5、標頁面:投標動作;
self.bp.invest(ID.success["money"])
# 6、點擊投標成功提示框當中:查看並激活按鈕
self.bp.click_activeButton_on_success_popup()
# 7、個人頁面:獲取用戶余額
user_money_after_invest = UserPage(self.driver).get_user_left_money()
# 8、回退到標頁面、刷新后:再次獲取標的余額
self.driver.back()
self.driver.refresh()
bid_money_after_invest = self.bp.get_bid_left_money()
# 9、斷言
self.assertEqual(ID.success["money"],int(float(user_money_before_invest) - float(user_money_after_invest)))
self.assertEqual(ID.success["money"],int((float(bid_money_before_invest) - float(bid_money_after_invest))*10000))
關於自動化中的PO模式,大概就講這么多啦。。。O(∩_∩)O~
做一棵小草,誰也撼動不了………
如果您覺得本篇文章還不錯,歡迎點贊,轉發分享,感謝(*^_^*)
