1. 程式人生 > >selenium——Page Object設計模式

selenium——Page Object設計模式

Page Object設計模式的優點如下:

①    減少程式碼的重複。

②    提高測試用例的可讀性。

③    提高測試用例的可維護性,特別是針對UI頻繁變化的專案。

當為Web頁面編寫測試時,需要操作該Web頁面上的元素。然而,如果在測試程式碼中直接操作HTML元素,那麼你的程式碼是極其脆弱的,因為UI經常變動。我們可以將一個page物件封裝成一個HTML頁面,然後通過提供的應用程式特定的API來操作頁面元素, 而不是在HTML中四處搜尋。

Page物件的一個基本經驗法則是:凡是人能做的事,Page物件通過軟體客戶端都能夠做到。因此,它也應當提供一個易於程式設計的介面並隱藏視窗中底層的部件。所以訪問一個文字框應該通過一個訪問方法(accessor method)來實現字串的獲取與返回,複選框應當使用布林值,按鈕應當被表示為行為導向的方法名。Page物件應當將在GUI控制元件上所有查詢和操作資料的行為封裝為方法。一個好的經驗法則是,即使改變具體的控制元件,page物件的介面也不應當發生變化。

儘管該術語是“頁面”物件,但並不意味著需要對每個頁面建立一個這樣的物件. 例如,頁面有重要意義的元素可以獨立為一個page物件。經驗法則的目的是通過給頁面建模,使其對應用程式的使用者變得有意義。

 

例項程式碼如下:

# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


class Page(object):

# 例項化Page類時,最先執行的就是__init__方法,
# 該方法的入參,其實就是Page類的入參。
# self指例項本身,相較於類Page而言。
login_url = 'https://www.126.com'

def __init__(self, selenium_driver, base_url=login_url):
self.base_url = base_url
self.driver = selenium_driver
self.timeout = 30

def on_page(self):
return self.driver.current_url == (self.base_url + self.url)

# 以單下劃線_開頭的方法,
# 在使用import *時,該方法不會被匯入,保證該方法為類私有的。
def _open(self, url):
url = self.base_url + url
self.driver.get(url)
assert self.on_page(), 'Did not land on %s' %url

# 定義open方法,呼叫_open()進行開啟連結
def open(self):
self._open(self.url)

# loc入參為元組的元素,需要加*。
# Python存在這種特性,就是將入參放在元組裡。
def find_element(self, *loc):
return self.driver.find_element(*loc)

class LoginPage(Page):

# 126郵箱登入頁面模型
url = '/'
# 定位器
# 使用複合類名,直接使用會報錯
username_loc = (By.CLASS_NAME, "dlemail")
password_loc = (By.CLASS_NAME, "dlpwd")
submit_loc = (By.ID, "dologin")

# Action
def switch_frame(self, loc):
return self.driver.switch_to_frame(loc)

def type_username(self, username):
self.find_element(*self.username_loc).clear()
self.find_element(*self.username_loc).send_keys(username)

def type_password(self, password):
self.find_element(*self.password_loc).send_keys(password)

def submit(self):
self.find_element(*self.submit_loc).click()

def test_user_login(driver, loc, username, password):

#測試獲取的使用者名稱/密碼是否可以登入
login_page = LoginPage(driver)
login_page.open()
sleep(5)
login_page.switch_frame(loc)
login_page.type_username(username)
login_page.type_password(password)
login_page.submit()

def mainTest():

try:
driver = webdriver.Chrome()
username = 'lili1505115417'
password = 'lili123456'
loc = 0
test_user_login(driver, loc, username, password)
sleep(5)
text = driver.find_element_by_id("spnUid").text
assert (text == '
[email protected]
'), "使用者名稱稱不匹配.登入失敗!"
finally:
#關閉瀏覽器視窗
driver.quit()
print('結束')

if __name__ == '__main__':
mainTest()