37-2 web自動化實戰四 basepage的實現和封裝
前情提要:
通用方法和特定方法
比如:查詢某個元素的方法 def find(locator),只要傳入locator,就可以呼叫該函式,可以通用的---一般放在common中,例如:selenium_handler.py
對於登入操作,需要先定位元素,每個專案中定位元素的方式可能是不一樣的,所以對於登入操作,應該是專案的特定方法.
80\46min
1.basepage的實現
1).專案架構:
------selenium_handler.py放在common中,在selenium_handler實現封裝
-------middleware中新建pages 包(表示:頁面操作) ----比如:登入操作,就屬於頁面的行為;登入頁面有:免費註冊、忘記密碼、聯絡我們等操作行為
在pages中可以有login.py操作
2).實現login.py登入操作的封裝
將前面的測試用例test_login中登入部分的程式碼直接拿過來進行封裝;
-----使用者名稱、密碼進行引數化。
-----driver物件在很多頁面都需要用到,所以定義為類屬性,方便呼叫
class LoginPage: """登入""" #初始化driver def __init__(self,driver): self.driver = driver def login(self,username,password): #訪問登入頁面 url = "http://120.78.128.25:8765/Index/login.html" self.driver.get(url) # 元素定位+元素操作,輸入使用者名稱和密碼,點選登入進行提交 self.driver.find_element_by_name("phone").send_keys(username) self.driver.find_element_by_name("password").send_keys(password) self.driver.find_element_by_class_name("btn-special").click()
架構:
login.py封裝完成,在測試用例中test_login.py中如何去呼叫呢------在test_login.py中直接呼叫即可。
import pytest from middware.handler import HandlerMiddle from middware.pages.login import LoginPage #獲取excel中login資料 data = HandlerMiddle.excel.read_data("login") class TestLogin(): """登入功能的測試類""" @pytest.mark.smoke @pytest.mark.error @pytest.mark.parametrize("test_info",data) def test_login_error(self,test_info,driver): """登入失敗測試步驟 1.開啟瀏覽器 2.訪問登入頁面 3.元素定位+元素操作,輸入使用者名稱和密碼,點選登入 4.通過獲取頁面內容得到實際結果,進行斷言 :return: """ #訪問登入頁面 LoginPage(driver).login(username=eval(test_info["data"])["username"], password=eval(test_info["data"])["password"]) #通過獲取頁面內容得到實際結果,進行斷言 #實際結果是在頁面上的提示,再次進行定位 actual_result = driver.find_element_by_class_name("form-error-info").text expected_result = test_info["expected_result"] #斷言 assert actual_result in expected_result
執行run.py, test_login.py中的方法test_login_error()中的driver去conftest檔案中找fixture中的函式名(driver),訪問登入頁面呼叫LoginPage(driver),到此邏輯基本理順了。
總結:
登入操作封裝成類,初始化LoginPage()物件---->測試程式碼和頁面操作分開。
-----這麼做的好處:前端工程師修改頁面,就不需要修改test_login.py測試用例。
測試邏輯改了,那麼LoginPage是不需要修改的。
WEB
頁面物件思想---PageObject
下篇部落格詳解