selenium3 web自動化測試框架 三:項目實戰中PO模型的設計與封裝

po模型設計思想


  Page Object 模式主要是將每一個頁面設計爲一個class,其中包含頁面中的須要測試的元素(按鈕,輸入框,標題等),這樣在Selenium測試頁面中能夠經過調取頁面類來獲取頁面元素,這樣避免當頁面元素id或者位置變化後,須要改測試代碼。當元素ID變化時,只須要改測試頁面Class中的頁面屬性便可。將頁面定位與和業務分開,分離測試對象(元素對象)和測試腳本(用例腳本),提升可維護性。html

  Page Object模式是一種自動化測試設計模式,將頁面定位和業務操做分開,分離測試對象(元素對象)和測試腳本(用例腳本),提升用例的可維護性。web

       unittest是一種單元測試框架,用於設計各式各樣的測試用例,可調用PageObject設計的頁面類(對象),設計出更加可維護的用例。它提供用例組織與執行,提供豐富的比較(斷言)方法,提供豐富的日誌,統一適用於web自動化用例的開發與執行。設計模式

    How Google Test(谷歌測試之道),書中對web產品測試就分爲敏捷測試金字塔的三層,而且工做量配比是,Unit(單元測試):70%,Service(API):20%,UI(GUI):10%。框架

  因此UI自動化最核心的問題定位是,跟業務層解耦出來,單獨處理定位的問題,而後在實現業務層。所使用到的方法是對一個UI頁面作測試咱們抽取爲三層,舉例爲BasePage+LoginPage+Unittest。   工具

  後續示例中,PO模型的基本思路:register_page(查找頁面元素類) —> register_handle(操做層,將查找到的元素位置上傳遞數據) —> register_business(業務層:調用操做層,根據操做層的傳遞的結果進行判斷場景,如郵箱錯誤場景等) —> first_case(封裝調用業務層,進行測試用例的場景組裝)

單元測試

 

po模型之如何設計操做層


查找頁面元素類:把定位頁面元素的方法都封裝在相應的一個相應頁面中,此頁面的元素定位方式均可以在這個文件中找到測試

操做層:編寫註冊過程當中須要的方法,好比輸入用戶名、密碼等頁面操做,工具類-保存頁面操做的全部方法。spa

業務層:把操做層組裝起來設計

查找頁面元素類:register_page.py日誌

操做層:register_handle.py

業務層:register_business.py

 

找找頁面元素類


 示例代碼:register_page.py

# -*-  coding:utf-8 -*-
from  util.find_elemnet import FindElement

class RegisterPage():
    def __init__(self,driver):
        self.find_element = FindElement(driver)

    def get_email_element(self):
        return self.find_element.get_element("element_email")

    def get_name_elemnet(self):
        return self.find_element.get_element("element_name")

    def get_pwd_element(self):
        return self.find_element.get_element("element_pwd")

    #錯誤信息校驗
    def get_email_error_info(self):
        return self.find_element.get_element("element_email_error")

    def get_name_error_info(self):
        return self.find_element.get_element("element_name_error")

    def get_pwd_error_info(self):
        return self.find_element.get_element("element_pwd_error")

 

操做層


 示例代碼:register_handle.py

# -*-  coding:utf-8 -*-
from selenium import webdriver

from page.register_page import RegisterPage

class RegisterHandle(object):

    def __init__(self,driver):
        self.register_p = RegisterPage(driver)

    #輸入郵箱
    def send_user_email(self,email):
        self.register_p.get_email_element().send_keys(email)

    #輸入用戶名
    def send_user_name(self,name):
        self.register_p.get_name_elemnet().send_keys(name)

    #輸入密碼
    def send_user_pwd(self,pwd):
        self.register_p.get_pwd_element().send_keys(pwd)

    #獲取錯誤提示信息
    def get_user_text(self,info,user_info):
        text = None
        if info == "element_email_error":
            text = self.register_p.get_email_error_info().get_attribute("value") #value是html標籤中的屬性值
        elif info == "element_name_error":
            text = self.register_p.get_name_error_info().get_attribute("value")
        elif info == "element_pwd_error":
            text = self.register_p.get_pwd_error_info().get_attribute("value")
        else:
            print("參數輸入參數值有誤")
        return text

if "__name__" == "__main__":
    pass

 

業務層


示例代碼:register_business.py

# -*-  coding:utf-8 -*-
from handle.register_handle import RegisterHandle
from selenium import webdriver

class RegisterBusiness():
    def __init__(self,driver):
        self.register_h = RegisterHandle(driver)

    def base_case(self,email,name,pwd):
        self.register_h.send_user_email(email)
        self.register_h.send_user_name(name)
        self.register_h.send_user_pwd(pwd)

    #校驗郵箱輸入錯誤
    def email_error(self,email,name,pwd):
        self.base_case(email,name,pwd)
        if self.register_h.get_user_text("element_email_error","請輸入有效的電子郵件地址") == None:
            print("郵箱校驗不成功")
            return AssertionError
        else:
            return False


if __name__ == "__main__":
    driver = webdriver.Chrome()
    driver.get("http://www.5itest.cn/register")
    testcase1 = RegisterBusiness(driver)
    testcase1.base_case("111","222","111")
相關文章
相關標籤/搜索