PO:page objece什湘,分層機制,讓不同層去做不同類型的事情赎离,讓代碼結構清晰逛犹,增加復用性。
主要有以下幾種分層方式:
1)兩層: 對象邏輯層+業(yè)務數(shù)據(jù)層
2)三層:對象庫層+邏輯層+業(yè)務數(shù)據(jù)層
3)四層:對象庫層+邏輯層+業(yè)務層+數(shù)據(jù)層
優(yōu)勢:
1)效率高 :同理梁剔,PO模式的邏輯層方法有具體定義虽画,情況和元素發(fā)生變化一樣 修改邏輯層,業(yè)務層不變荣病。這樣看來結構簡單清晰码撰,舒服更符合人類習慣, 普通方式就是繼續(xù)堆case众雷。
2) 復用多收益大: 同樣這里如果邏輯復用越多灸拍,PO模式收益越大,因為對于PO模式來說都只需要修改一個地方多處受益砾省。
普通模式:
def test_user_login():
driver = webdriver.Edge()
base_url = 'https://mail.qq.com/'
username = '3494xxxxx' # qq號碼
password = 'kemixxxx' # qq密碼
driver.get(base_url)
driver.switch_to.frame('login_frame') #切換到登錄窗口的iframe
driver.find_element(By.ID, "u").send_keys(username) #輸入賬號
driver.find_element(By.ID, "p").send_keys(password) #輸入密碼
driver.find_element(By.ID, "login_button").click() #點擊登錄
PO模式(三層):
對象庫層
#創(chuàng)建基礎類
class BasePage(object):
#初始化
def __init__(self, driver):
self.base_url = 'https://mail.qq.com/'
self.driver = driver
self.timeout = 30
#打開頁面
def _open(self):
url = self.base_url
self.driver.get(url)
self.driver.switch_to.frame('login_frame') #切換到登錄窗口的iframe
def open(self):
self._open()
#定位方法封裝
def find_element(self,*loc):
return self.driver.find_element(*loc)
#創(chuàng)建LoginPage類
class LoginPage(BasePage):
username_loc = (By.ID, "u")
password_loc = (By.ID, "p")
login_loc = (By.ID, "login_button")
#輸入用戶名
def type_username(self,username):
self.find_element(*self.username_loc).send_keys(username)
#輸入密碼
def type_password(self,password):
self.find_element(*self.password_loc).send_keys(password)
#點擊登錄
def type_login(self):
self.find_element(*self.login_loc).click()
邏輯層
#創(chuàng)建test_user_login()函數(shù)
def user_login(driver, username, password):
"""測試用戶名/密碼是否可以登錄"""
login_page = LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.type_login()
業(yè)務層
def test_user_login():
driver = webdriver.Edge()
username = '3494xxxxx' #qq號碼
password = 'kemixxxx' #qq密碼
test_user_login(driver, username, password)