PageObject設(shè)計(jì)模式在 UI 自動化中的實(shí)踐總結(jié)(以 QQ 郵箱登陸為例)

本文節(jié)選自霍格沃茲《測試開發(fā)實(shí)戰(zhàn)進(jìn)階》課程教學(xué)內(nèi)容壶硅,進(jìn)階學(xué)習(xí)文末加群。

在 UI 自動化測試過程中芙粱,面對復(fù)雜的業(yè)務(wù)場景划咐,經(jīng)常會遇到這樣的挑戰(zhàn):

  • 簡單的錄制/回放速度快拴念,但無法適應(yīng)復(fù)雜場景;
  • 編寫自動化測試腳本比較靈活褐缠,但工作量大且可維護(hù)性差政鼠;
  • 以往的封裝技術(shù)(PageObject)可以適應(yīng)各種 UI 場景,但結(jié)構(gòu)松散队魏,無法在多項(xiàng)目中遷移公般;

因此万搔,測試團(tuán)隊(duì)通常還需要一種定制測試框架,用以彌補(bǔ)現(xiàn)有框架的缺點(diǎn)官帘。

測試框架封裝思想

由于 UI 自動化測試框架圍繞 UI 界面使用瞬雹,因此,依舊選用 PageObject 設(shè)計(jì)模式對 UI 及測試進(jìn)行封裝刽虹,同時(shí)配合 Pytest 單元測試將腳本能夠有效的組織酗捌、連貫應(yīng)用起來,從而提高框架的可維護(hù)性和可讀性涌哲。

由于測試框架基于 PageObject 設(shè)計(jì)模式胖缤,主要方向?yàn)?PO 改進(jìn),數(shù)據(jù)驅(qū)動阀圾,異常處理等哪廓,比如:

  • 測試數(shù)據(jù)的數(shù)據(jù)驅(qū)動:將數(shù)據(jù)存儲到外部 yaml 文件中,利用 yaml 工具進(jìn)行數(shù)據(jù)讀壬缘丁撩独;
  • 數(shù)據(jù)步驟的數(shù)據(jù)驅(qū)動:將操作步驟放到外部 yaml 文件中敞曹,利用 yaml 工具對操作步驟進(jìn)行讀取账月,用專門函數(shù)解析并實(shí)現(xiàn)操作步驟;
  • 自動化異常處理機(jī)制:對元素查找模塊進(jìn)行封裝和改進(jìn)澳迫,包括如何處理彈窗局齿;

Page_Object 改造

作為通用的 UI 測試框架, PageObjet 不僅適用于 Web 自動化測試橄登,也可適用 Appium 移動自動化測試抓歼,其優(yōu)點(diǎn)如下:

  • 減少代碼重復(fù)
  • 提高測試用例可讀性
  • 提高測試用例可維護(hù)性

[圖片上傳失敗...(image-baa165-1653040789184)]

PO 改造實(shí)例(基于雪球 App)

本案例將對雪球 App 進(jìn)行 Page Objetct 封裝與改進(jìn)。

當(dāng)啟動雪球 App 時(shí)拢锹,會進(jìn)入首頁谣妻。點(diǎn)擊搜索框進(jìn)入搜索頁,搜索某支股票然后判斷股價(jià)是否大于 200:

[圖片上傳失敗...(image-ebc1d3-1653040789184)]

PageObjetct 的模塊關(guān)系如下卒稳,所有的模塊要繼承 BasePage 蹋半, App 實(shí)現(xiàn)啟動,重啟充坑,停止等操作减江, Main 實(shí)現(xiàn)進(jìn)入搜索頁,進(jìn)入股票頁等操作:

[圖片上傳失敗...(image-f9e219-1653040789184)]

base_page 模塊是所有 page 類的父類捻爷,其中定義了公共方法辈灼,比如封裝下面的 find 方法后,可以讓子類調(diào)用 find :

from appium.webdriver.webdriver import WebDriver

class BasePage:
    _driver: WebDriver

    def __init__(self, driver: WebDriver = None):
        self._driver = driver

    def find(self, locator, value: str = None):
        #如果傳進(jìn)來的是tuple也榄,只需使用一個(gè)參數(shù):locator
        if isinstance(locator, tuple):
            return self._driver.find_element(*locator)
        else:
            return self._driver.find_element(locator, value)

App 模塊封裝 app 的啟動巡莹,重啟,停止等方法,當(dāng) app 啟動時(shí)會進(jìn)入 main 頁面降宅,因此在下面的 main 方法要 return Main 俐芯,Main 類的定義在后面會講解:

from appium import webdriver
from test_appium.page.base_page import BasePage
from test_appium.page.main import Main

class App(BasePage):
    #指定app的包名和activity名
    _package = "com.xueqiu.android"
    _activity = ".view.WelcomeActivityAlias"

    def start(self):
        #如果driver為空則初始化
        if self._driver is None:
            caps = {}
            caps["platformName"] = "android"
            caps["deviceName"] = "hogwarts"
            caps["appPackage"] = self._package
            caps["appActivity"] = self._activity
            caps["noReset"] = True
            #初始化driver
            self._driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
            self._driver.implicitly_wait(30)
        #如果driver不為空,則直接啟動activity
        else:
            print(self._driver)
            self._driver.start_activity(self._package, self._activity)

        return self

    def restart(self):
        pass

    def stop(self):
        pass

    def main(self) -> Main:
        #當(dāng)app啟動時(shí)钉鸯,跳轉(zhuǎn)到(實(shí)例化)Main
        return Main(self._driver)

Main 模塊是首頁的 PageObject 吧史,其中的方法封裝了首頁的重要功能,比如下面代碼中的 goto_search_page 封裝了點(diǎn)擊搜索并跳轉(zhuǎn)到 Search 頁:

from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.common.by import By

from test_appium.page.base_page import BasePage
from test_appium.page.profile import Profile
from test_appium.page.search import Search

class Main(BasePage):
    #點(diǎn)擊搜索按鈕后唠雕,進(jìn)入搜索頁
    def goto_search_page(self):
        self.find(MobileBy.ID, "tv_search").click()
        #進(jìn)入搜索頁
        return Search(self._driver)

    def goto_stocks(self):
        pass

    def goto_trade(self):
        pass

    def goto_messages(self):
        pass

Search 模塊可以搜索一支股票贸营,還可以獲取股票的價(jià)格,比如下圖:

[圖片上傳失敗...(image-fdeb78-1653040789184)]

封裝代碼如下:

from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.remote.webdriver import WebDriver

class Search:
    _driver: WebDriver

    def __init__(self, driver):
        self._driver = driver
    #輸入要搜索的內(nèi)容
    def search(self, key: str):
        self._driver.find_element(MobileBy.ID, "search_input_text").send_keys(key)
        self._driver.find_element(MobileBy.ID, "name").click()
        return self
    #獲取股票價(jià)格岩睁,用于判斷
    def get_price(self, key: str) -> float:
        return float(self._driver.find_element(MobileBy.ID, "current_price").text)

最后對上述代碼建立測試钞脂,新建測試模塊 test_search :

import pytest

from test_appium.page.app import App

class TestSearch:
    def setup(self):
        self.main = App().start().main()

    def test_search(self):
        assert self.main.goto_search_page().search("alibaba").get_price("BABA") > 200

以上,供大家參考捕儒,歡迎一起留言探討冰啃。

獲取更多相關(guān)資料:請?zhí)砑觱x,ceshiren001
https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=jianshu&timestamp=1653037966&author=MM

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刘莹,隨后出現(xiàn)的幾起案子阎毅,更是在濱河造成了極大的恐慌,老刑警劉巖点弯,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扇调,死亡現(xiàn)場離奇詭異,居然都是意外死亡抢肛,警方通過查閱死者的電腦和手機(jī)狼钮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捡絮,“玉大人熬芜,你說我怎么就攤上這事「N龋” “怎么了涎拉?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灵寺。 經(jīng)常有香客問我曼库,道長,這世上最難降的妖魔是什么略板? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任毁枯,我火速辦了婚禮,結(jié)果婚禮上叮称,老公的妹妹穿的比我還像新娘种玛。我一直安慰自己藐鹤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布赂韵。 她就那樣靜靜地躺著娱节,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祭示。 梳的紋絲不亂的頭發(fā)上肄满,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音质涛,去河邊找鬼稠歉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汇陆,可吹牛的內(nèi)容都是我干的怒炸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼毡代,長吁一口氣:“原來是場噩夢啊……” “哼阅羹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起教寂,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捏鱼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后孝宗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铺峭,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飒焦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了找蜜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猿诸。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婚被,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梳虽,到底是詐尸還是另有隱情址芯,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布窜觉,位于F島的核電站谷炸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禀挫。R本人自食惡果不足惜旬陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望语婴。 院中可真熱鬧描孟,春花似錦驶睦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廉羔,卻和暖如春溉痢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憋他。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工适室, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人举瑰。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓捣辆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親此迅。 傳聞我的和親對象是個(gè)殘疾皇子汽畴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容