Page Object Model:
PO设计模式是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,也就是在实际测试中只关注业务流程就OK了
传统的设计中,在新增测试用例之后,代码会有以下几个问题:
1.易读性差:一连串的find element会使代码显得杂乱无章
2.可扩展性不好:用例孤立,无法扩展
3.可复用性差:无公共方法,很难复用
4.可维护性差:一旦元素变化,需要维护修改大量测试用例
因此考虑到优化:
PO模式是一种自动化测试设计模式,讲页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性。
首先抽象封装一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且在Page中将这些操作封装为一个一个的方法。TestCase继承unittest里面的TestCase类,并且依赖page类,进行组织测试步骤的工作。
这样做的好处,就是有元素变化,只需要维护每一个Page就行了,测试步骤变化,只需要维护TestCase即可
下面举一个简单的例子来看一下PO模式:
业务要求就是,用Chrome浏览器,在http://114.215.176.95:60503/goodmanage/index.jsp中实现输入用户名、密码,然后点击登录按钮,再关闭浏览器
PO各个核心要素的介绍:
基类BasePage类:
from selenium import webdriver
from time import sleep
#定义页面基础类,所有的页面都需要继承这个基础类
class Base_Login:
#初始化基础类
def __init__(self,driver,url):
self.driver=driver
self.url=url
#相同行为定位元素(八大元素定位方法),点击,输入
def locator(self, loc):
el = self.driver.find_element(*loc)
return el
def send_Key(self,loc,value):
self.locator(loc).send_keys(value)
def click(self,loc):
self.locator(loc).click
def getUrl(self):
self.driver.get(self.url)
self.driver.maximize_window()
Page类:
from Base.base_login import *
from selenium.webdriver.common.by import By
from time import sleep
class LoginPage(Base_Login):
# 定义用户名、密码、提交id的元素
username=(By.ID,'userName')
password=(By.ID,'password')
submit=(By.ID,'btnLogin')
# 输入用户名
def input_username(self,username):
self.send_Key(self.username,username)
# 输入密码
def input_password(self,password):
self.send_Key(self.password,password)
# 点击登录
def click_login(self):
self.click(self.submit)
#整合登录流程
def login_all(self,username,password):
self.getUrl()
sleep(1)
self.input_username(username)
sleep(1)
self.input_password(password)
sleep(1)
self.click_login()
TestCase类:
#coding=utf-8
import unittest
from PageObject.login import *
from selenium import webdriver
class TestCase_pm(unittest.TestCase):
def test_01_login(self):
'''登录测试用例'''
#加载浏览器
url = 'http://114.215.176.95:60503/goodmanage/index.jsp'
self.driver=webdriver.Chrome()
login=LoginPage(self.driver,url)
login.login_all('zhangsan','123456')
if __name__ == '__main__':
unittest.main()