一、PageObject 页面对象设计模式 (一个页面建一个类,即对象,页面对象)
每个页面都建对应的class,类中包含了页面的输入框、标题、元素等元素,测试代码中测试这个页面时,只需要调用这个页面类(页面对象)里的页面元素即可,这样实现了将测试对象(页面对象)和测试脚本(用例脚本)分离,如果元素ID等发生变化时,不需要去修改测试代码,只需要在页面类中修改即可,利于维护所有脚本。
页面对象设计模式可分为三层:
1、基础层:driver,findelement,findelements
2、对象层:里面封装元素属性、点击鼠标、点登录等操作,需继承基础层,;
3、测试层:调用对象层封装的(操作)方法;真正的实例化driver
二、PageObject 页面对象模式将元素属性和业务操作分离出去,具体的业务功能需要这些操作时,调用即可
对象层DBobject.py代码如下:(模块中类baidu需继承基础层类Jichu)
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
class jichu(object):
def __init__(self,driver):
self.driver=driver
def findelement(self,*loc):
return self.driver.find_element(*loc)
def findelements(self,*loc):
try:
return self.driver.find_elements(*loc)
except NoSuchElementException as e:
print 'Error details:%s'%(e.args[0])
class baidu(jichu):
textlogin_loc=(By.LINK_TEXT,u'登录')
buttonlogin_loc=(By.ID,'TANGRAM__PSP_10__submit')
uname_loc=(By.ID,'TANGRAM__PSP_10__userName')
pw_loc=(By.ID,'TANGRAM__PSP_10__submit')
error_loc=(By.ID,'TANGRAM__PSP_10__error')
def clicklogin(self):
self.findelement(*self.textlogin_loc).click()
def typeuname(self):
self.findelement(*self.uname_loc).send_keys('18264111111')
def typepw(self):
self.findelement(*self.pw_loc).send_keys('123456')
def clickbutton(self):
self.findelement(*self.buttonlogin_loc).click()
def geterror(self):
return self.findelement(*self.error_loc).text
百度登录模块baiduLogin.py的业务功能代码:
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from BDobject import *
import unittest
import os
from selenium import webdriver
class login(unittest.TestCase,baidu):
@classmethod
def setUp(cls):
cls.driver = webdriver.Firefox()
cls.driver.maximize_window()
cls.driver.implicitly_wait(30)
cls.driver.get('https://www.baidu.com/')
def test01(self):
'''验证用户名和密码为空时,系统的提示信息是否正确'''
self.clicklogin()
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[0])
def test02(self):
'''验证输入用户名,不输入密码时,系统的提示信息是否正确'''
self.clicklogin()
self.typeuname()
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[1])
def test03(self):
'''验证只输入密码时,系统的提示信息是否正确'''
self.clicklogin()
self.typepw()
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[2])
def test04(self):
'''验证输入账户和密码后点击登录,系统的提示信息是否正确'''
self.clicklogin()
self.typeuname()
self.typepw()
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[1])
@classmethod
def tearDown(cls):
cls.driver.quit()
@staticmethod
def suite():
suite = unittest.TestSuite()
with open(os.path.join(os.path.dirname(__file__), 'case1.txt'), 'r') as f1:
for item in (''.join(f1.readlines())).split('\n'):
suite.addTest(login(item))
return suite
def readlog(self):
list1 = []
with open(os.path.join(os.path.dirname(__file__) + '/log1.txt'), 'r') as f:
for item in (''.join(f.readlines())).split('\n'):
list1.append(item)
return list1
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(login.suite())
log1.txt 内容:
case1.txt内容:
三、页面对象设计模式的应用
以测试百度登录模块、百度页面title、百度页面url为例,测试三个模块,且生成测试报告
-------将打开关闭浏览器分离出去,测试模块使用时倒入并继承 browser.py
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from selenium import webdriver
import unittest
class webUi(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver=webdriver.Firefox()
cls.driver.implicitly_wait(30)
cls.driver.maximize_window()
cls.driver.get('https://www.baidu.com/')
@classmethod
def tearDownClass(cls):
cls.driver.quit()
-------对象层BDobject.py
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
class jichu(object):
def __init__(self,driver):
self.driver=driver
def findelement(self,*loc):
return self.driver.find_element(*loc)
def findelements(self,*loc):
try:
return self.driver.find_elements(*loc)
except NoSuchElementException as e:
print 'Error details:%s'%(e.args[0])
class baidu(jichu):
textlogin_loc=(By.LINK_TEXT,u'登录')
buttonlogin_loc=(By.ID,'TANGRAM__PSP_10__submit')
uname_loc=(By.ID,'TANGRAM__PSP_10__userName')
pw_loc=(By.ID,'TANGRAM__PSP_10__submit')
error_loc=(By.ID,'TANGRAM__PSP_10__error')
def clicklogin(self):
self.findelement(*self.textlogin_loc).click()
def typeuname(self,name):
self.findelement(*self.uname_loc).send_keys(name)
def typepw(self,pw):
self.findelement(*self.pw_loc).send_keys(pw)
def clickbutton(self):
self.findelement(*self.buttonlogin_loc).click()
def geterror(self):
return self.findelement(*self.error_loc).text
-------百度登录模块测试用例logintest.py
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from selenium import webdriver
from browser import *
from BDobject import *
import unittest
import os
class login(webUi,baidu):
def test01(self):
'''验证用户名和密码为空时,系统的提示信息是否正确'''
self.clicklogin()
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[0])
def test02(self):
'''验证输入用户名,不输入密码时,系统的提示信息是否正确'''
#self.clicklogin()
self.typeuname('18091871111')
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[1])
def test03(self):
'''验证只输入密码时,系统的提示信息是否正确'''
#self.clicklogin()
self.typepw('123456')
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[2])
def test04(self):
'''验证输入账户和密码后点击登录,系统的提示信息是否正确'''
#self.clicklogin()
self.typeuname('18091871111')
self.typepw('123456')
self.clickbutton()
text = self.geterror()
self.assertEqual(text.encode('utf-8'), self.readlog()[1])
def readlog(self):
'''读取文件里的内容'''
list1 = []
with open(os.path.join(os.path.dirname(__file__) + '/log1.txt'), 'r') as f:
for item in (''.join(f.readlines())).split('\n'):
list1.append(item)
return list1
-----测试百度首页title测试用例 titletest.py
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from selenium import webdriver
import unittest
from browser import *
from BDobject import *
class title1(webUi):
def test01(self):
'''验证百度首页的title'''
title = self.driver.title
self.assertEqual(title.encode('utf-8'), u'百度一下,你就知道')
-----测试百度首页url测试用例urletest.py
#!/usr/bin/env.python
#-*-coding:utf-8-*-
from selenium import webdriver
import unittest
from browser import *
from BDobject import *
class title1(webUi):
def test01(self):
'''验证百度首页的URL'''
url=self.driver.current_url
self.assertEqual(url.encode('utf-8'),u'https://www.baidu.com/')
-----使用discover加载所有测试模块,并生成测试报告alltest.py
#!/usr/bin/env.python
#-*-coding:utf-8-*-
import os
import HTMLTestRunner
import unittest
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def suite():
suite=unittest.defaultTestLoader.discover(
start_dir=os.path.dirname(__file__),
pattern='*test.py',
top_level_dir=None
)
return suite
if __name__=='__main__':
fp=open(os.path.join(os.path.dirname(__file__),'testmodel','testReport1.html'),'wb')
runner=HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='all model testReport',
description='三个模块的测试报告'
)
runner.run(suite())
三个测试模块的目录如图:
测试报告截图:
每天进步一点点