selenium-webdriver(python) (十六) --unittest 框架

蟲師發表於2013-09-04

 

學習unittest 很好的一個切入點就是從selenium IDE 錄製匯出指令碼。相信不少新手學習selenium 也是從IED 開始的。

IDE學習參考:

菜鳥學自動化測試(一)----selenium IDE

 

藉助IED 錄製指令碼

 

將指令碼匯出,儲存為baidu.py ,通過python IDLE編輯器開啟。如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest, time, re

class Baidu(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
    
    def test_baidu(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").send_keys("selenium webdriver")
        driver.find_element_by_id("su").click()
        driver.close()

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

加入unittest框架後,看上去比我們之前見的指令碼複雜了很多,除了中間操作瀏覽器的幾行,其它都看不懂,不要急,我們來分析一下~

 

 

框架分析           

 

 

import  unittest  

相想使用unittest框架,首先要引入unittest 包,這個不多解釋。

 

class Baidu(unittest.TestCase):

Baidu類繼承unittest.TestCase 類,從TestCase類繼承是告訴unittest模組的方式,這是一個測試案例

 

def setUp(self):
  self.driver = webdriver.Firefox()
  self.base_url = "http://www.baidu.com/"

setUp 用於設定初始化的部分,在測試用例執行前,這個方法中的函式將先被呼叫。這裡將瀏覽器的呼叫和URL的訪問放到初始化部分。

 

self.verificationErrors = []

指令碼執行時,錯誤的資訊將被列印到這個列表中。

 

self.accept_next_alert = True

是否繼續接受下一下警告(字面意思,沒找到解釋!)

 

 def test_baidu(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").send_keys("selenium webdriver")
        driver.find_element_by_id("su").click()

 test_baidu中放置的就是我們的測試指令碼了,這部分我們並不陌生;因為我們執行的指令碼就在這裡。

 

 

def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

 is_element_present函式用來查詢頁面元素是否存在,在這裡用處不大,通常刪除。

因為判斷頁面元素是否存在一般都加在testcase中。

 

 

def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

對彈窗異常的處理

 

def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

關閉警告和對得到文字框的處理,如果不熟悉python的異常處理和if 語句的話,請去補基礎知識,這裡不多解釋。

 

def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

  tearDown 方法在每個測試方法執行後呼叫,這個地方做所有清理工作,如退出瀏覽器等。 

  self.assertEqual([], self.verificationErrors) 是個難點,對前面verificationErrors方法獲得的列表進行比較;如查verificationErrors的列表不為空

輸出列表中的報錯資訊。

  而且,這個東西,也可以將來被你自己更好的呼叫和使用,根據自己的需要寫入你希望的資訊。(rabbit 告訴我的

 

if __name__ == "__main__":
  unittest.main()

unitest.main()函式用來測試 類中以test開頭的測試用例

 

 

 

執行結果      

 

  這樣一一分析下來,我們對unittest 框架有了初步的瞭解。執行指令碼,因為引入了unittest 框架,所以控制檯輸出了指令碼執行情況的資訊。

 

>>> ========================= RESTART ================================
>>> 
.
----------------------------------------------------------------------
Ran 1 test in 10.656s

OK
>>> 

 

很帥吧!? 後面將以unittest 為基礎,向新的征程進發~

 

 

 

 

 

 

相關文章