Python Selenium設(shè)計(jì)模式-POM

前言

本文就python selenium自動(dòng)化測(cè)試實(shí)踐中所需要的POM設(shè)計(jì)模式進(jìn)行分享,以便大家在實(shí)踐中對(duì)POM的特點(diǎn)、應(yīng)用場(chǎng)景和核心思想有一定的理解和掌握坞笙。

為什么要用POM

基于python selenium2開(kāi)始UI級(jí)自動(dòng)化測(cè)試并不是多么艱巨的任務(wù)梅猿。只需要定位到元素,執(zhí)行對(duì)應(yīng)的操作即可诵次。下面我們看一下這個(gè)簡(jiǎn)單的腳本實(shí)現(xiàn)百度搜索账蓉。

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.implicitly_wait(30)

# 啟動(dòng)瀏覽器,訪問(wèn)百度
driver.get("http://www.baidu.com")

# 定位 百度搜索框逾一,并輸入selenium
driver.find_element_by_id("kw").send_keys("selenium")

# 定位 百度一下 按鈕并單擊進(jìn)行搜索
driver.find_element_by_id("su").click()
time.sleep(5)

driver.quit()

從上述代碼來(lái)看铸本,我們所能做的就是定位到元素,然后進(jìn)行鍵盤(pán)輸入或鼠標(biāo)動(dòng)作遵堵。就這個(gè)小程序而已箱玷,維護(hù)起來(lái)看起來(lái)是很容易的。但隨著時(shí)間的遷移陌宿,測(cè)試套件將持續(xù)的增長(zhǎng)锡足。腳本也將變得越來(lái)越臃腫龐大。如果變成我們需要維護(hù)10個(gè)頁(yè)面壳坪,100個(gè)頁(yè)面舶得,甚至1000個(gè)呢?那頁(yè)面元素的任何改變都會(huì)讓我們的腳本維護(hù)變得繁瑣復(fù)雜爽蝴,而且變得耗時(shí)易出錯(cuò)沐批。

那怎么解決呢?
在自動(dòng)化測(cè)試中蝎亚,引入了Page Object Model(POM):頁(yè)面對(duì)象模式來(lái)解決九孩,POM能讓我們的測(cè)試代碼變得可讀性更好,高可維護(hù)性颖对,高復(fù)用性捻撑。

下圖為非POM和POM對(duì)比圖:


pom.png

POM是什么

  • 頁(yè)面對(duì)象模型(POM)是一種設(shè)計(jì)模式,用來(lái)管理維護(hù)一組web元素集的對(duì)象庫(kù)
  • 在POM下缤底,應(yīng)用程序的每一個(gè)頁(yè)面都有一個(gè)對(duì)應(yīng)的page class
  • 每一個(gè)page class維護(hù)著該web頁(yè)的元素集和操作這些元素的方法
  • page class中的方法命名最好根據(jù)其對(duì)應(yīng)的業(yè)務(wù)場(chǎng)景進(jìn)行顾患,例如通常登錄后我們需要等待幾秒中,我們可以這樣命名該方法: waitingForLoginSuccess().

下面我們看看POM的代碼目錄組織示例:


pages_dir.png

POM的優(yōu)勢(shì)

  1. POM提供了一種在UI層操作个唧、業(yè)務(wù)流程與驗(yàn)證分離的模式江解,這使得測(cè)試代碼變得更加清晰和高可讀性
  2. 對(duì)象庫(kù)與用例分離,使得我們更好的復(fù)用對(duì)象徙歼,甚至能與不同的工具進(jìn)行深度結(jié)合應(yīng)用
  3. 可復(fù)用的頁(yè)面方法代碼會(huì)變得更加優(yōu)化
  4. 更加有效的命名方式使得我們更加清晰的知道方法所操作的UI元素犁河。例如我們要回到首頁(yè)鳖枕,方法名命名為: gotoHomePage(),通過(guò)方法名即可清晰的知道具體的功能實(shí)現(xiàn)。

POM實(shí)現(xiàn)示例

下面我們看下使用POM百度搜索 POM代碼示例:
看先下代碼組織結(jié)構(gòu)如下:


page_demo_dir.png
# basePage.py代碼如下
# _*_ coding:utf-8 _*_

__author__ = '苦葉子'

import sys
reload(sys)
sys.setdefaultencoding("utf-8")


# pages基類(lèi)
class Page(object):
    """
        Page基類(lèi)桨螺,所有page都應(yīng)該繼承該類(lèi)
    """
    def __init__(self, driver, base_url=u"http://www.baidu.com"):
        self.driver = driver
        self.base_url = base_url
        self.timeout = 30
    
    def find_element(self, *loc):
        return self.driver.find_element(*loc)
    
    def input_text(self, loc, text):
        self.find_element(*loc).send_keys(text)
        
    def click(self, loc):
        self.find_element(*loc).click()
        
    def get_title(self):
        return self.driver.title
# searchPage.py 代碼如下
# _*_ coding:utf-8 _*_

__author__ = '苦葉子'

import sys

from selenium.webdriver.common.by import By
from pages.basePage import Page

reload(sys)
sys.setdefaultencoding("utf-8")


# 百度搜索page
class SearchPage(Page):
    # 元素集
    
    # 搜索輸入框
    search_input = (By.ID, u'kw')
    # 百度一下 按鈕
    search_button = (By.ID, u'su')
    
    def __init__(self, driver, base_url=u"http://www.baidu.com"):
        Page.__init__(self, driver, base_url)
        
    def gotoBaiduHomePage(self):
        print u"打開(kāi)首頁(yè): ", self.base_url
        self.driver.get(self.base_url)
        
    def input_search_text(self, text=u"開(kāi)源優(yōu)測(cè)"):
        print u"輸入搜索關(guān)鍵字: 開(kāi)源優(yōu)測(cè) "
        self.input_text(self.search_input, text)
        
    def click_search_btn(self):
        print u"點(diǎn)擊 百度一下  按鈕"
        self.click(self.search_button)
# testSearchPage.py代碼如下
# _*_ coding:utf-8 _*_

__author__ = '苦葉子'

import unittest
import sys

from selenium import webdriver
from pages.searchPage import SearchPage

reload(sys)
sys.setdefaultencoding("utf-8")


# 百度搜索測(cè)試
class TestSearchPage(unittest.TestCase):
    
    def setUp(self):
        self.driver = webdriver.Ie()
        
    def testSearch(self):
        driver = self.driver
        # 百度網(wǎng)址
        url = u"http://www.baidu.com"
        # 搜索文本
        text = u"開(kāi)源優(yōu)測(cè)"
        # 期望驗(yàn)證的標(biāo)題
        assert_title = u"開(kāi)源優(yōu)測(cè)_百度搜索"
        print assert_title
        
        search_Page = SearchPage(driver, url)
        
        # 啟動(dòng)瀏覽器宾符,訪問(wèn)百度首頁(yè)
        search_Page.gotoBaiduHomePage()
        
        # 輸入 搜索詞
        search_Page.input_search_text(text)
        
        # 單擊 百度一下 按鈕進(jìn)行搜索
        search_Page.click_search_btn()
        
        # 驗(yàn)證標(biāo)題
        self.assertEqual(search_Page.get_title(), assert_title)
        
    def tearDown(self):
        self.driver.quit()
# 主入口程序代碼如下
# _*_ coding:utf-8 _*_

__author__ = '苦葉子'

import unittest
import sys

from common import HTMLTestRunner
from testcase.testSearchPage import TestSearchPage


reload(sys)
sys.setdefaultencoding("utf-8")


if __name__ == '__main__':
    testunit = unittest.TestSuite()
    testunit.addTest(TestSearchPage('testSearch'))
    
    # 定義報(bào)告輸出路徑
    htmlPath = u"page_demo_Report.html"
    fp = file(htmlPath, "wb")
    
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, 
           title=u"百度測(cè)試", 
           description=u"測(cè)試用例結(jié)果")
    
    runner.run(testunit)
    
    fp.close()

按照如圖所示組織代碼結(jié)構(gòu),輸入如上代碼灭翔,執(zhí)行以下命令運(yùn)行魏烫,會(huì)在當(dāng)前目錄生成測(cè)試報(bào)告:

python main.py

總結(jié)

最后做個(gè)總結(jié),所有代碼請(qǐng)手動(dòng)輸入肝箱,不要直接拷貝哄褒。再次對(duì)POM進(jìn)行小結(jié)

  1. POM是selenium webdriver自動(dòng)化測(cè)試實(shí)踐對(duì)象庫(kù)設(shè)計(jì)模式
  2. POM使得測(cè)試腳本更易于維護(hù)
  3. POM通過(guò)對(duì)象庫(kù)方式進(jìn)一步優(yōu)化了元素、用例煌张、數(shù)據(jù)的維護(hù)組織
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呐赡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骏融,更是在濱河造成了極大的恐慌链嘀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绎谦,死亡現(xiàn)場(chǎng)離奇詭異管闷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)窃肠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刷允,“玉大人冤留,你說(shuō)我怎么就攤上這事∈髟睿” “怎么了纤怒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)天通。 經(jīng)常有香客問(wèn)我泊窘,道長(zhǎng),這世上最難降的妖魔是什么像寒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任烘豹,我火速辦了婚禮,結(jié)果婚禮上诺祸,老公的妹妹穿的比我還像新娘携悯。我一直安慰自己,他們只是感情好筷笨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布憔鬼。 她就那樣靜靜地躺著龟劲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轴或。 梳的紋絲不亂的頭發(fā)上昌跌,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音照雁,去河邊找鬼蚕愤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囊榜,可吹牛的內(nèi)容都是我干的审胸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卸勺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砂沛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起曙求,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碍庵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悟狱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體静浴,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年挤渐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苹享。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浴麻,死狀恐怖得问,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情软免,我是刑警寧澤宫纬,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站膏萧,受9級(jí)特大地震影響漓骚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榛泛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一蝌蹂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挟鸠,春花似錦叉信、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)硅急。三九已至,卻和暖如春佳遂,著一層夾襖步出監(jiān)牢的瞬間营袜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工丑罪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荚板,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓吩屹,卻偏偏與公主長(zhǎng)得像跪另,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煤搜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理免绿,服務(wù)發(fā)現(xiàn),斷路器擦盾,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,745評(píng)論 25 707
  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案嘲驾? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • 在生活壓力,工作壓力繁重的今天迹卢,你有多久沒(méi)有睡個(gè)好覺(jué)了辽故,你是否在醒來(lái)時(shí)脾氣暴躁,臉色暗沉腐碱,每天叫醒你的不...
    小昭妮兒閱讀 330評(píng)論 -1 2