十、PageObject
一、PageObject頁面物件
頁面物件:會把某個網頁頁面封裝成物件
物件
-
--屬性:元素定位器、URL、標題
-
--方法:元素定位、點選、拖拽(在頁面做了某個動作,執行了某步操作)
pageobject原則:
是不是所有的動作都需要封裝成頁面物件的方法:
-
--可以封裝
-
--不必要這麼做
-
--遵循的原則,你用到了什麼行為,就封裝什麼行為
封裝的頁面的返回值
-
--self 或者是其他的頁面
-
--如果需要獲取某個元素或者屬性,就直接返回元素本身或該屬性的值
-
--如果一個操作可能會有多個結果,比如進行頁面調轉或者本頁面,那就根據結果封裝成多個方法
PageObject好處:
-
--可讀性。PO模式函式名本身具有註釋的功能
-
--可維護性。修改一個地位可全域性修改,不需要一個個修改
-
--擴充套件性。當有新功能需要實現,更加方便
-
--頁面邏輯和測試邏輯分離。
-
--可複用性。重複使用
測試用例編寫:
-
--1.初始化頁面
-
--2.呼叫頁面邏輯操作,目的是獲取實際結果
-
--3.結果對比
二、資料分組
分組的依據:測試步驟不一致
儲存用例,不要通過excel1去管理:
-
--用py檔案
-
--用ymal檔案,也支援字典格式
py檔案進行測試用例的管理:data目錄下login_data.py
"""登入測試用例資料""" #登入失敗資料data_error = [ {"username":"","password":"","expected_results":"請輸入手機號"}, {"username":"123","password":"","expected_results":"請輸入正確的手機號"} ] #登入成功用例 data_success = [ {"username": "18621346545", "password": "12345678", "expected_results": "我的帳戶[小樣兒]"} ]
test_login()測試用例
"""登入功能的測試用例"""import pytest from middware.pages.login import LoginPage from data.login_data import data_error,data_success from middware.handler import HandlerMiddle #獲取excel中login資料 # data = HandlerMiddle.excel.read_data("login") @pytest.mark.login class TestLogin: """登入功能的測試類""" @pytest.mark.error @pytest.mark.parametrize("test_info",data_error) def test_login_error(self,test_info,driver): """登陸失敗用例""" #初始化 操作的頁面 物件 login_page = LoginPage(driver) #測試步驟:輸入使用者名稱、密碼、登入(呼叫po中的方法) actual_result =login_page.login_fail(username=test_info["username"], password=test_info["password"]).get_error_info() # 斷言 expected_result = test_info["expected_results"] try: assert actual_result in expected_result except AssertionError as e: HandlerMiddle.logger.error("測試用例username為{},不通過!".format(test_info["username"])) raise e @pytest.mark.success @pytest.mark.parametrize("test_info",data_success) def test_login_success(self,test_info,driver): """登入成功測試用例""" #初始化頁面物件 login_page = LoginPage(driver) #執行測試,獲取實際結果, actual_result = login_page.login_success(username=test_info["username"], password=test_info["password"]).get_account_name() #斷言 try: assert actual_result in test_info["expected_results"] except AssertionError as e: HandlerMiddle.logger.error("測試用例username為{},不通過!".format(test_info["username"])) raise e
三、locator分層
1)優化URL
將域名host放在yaml配置檔案中管理,將URL作為類屬性。
URL =HandlerMiddle.yaml_data["host"] + "/Index/login.html"
2)將訪問頁面單獨進行封裝
"""登入頁面""" from middware.pages.index import IndexPage from middware.handler import HandlerMiddle class LoginPage: """登入""" URL =HandlerMiddle.yaml_data["host"] + "/Index/login.html" #初始化driver def __init__(self,driver): self.driver = driver def get(self): """訪問頁面""" self.driver.get(self.URL) return self def login_fail(self,username,password): # 輸入使用者名稱和密碼,點選登入進行提交 self.enter_username(username) self.enter_password(password) self.driver.find_element_by_class_name("btn-special").click() return self def login_success(self,username,password): # 輸入使用者名稱和密碼,點選登入進行提交 self.enter_username(username) self.enter_password(password) self.driver.find_element_by_class_name("btn-special").click() return IndexPage(self.driver) def enter_username(self,username): # 輸入使用者名稱 self.driver.find_element_by_name("phone").send_keys(username) return self def enter_password(self,password): # 輸入密碼 self.driver.find_element_by_name("password").send_keys(password) return self def get_error_info(self): # 獲取登入失敗的錯誤資訊 return self.driver.find_element_by_class_name("form-error-info").text
actual_result =login_page.get().login_fail(username=test_info["username"],password=test_info["password"]).get_error_info()
3)優化元素定位
將元素定位locators,提取出來
-
locators是跟頁面LoginPage繫結在一起的,是該頁面的屬性,所以可以提取出來作為類屬性;
-
find_element()方法,原始碼中的2個引數為:by,value,即定位的方式,和值。呼叫locator的元組()表示方式)),用*args進行元組解包;呼叫locator的字典{}表示方式,用**args進行字典解包
eg元組表示:
login_btn_locator = ("name","btn-special")
呼叫:
def login_fail(self,username,password): self.enter_username(username) self.enter_password(password) self.driver.find_element(*self.login_btn_locator).click() return self
eg字典表示:
login_btn_locator = {"by":"name","value":"btn-special"}
呼叫:
def login_fail(self,username,password): self.enter_username(username) self.enter_password(password) self.driver.find_element(**self.login_btn_locator).click() return self