1. 程式人生 > 實用技巧 >十、PageObject

十、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