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~
做一棵小草,誰也撼動不了………
如果您覺得本篇文章還不錯,歡迎點贊,轉發分享,感謝(*^_^*)