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

三個測試模塊的目錄如圖:

測試報告截圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM