(一) Page Object设计模型的特点
Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,pageobject就是将测试的对象,以及单个的测试步骤封装成每一个page的对象中,已page页为单位进行管理,主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案例的可读性。
(二) Page Object设计模型的优点
1.减少代码的冗余,提高了代码的可读性和维护性。
2.提高了测试用例的可读性,可维护性,尤其针对ui自动化页面元素频繁变动,是ui自动化测试的经典设计模型之一。
(三)PageObject设计模式案例实战
1.封装BasePage
BasePage.py
# coding=gbk
from timeimport sleep
class Page():
'''页面基础类'''
#初始化
def __init__(self, dirver):
self.base_url ='https://www.51zxw.net/'
self.driver = dirver
self.timeout =30
#打开不同的子页面
def _open(self, url):
url_ =self.base_url + url
print("Test page is: %s" %url_)
self.driver.maximize_window()
self.driver.get(url_)
sleep(2)
assert self.driver.current_url == url_, 'Did ont land on %s' % url_
def open(self):
self._open(self.url)
#元素定位方法封装
def find_element(self,*loc):
return self.driver.find_element(*loc)
# # 元素定位跳转
# def switch_frame(self,loc):
# return self.driver.switch_to_frame(loc)
2.封装Loginpage
LoginPage.py
# coding=gbk
from BasePageimport *
from selenium.webdriver.common.byimport By
class LoginPage(Page):
'''首页登录页面'''
url='/List.aspx?cid=451'
#定位器
click_loc =(By.LINK_TEXT,'登录/注册')
# switch_loc =(By.ID, 'loginFrom')
username_loc=(By.XPATH, '//*[@id="loginStr"]')
password_loc=(By.XPATH, '//*[@id="pwd"]')
submit_loc=(By.XPATH,'//*[@id="loginFrom"]/div/div[5]/button')
# 点击登录/注册按钮
def click_submit(self):
self.find_element(*self.click_loc).click()
# # 跳转到登录页面
# def click_switch(self):
# self.switch_frame(*self.switch_loc).click()
#用户名输入框元素
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_submit(self):
self.find_element(*self.submit_loc).click()
#登录功能模块封装
def test_user_login(driver,username,password):
'''测试用户名密码是否可以登录'''
login_page=LoginPage(driver)
login_page.open()
login_page.click_submit()
# login_page.click_switch()
login_page.type_username(username)
login_page.type_password(password)
login_page.type_submit()
3.封装登录测试模块
loin_test.py
from LoginPageimport *
from seleniumimport webdriver
driver=webdriver.Firefox()
username =''
password =''
test_user_login(driver, username, password)
sleep(3)
driver.quit()
(四)测试小结
1.虽然该实现方法看上去复杂多了,但其中的设计好处是不同层关心不同的问题。页面对象只关心元素的定位,测试用例只关心测试数据。LoginPage类中主要对登录页面上元素进行封装,使其成为具体的操作方法。如对用户名、密码框都封装成方法,然后定义test_user_login(username, password)方法将单个元素操作组成一个完整的动作,包含输入用户名、密码并点击登录按钮等。
2.使用时将driver、username、password作为函数的入参,这样的方法具有很强的可重用性。
3.最后使用test_user_login方法进行用户操作行为,现在只关心用哪个浏览器、登录的用户名和密码是什么,至少输入框、按钮是如何定位的,则不关心。即实现了不同层关心不同问题。如果再有定位元素变化,只需LoginPage这个类维护即可,显然方便了很多。
网友评论