Selenium Web自動化Page Object設計模式——driver初始化
如果目前需要通過自動化工具實現如下的這樣一個小功能:
1.開啟一個網頁
2.點選該網頁上的一個元素,進入下一個頁面
3.點選新頁面上的一個元素,進入再下一個頁面
4.pass
如果採用非page object的模式來設計的話,Python程式碼會是這樣:
1.driver.get("https://www.一個網頁.com/")
2.driver.find_element(x).click
3.driver.find_element(y).click
4.pass
但如果另一項測試需要在第二步之後執行其他的步驟,就需要重新寫一段程式碼,這樣程式碼就會顯得重複,並且維護成本也會非常高。
Page Object的主要思想就是將每一個Page封裝成一個Object。因此上面的程式碼可以封裝為以下四個類:
driver.get("https://www.一個網頁.com/")
開啟網頁的操作並非一個頁面,可以將它封裝為一個初始化類
class InitPage:
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.一個網頁.com/")
- driver已經過初始化,之後的方法就不需要再對driver做定義,只需要繼承InitPage類
class FirstPage(InitPage):
def first_click(self):
driver.find_element(x).click
return SecondPage()
- 一個物件內語句執行完成之後,return到下一個類
class SecondPage(InitPage):
def second_click(self):
driver.find_element(y).click
return ThridPage()
- 同樣return到下一個類
class ThirdPage(InitPage):
def third_pass(self):
pass
之後就可以開始編寫測試用例的程式,
FirstPage().first_click().second_click().third_pass()
因為在每個頁面最後都會return至下一個頁面,可通過鏈式呼叫的方式編寫測試用例,可大大提高用例的靈活性。
但此時有一個問題,就是在繼承InitPage物件時,每次呼叫都會執行__init__中的driver.get,導致開啟新的網頁視窗。可以通過在構建__init__方法時輸入一個flag,僅在flag為初始值時執行driver.get等語句,程式碼如下:
class BasePage:
def __init__(self, flag:bool = False)
if not flag:
self.driver = webdriver.Chrome()
self.driver.get("https://www.一個網頁.com/")
else:
pass
並且其他類在繼承BasePage時需要在返回時傳遞flag = True的變數。如:
class FirstPage(InitPage):
flag = True
def first_click(self):
driver.find_element(x).click
return SecondPage(self.flag)
此時__init__方法僅會在第一次被呼叫時執行if條件內的內容。