qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

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


          學(xué)習(xí)unittest 很好的一個(gè)切入點(diǎn)就是從selenium IDE 錄制導(dǎo)出腳本。相信不少新手學(xué)習(xí)selenium 也是從IED 開(kāi)始的。

          IDE學(xué)習(xí)參考:

          菜鳥(niǎo)學(xué)自動(dòng)化測(cè)試(一)----selenium IDE

           

          借助IED 錄制腳本

           

          將腳本導(dǎo)出,保存為baidu.py ,通過(guò)python IDLE編輯器打開(kāi)。如下:

          復(fù)制代碼
          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()
          復(fù)制代碼

          加入unittest框架后,看上去比我們之前見(jiàn)的腳本復(fù)雜了很多,除了中間操作瀏覽器的幾行,其它都看不懂,不要急,我們來(lái)分析一下~!

           

           

          框架分析           

           

           

          import  unittest  

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

           

          class Baidu(unittest.TestCase):

          Baidu類繼承unittest.TestCase 類,從TestCase類繼承是告訴unittest模塊的方式,這是一個(gè)測(cè)試案例。

           

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

          setUp 用于設(shè)置初始化的部分,在測(cè)試用例執(zhí)行前,這個(gè)方法中的函數(shù)將先被調(diào)用。這里將瀏覽器的調(diào)用和URL的訪問(wèn)放到初始化部分。

           

          self.verificationErrors = []

          腳本運(yùn)行時(shí),錯(cuò)誤的信息將被打印到這個(gè)列表中。

           

          self.accept_next_alert = True

          是否繼續(xù)接受下一下警告(字面意思,沒(méi)找到解釋?。?/span>

           

           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中放置的就是我們的測(cè)試腳本了,這部分我們并不陌生;因?yàn)槲覀儓?zhí)行的腳本就在這里。

           

           

          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函數(shù)用來(lái)查找頁(yè)面元素是否存在,在這里用處不大,通常刪除。

          因?yàn)榕袛囗?yè)面元素是否存在一般都加在testcase中。

           

           

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

          對(duì)彈窗異常的處理

           

          復(fù)制代碼
          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
          復(fù)制代碼

          關(guān)閉警告和對(duì)得到文本框的處理,如果不熟悉python的異常處理和if 語(yǔ)句的話,請(qǐng)去補(bǔ)基礎(chǔ)知識(shí),這里不多解釋。

           

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

            tearDown 方法在每個(gè)測(cè)試方法執(zhí)行后調(diào)用,這個(gè)地方做所有清理工作,如退出瀏覽器等。 

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

          輸出列表中的報(bào)錯(cuò)信息。

            而且,這個(gè)東西,也可以將來(lái)被你自己更好的調(diào)用和使用,根據(jù)自己的需要寫(xiě)入你希望的信息。(rabbit 告訴我的

           

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

          unitest.main()函數(shù)用來(lái)測(cè)試 類中以test開(kāi)頭的測(cè)試用例

           

           

           

          執(zhí)行結(jié)果      

           

            這樣一一分析下來(lái),我們對(duì)unittest 框架有了初步的了解。運(yùn)行腳本,因?yàn)橐肓?/span>unittest 框架,所以控制臺(tái)輸出了腳本執(zhí)行情況的信息。

           

          復(fù)制代碼
          >>> ========================= RESTART ================================
          >>> 
          .
          ----------------------------------------------------------------------
          Ran 1 test in 10.656s
          
          OK
          >>> 
          復(fù)制代碼

           

          很帥吧!? 后面將以unittest 為基礎(chǔ),向新的征程進(jìn)發(fā)~!

           

           

           

           

          posted on 2014-04-03 11:39 順其自然EVO 閱讀(505) 評(píng)論(0)  編輯  收藏 所屬分類: 自動(dòng)化測(cè)試 、python

          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 精河县| 彰武县| 朝阳区| 偃师市| 玉龙| 霍林郭勒市| 广昌县| 密山市| 敦化市| 来安县| 大余县| 潍坊市| 新乐市| 鹰潭市| 道真| 凌海市| 遵义县| 苏尼特左旗| 中西区| 宁明县| 麻栗坡县| 乌拉特前旗| 满洲里市| 西藏| 双江| 三明市| 札达县| 博兴县| 南平市| 无锡市| 瑞丽市| 密山市| 涪陵区| 清河县| 台江县| 麟游县| 本溪| 浦城县| 昌乐县| 南乐县| 西昌市|