前面有一篇對於常見元素的識別和操作的python自動化腳本,這一篇就接着聊下python的類繼承,已經它的第三款unittest框架,和報告收集包HTMLtestRunner的應用。
還是直接上代碼吧。
unittest和HTMLtestrunner的應用:
# coding = utf-8 import time import unittest import HTMLTestRunner import os import sys from selenium import webdriver
# 繼承unittest類 class testClass(unittest.TestCase):
# unittest提供的初始化方法,setup,可以在這里進行一些初始化的准備工作 def setUp(self): print "setup" self.driver=webdriver.Firefox() self.driver.get("http://www.baidu.com") time.sleep(3)
# 下面是測試方法 def testsearch2(self): input=self.driver.find_element_by_id('kw') search=self.driver.find_element_by_id('su') input.send_keys("byebye") search.click()
def testsearch(self): input=self.driver.find_element_by_id('kw') search=self.driver.find_element_by_id('su') input.send_keys("hello") search.click() print "assertion" self.assertTrue(search.is_displayed(),"baidu yixia should display")
# 運行結束后的處理動作 def tearDown(self): print 'test down...' #driver.quit() self.driver.close() if __name__ == '__main__': #unittest.main(), 這里要說明一下, 如果測試方法是以test開頭的,那么unittest可以識別出來,這里就可以直接調用它的main方法來執行所有測試方法了,運行順序就是按測試方法的名字排序 #unittest.TestCase.assertTrue()
#這塊是獲取項目路徑,后面在生成report時會放到改目錄下 current_path=os.getcwd() print 'current path: ',current_path project_path=os.path.dirname(current_path) print "project path:",project_path
#這塊是通過unittest的testsuite方式來組織測試 testsuite=unittest.TestSuite() #testsuite.addTest(testClass("testsearch2")) testsuite.addTest(testClass("testsearch")) temp=str(time.time()) filedir=project_path+"//report//"+temp os.makedirs(filedir) filename="//pyresult.html" filepath=filedir+filename fp=file(filepath,'wb')
# 調用HTMLtestrunner來執行腳本並生成測試報告,html格式的 runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='report',description='demo') runner.run(testsuite)
注: 上面帶#號的都是注釋, 由於直接編輯的原因,所以他沒有顯示成綠色,大家如果要復制出來,記得注意調整一下。
Python類的繼承:
#coding=utf-8 from pyse import Pyse from time import sleep class Page(object): #login_url = 'http://www.126.com' def __init__(self, selenium_driver, base_url, parent=None): self.base_url = base_url self.driver = selenium_driver self.timeout = 30 self.parent = parent def _iopen(self,url): #url = self.base_url + url self.base_url=url self.driver.open(url) assert self.on_page(),'Did not land on %s' % url def iopen(self): self._iopen(self.url) def on_page(self): print 'get_url is: ',self.driver.get_url() print 'base_url is: ',self.base_url return self.driver.get_url() == self.base_url class login(Page): def systemout(self): print 'pass' def testlogin(): driver=Pyse('ff') print 'get in' url='http://www.baidu.com/' lg=login(driver,'') lg._iopen(url) if __name__=='__main__': testlogin()
這塊是python類的繼承,page繼承根object類,然后login繼承了page類,然后login就可以使用page類的方法了。
這里要說明的是,page類有2個方法,一個是_iopen(), 另一個是iopen(), 他們的區別就是,在用login的對象調用時:
調用iopen,不需要url參數,但是需要login類有url的成員,因為在其父類page里的self.url其實就是調用login自己的url成員。
而調用_iopen時,可以直接傳遞一個url參數。
