說說UI自動化中的PO模式


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~

 

 

做一棵小草,誰也撼動不了………

如果您覺得本篇文章還不錯,歡迎點贊,轉發分享,感謝(*^_^*)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM