說說UI自動化中的PO模式
阿新 • • 發佈:2020-11-24
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~
做一棵小草,誰也撼動不了………
如果您覺得本篇文章還不錯,歡迎點贊,轉發分享,感謝(*^_^*)