一、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())
三個測試模塊的目錄如圖:
測試報告截圖: