UI自動化框架bok-choy(selenium+python+page object)使用介紹

前言

bok choy是一個開源的使用python語言媳荒,以Page Object模式封裝selenium的驗收測試框架鸟顺。在工作中可以用它來做UI層面的自動化族铆。為了更好地理解本文叶堆,您需要有selenium和python的基礎(chǔ)知識包斑。

準備工作

需要安裝python和pip
使用pip安裝即可干旧。

pip install bok_choy

寫Page

PO設(shè)計模式中是以頁面(page)為一個單位渠欺,作為一個對象。將這個頁面所做的動作作為這個頁面對象的方法(比如點擊某個按鈕椎眯,在某個輸入框輸入文字等操作)挠将,在具體寫用例的時候都是實例化頁面對象,調(diào)用該對象的相應(yīng)方法编整,這樣寫的好處是:如果某個頁面進行了改版舔稀,頁面元素發(fā)生了改變,對測試用例是沒有影響的掌测,只要在相應(yīng)的Page object里修改相應(yīng)方法就好了内贮。
寫Pages前需要分析測試場景,以測試百度搜索為例汞斧,首先需要在百度搜索頁面輸入關(guān)鍵字夜郁,并點擊搜索按鈕。然后頁面會跳轉(zhuǎn)到一個搜索結(jié)果頁粘勒,我們驗證結(jié)果頁是否包含關(guān)鍵字即可竞端。在這個場景中,我們涉及到了兩個頁面庙睡,一個是搜索首頁事富,一個是搜索結(jié)果頁,我們新建一個pages.py文件乘陪,見下面的代碼赵颅。


  # -*- coding: utf-8 -*-
  from bok_choy.page_object import PageObject

  class BaiduSearchPage(PageObject):
      """
      Baidu search page
      """

    url = 'https://www.baidu.com/'

    def is_browser_on_page(self):
        return self.q(css='#su').is_present()

    def input_search_key(self, keyword):
        return self.q(css="#kw").fill(keyword)

    def click_search_btn(self):
        self.q(css="#su").click()

    def search(self, keyword):
        self.input_search_key(keyword)
        self.click_search_btn()
        BaiduSearchResultPage(self.browser).wait_for_page()

class BaiduSearchResultPage(PageObject):
    """
    Baidu search result page
    """
    url = None

    def is_browser_on_page(self):
        return self.q(css='h3').is_present()
    
    @property
    def search_results(self):
        return self.q(css='h3').first.text

如上述代碼所示,自己寫的頁面對象都繼承于bokchoy的PageObject暂刘,每個頁面對象都必須給url賦值饺谬,還要實現(xiàn)is_browser_on_page方法。
url是這個頁面的入口谣拣,在測試過程中募寨,會遇到一種情況是你不關(guān)心它的url具體是多少,因為這個頁面總是從別的頁面點擊進入的森缠,而不是直接從瀏覽器輸入url進入拔鹰,這時,將它的url設(shè)為None即可,上例中的BaiduSearchResultPage(搜索結(jié)果頁)就是這種情況贵涵。
is_browser_on_page方法列肢,是PageObject類的抽象方法恰画,需要在子類中具體實現(xiàn)。這個方法的作用主要是判斷瀏覽器打開的是不是你要的這個頁面瓷马。在百度搜索頁這個實例中拴还,為了確保搜索首頁打開并加載完成了,我用了搜索按鈕是否存在來判斷欧聘。而對于搜索結(jié)果頁片林,必須有測試結(jié)果在頁面展示出來,才能說明這個頁面完全打開了怀骤,所以用測試結(jié)果元素是否存在來判斷费封。
bok-choy中提供兩種定位方式:css和xpath,本例中使用css定位蒋伦。

self.q(css='#su')

除了url和is_browser_on_page是每個頁面對象都有的弓摘,其他方法需要根據(jù)具體頁面上的元素和操作來增加。
BaiduSearchPage-百度搜索首頁痕届,在這個頁面我們需要做的操作有1.在輸入框輸入文字韧献,所以我們寫了input_search_key方法;2.點擊搜索按鈕爷抓,所以我們寫了click_search_btn方法势决,從方法的命名上我們也能看出來這兩個方法是什么作用阻塑。一個完整的搜索動作蓝撇,包含了這兩個步驟,所以又寫了一個search方法陈莽。頁面中的各種操作方法相當于一塊一塊的拼圖渤昌,具體想拼成什么樣,根據(jù)不同測試場景可以自由地組合走搁。目前頁面中的search方法算是兩個小拼圖拼出的一個場景独柑。在百度的首頁,還可以點擊貼吧私植、圖片等忌栅,這些操作也可以寫到這個頁面對象中,以備其他測試場景使用曲稼。
BaiduSearchResultPage-搜索結(jié)果頁索绪,這個頁面是在搜索頁點搜索按鈕之后,跳轉(zhuǎn)進入的贫悄。進入這個頁面后瑞驱,主要是需要驗證搜索結(jié)果中包含搜索關(guān)鍵字。因而有了search_results來返回搜索第一個結(jié)果的文字窄坦,以便于在測試中去使用唤反。這個方法加了property裝飾器凳寺,區(qū)別將在下一部分展示。

寫測試用例

有了pages.py之后彤侍,就可以寫用例啦,建立test_search.py文件肠缨。

# -*- coding: utf-8 -*-
import os
import unittest
from bok_choy.web_app_test import WebAppTest
from pages import BaiduSearchPage, BaiduSearchResultPage

class TestBaidu(WebAppTest):
    """
    Tests for the Baidu site.
    """
    def setUp(self):
        """
        Instantiate the page object.
        """
        super(TestBaidu, self).setUp()
        self.baidu_search_page = BaiduSearchPage(self.browser)        

    def test_page_existence(self):
        """
        Make sure that the page is accessible.
        """
        self.baidu_search_page.visit()

    def test_search(self):
        test_key = u"學堂在線"
        self.baidu_search_page.visit().search(test_key)
        self.baidu_results_page = BaiduSearchResultPage(self.browser)
        result = self.baidu_results_page.search_results
        assert test_key in result[0]

if __name__ == '__main__':
    os.environ["SELENIUM_BROWSER"] = "chrome"
    unittest.main()

bok-choy默認是使用firefox運行測試用例,它支持的瀏覽器有火狐拥刻、chrome怜瞒、IE、safari和phantomjs般哼。如果想要修改運行測試的瀏覽器吴汪,需要修改一下環(huán)境變量SELENIUM_BROWSER即可。本例中蒸眠,我們將運行測試的瀏覽器換成了chrome漾橙。其他有效值有'firefox', 'internet explorer'楞卡, 'safari'和 'phantomjs'霜运,使用非火狐瀏覽器記得下載相應(yīng)的Webdriver,將webdriver放到與測試相同的文件夾下即可蒋腮。

在測試文件中淘捡,首先需要實例化頁面對象

self.baidu_search_page = BaiduSearchPage(self.browser)  

然后就可以調(diào)用該頁面對象的方法

self.baidu_search_page.visit().search(test_key)

請注意,在調(diào)用操作方法的時候先調(diào)用了visit()池摧,visit方法通過在頁面對象中定義的url打開頁面焦除。在頁面中做的任何操作,前提都是該頁面被正確地打開了作彤,所以每次調(diào)用都應(yīng)該先調(diào)visit()膘魄。
但是,我們注意到在取搜索結(jié)果的時候并沒有調(diào)用visit竭讳,代碼如下:

self.baidu_results_page.search_results

這是因為在寫search_results時创葡,我們加上了裝飾器property,那它就變成對象的屬性了绢慢,可以直接用“點”訪問到灿渴。
最后我們用assert 對測試結(jié)果進行驗證。

運行測試

代碼已寫完胰舆,現(xiàn)在可以跑測試(≧≦)/啦骚露! 運行結(jié)果如下。

testresult.png

在測試的過程中思瘟,如果測試用例沒有pass荸百,框架會自動默認在跑測試的路徑下保存截圖和日志,如果你想把他們保存在別的地方滨攻,可修改環(huán)境變量SCREENSHOT_DIR和SELENIUM_DRIVER_LOG_DIR够话。

bok-choy的基本使用就是如此蓝翰,你學會了嗎?想了解更多可訪問官方文檔(見參考文獻)哦~

以上示例代碼可在github查看

參考文獻

http://bok-choy.readthedocs.io/en/latest/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末女嘲,一起剝皮案震驚了整個濱河市畜份,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欣尼,老刑警劉巖爆雹,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愕鼓,居然都是意外死亡钙态,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門菇晃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來册倒,“玉大人,你說我怎么就攤上這事磺送∽ぷ樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵估灿,是天一觀的道長崇呵。 經(jīng)常有香客問我,道長馅袁,這世上最難降的妖魔是什么域慷? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮司顿,結(jié)果婚禮上芒粹,老公的妹妹穿的比我還像新娘兄纺。我一直安慰自己大溜,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布估脆。 她就那樣靜靜地躺著钦奋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疙赠。 梳的紋絲不亂的頭發(fā)上付材,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音圃阳,去河邊找鬼厌衔。 笑死,一個胖子當著我的面吹牛捍岳,可吹牛的內(nèi)容都是我干的富寿。 我是一名探鬼主播睬隶,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼页徐!你這毒婦竟也來了苏潜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤变勇,失蹤者是張志新(化名)和其女友劉穎恤左,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀绣,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡飞袋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了链患。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授嘀。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锣险,靈堂內(nèi)的尸體忽然破棺而出蹄皱,到底是詐尸還是另有隱情,我是刑警寧澤芯肤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布巷折,位于F島的核電站,受9級特大地震影響崖咨,放射性物質(zhì)發(fā)生泄漏锻拘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一击蹲、第九天 我趴在偏房一處隱蔽的房頂上張望署拟。 院中可真熱鬧,春花似錦歌豺、人聲如沸推穷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馒铃。三九已至,卻和暖如春痕惋,著一層夾襖步出監(jiān)牢的瞬間区宇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工值戳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留议谷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓堕虹,卻偏偏與公主長得像卧晓,于是被迫代替她去往敵國和親叶洞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理禀崖,服務(wù)發(fā)現(xiàn)衩辟,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法波附,類相關(guān)的語法艺晴,內(nèi)部類的語法,繼承相關(guān)的語法掸屡,異常的語法封寞,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件仅财、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 最近電視劇《我的前半生》的大火狈究,引出了一個社會性質(zhì)的問題。 唐晶說盏求,女人的工作的工資即使再...
    柚子好好吃閱讀 887評論 1 1
  • 朋友的ipad2比較老抖锥,系統(tǒng)是4.33的,在現(xiàn)在2016年的市場里碎罚,大部分的軟件都是兼容ios7 以上磅废,所以,很多...
    瑩bei___?閱讀 723評論 0 0