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())

三个测试模块的目录如图:

测试报告截图:

 

posted @ 2017-11-07 17:23  panda901  阅读(2678)  评论(0编辑  收藏  举报