[Py_20]自动化测试设计模式之Page Object案例实践
2018-07-21 本文已影响43人
Fighting_001
一、Page Object简介
Page Object:是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块的封装减少冗余代码,利于后期维护项目。
如:元素定位or功能模块发生变化,只需要调整页面元素or功能模块封装的代码,提高测试用例的可维护性。
二、PageObject之案例实践
案例:实现在所搭建的测试站点首页(http://localhost/)进行登录验证
1.创建PageObject
目录,在其下新建3个python模块文件:BasePage.py
, LoginPage.py
, LoginTest.py
2.在BasePage.py
模块中创建页面的基础类Page类,包含:对Page类初始化方法、打开不同子页面的方法、封装元素定位的方法
3.在LoginPage.py
模块中创建首页登录页面的类,包含:设置定位器、用户名输入框元素的操作方法、密码输入框元素的操作方法、登录提交按钮的操作方法。并将登录功能模块的方法进行封装,实现测试传入的用户名和密码进行登录是否正常的效果
4.在LoginTest.py
模块中传入登录的用户名和密码的值,然后调用LoginPage.py
模块中封装的登录方法test_user_login()
,以实现登录功能,验证通过用户名和密码是否可正常登录
自动化测试站点搭建,可参看此文 Selenium的4种自动化测试模型&测试站点搭建
BasePage.py
from time import sleep
'''创建页面基础类'''
class Page():
# 初始化
def __init__(self,driver):
self.base_url = "http://localhost"
self.driver = driver
self.timeout = 10
# 定义打开不同的子页面方法
# 下划线开头的_open()方法代表私有方法,不可直接调用,防止被随意修改
def _open(self,u_para):
url = self.base_url+u_para
print("Test page is: %s" %url)
self.driver.maximize_window()
self.driver.get(url)
sleep(2)
assert self.driver.current_url==url,"Did not land on %s" %url
# 定义公开的open()方法,实现调用_pen(urlPara)方法
def open(self):
self._open(self.u_para)
# 封装元素定位的方法
def find_element(self,*loc): # 定位的方式、定位的属性可变化
return self.driver.find_element(*loc)
LoginPage.py
from BasePage import *
from selenium.webdriver.common.by import By
'''创建首页登录页面的类'''
class LoginPage(Page):
u_para = '/' # 当调用open()方法时相当于构造的url="http://localhost/"
# 设置定位器
username_loc = (By.NAME,"username")
password_loc = (By.NAME,"password")
submit_loc = (By.NAME,"Submit")
# 定义username输入框元素的定位、输入方法
def type_username(self,username):
self.find_element(*self.username_loc).clear() # 调用find_element()方法,username定位器变量作为参数传入
self.find_element(*self.username_loc).send_keys(username) # 输入username参数值
# 定义password输入框元素的定位、输入方法
def type_password(self,password):
self.find_element(*self.password_loc).clear()
self.find_element(*self.password_loc).send_keys(password)
# 定义Submit按钮元素的点击方法
def type_submit(self):
self.find_element(*self.submit_loc).click()
# 封装登录功能模块的方法
'''测试用户名和密码是否可以正常登录'''
def test_user_login(driver,username,password):
login_page = LoginPage(driver) # login_page作为LoginPage类的对象;LoginPage类继承Page基类,需要传入driver参数进行初始化
login_page.open() # 直接调用[LoginPage继承BasePage模块中的open()方法],实现打开构造的url
login_page.type_username(username)
login_page.type_password(password)
login_page.type_submit()
LoginTest.py
from LoginPage import *
from selenium import webdriver
driver = webdriver.Chrome()
username = "Test001"
password = "123456"
test_user_login(driver,username,password)
sleep(3)
driver.quit()
执行结果:
PyCharm运行输出的结果 登录成功的提示 登录成功