PO:page object,分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复用性。
主要有以下几种分层方式:
1)两层: 对象逻辑层+业务数据层
2)三层:对象库层+逻辑层+业务数据层
3)四层:对象库层+逻辑层+业务层+数据层
优势:
1)效率高 :同理,PO模式的逻辑层方法有具体定义,情况和元素发生变化一样 修改逻辑层,业务层不变。这样看来结构简单清晰,舒服更符合人类习惯, 普通方式就是继续堆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模式(三层):
对象库层
#创建基础类
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)
#创建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()
逻辑层
#创建test_user_login()函数
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()
业务层
def test_user_login():
driver = webdriver.Edge()
username = '3494xxxxx' #qq号码
password = 'kemixxxx' #qq密码
test_user_login(driver, username, password)