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(封裝調用業務層,進行測試用例的場景組裝)
單元測試
查找頁面元素類:把定位頁面元素的方法都封裝在相應的一個相應頁面中,此頁面的元素定位方式均可以在這個文件中找到測試
操做層:編寫註冊過程當中須要的方法,好比輸入用戶名、密碼等頁面操做,工具類-保存頁面操做的全部方法。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")