1. 程式人生 > 實用技巧 >說說UI自動化中的PO模式

說說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~

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

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