PageObject 页面对象设计模式
一、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())
三个测试模块的目录如图:
测试报告截图:
每天进步一点点