使用python selenium進行自動化functional test

jopen 11年前發布 | 83K 次閱讀 測試工具 Selenium

Why Automation Testing

現在似乎大家都一致認同一個項目應該有足夠多的測試來保證功能的正常運作,而且這些此處的‘測試’特指自動化測試;并且大多數人會認為如果還有哪個項目依然采用人工測試來保證代碼的正確性的話,那簡直是太落后了,太不可思議了。

但是在我現在的項目里,之前大部分的情況下我們還是在使用手動測試,項目依然在每周一次井然有序的上線著。當然有部分原因是因為項目業務和技術上的特殊性,但是這開始讓我思考:我們究竟為什么要進行自動化?什么情況下該進行自動化?自動化測試使用與所有的測試場景嗎?

我認為自動化測試對我們的項目之所以重要,有幾點原因:

Automated Software Testing Saves Time

我們的項目現在以每周一次的頻率上線,由于項目本身的特殊性,每次上線后就要進行一次大規模的手動測試來保證不會break任何已有功能。這樣的測試每周一次的重復著,測試的內容也毫無變化,這消耗了團隊成員大部分的時間和精力。所以引入自動化測試之后我們就能夠運行自動化測試來完成這些重復性的工作,節省了時間和不必要的勞動。

Team Morale Improves

并不是說如果沒有測試我們就對自己的代碼沒有了信心。但是無論多么厲害的程序員都沒有辦法保證自己的代碼能夠100%毫無差錯的運行,尤其是當這些代碼需要和一個已有的項目結合起來運作的時候。當我們的代碼和別的項目結合的時候,我們有時會擔心我們的代碼能夠單獨的運作,但是卻會在集成后破壞一些原有的功能。特別是在這種情況確實發生過之后,這樣的擔心又會被進一步放大。自動化運行的測試能夠在一定程度上保證我們的代碼是按照我們的期待運作的,這就加強了開發人員對自己的代碼的信心。并且這種信心不是出于程序員對自己的代碼的欣賞,而是自己的代碼能夠真的經受檢驗后正常運作。同時,這樣的信心也來自于自動化測試帶來的第三個好處:

Increase Test Coverage

正是因為自動化測試可以覆蓋到更多的人工測試需要花大量時間精力才能覆蓋到的測試范圍和深度,我們才能知道我們的代碼在一定程度上已經能夠經受住考驗了,才能對自己的代碼更有信心的繼續后續的集成和開發。

Selenium + Python

Selenium是一個自動化瀏覽器的工具,常被用來做web應用的自動化測試。它與其他的測試工具相比優勢主要在于:

Selenium 測試直接在瀏覽器中運行,就像真實用戶所做的一樣。

Selenium webdriver可以運行在各種不同的操作系統的眾多瀏覽器平臺上:

  • Google Chrome 12.0.712.0+
  • Internet Explorer 6, 7, 8, 9 - 32 and 64-bit where applicable
  • Firefox 3.0, 3.5, 3.6, 4.0, 5.0, 6, 7
  • Opera 11.5+
  • HtmlUnit 2.9
  • Android – 2.3+ for phones and tablets (devices & emulators)
  • iOS 3+ for phones (devices & emulators) and 3.2+ for tablets (devices & emulators)

另外,selenium提供多種編程語言支持:Java, Javascript, Ruby, PHP, Python, Perl , C#。

在這么多的語言支持中,為什么我們選擇了python呢?

首先,python是一門非常容易入門的面向對象的腳本語言。我在開始寫python+selenium之前完全沒有python的編程經驗,但是由于它的語法相當簡單,并且表意和英語十分接近,因此讓人能在簡單的學習之后就快速的上手。

另外,作為一門腳本語言,相較于java來說就有了天生的優勢:解釋執行。這就意味著我寫了幾行代碼,只需要一行命令就可以快速的運行起來看到結果,而不像 Java那樣需要漫長的編譯打包等過程。完成同樣的功能,python只需要一個py文件和一行命令,而java則需要整整一個project,然后編譯打包發布等等。就算使用maven,也要進行很多相關的配置,過程相當麻煩。

在將python與selenium結合起來寫functional test時,只需要在機器上配置好python的環境,下載selenium(easy_install selenium),編寫測試代碼,然后一句簡單的命令:python xxx.py 就可以將測試代碼運行起來。

How to Write Test Code

首先,我們需要將selenium webdriver的依賴加入我們的測試代碼中:

from selenium import webdriver

webdriver組件包含了所有的WebDriver的實現,這樣我們就可以使用selenium webdriver為我們提供的瀏覽器交互等強大的功能了。

driver = web driver.Firefox()
driver.get("http://www.google.com")

創建一個Firefox WebDriver的實例,driver.get方法將打開方法參數中給出的URL所指向的網頁。這行代碼將會等到指向的目標頁面完全加載后才會把控制還給后續的代碼。

得到了我們想要打開的頁面后,我們就可以對網頁進行一些基礎的判斷:

assert "Google" in driver.title

這個斷言會判斷網頁的html <title>標簽中是否包含“Google”這個字符串。這種斷言很常見,可以用來判斷打開的是否是我們期待的頁面。

之后,在目標頁面上,我們可以進一步的定位到每一個頁面元素,與這些元素進行交互來模仿用戶操作,測試元素的行為是否和我們預期的相符:

searchInput = driver.find_element_by_id("lst-ib")
searchInput.send_keys("selenium")
searchBtn = driver.find_element_by_name("btnK")
searchBtn.click()

WebDriver提供了多種的定位到元素的方法:

find_element_by_id  
find_element_by_name find_elements_by_name
find_element_by_class_name find_elements_by_class_name
find_element_by_tag_name find_elements_by_tag_name
find_element_by_xpath find_elements_by_xpath
find_element_by_link_text find_elements_by_link_text
find_element_by_partial_link_text find_elements_by_partial_link_text
find_element_by_css_selector find_elements_by_css_selector

 

click() 與send_keys()都是selenium.webdriver.common.action_chains.ActionChains中提供的與元素交互的方法。click()模擬了對一個元素的點擊,send_keys()模擬了向一個元素輸入一些鍵盤輸入。其他的交互方法可以查看API。

最后,在完成了頁面操作之后我們可以使用driver.close()或是driver.quit()來退出。這兩者的區別是:close只關閉一個tab,quit則是關閉整個瀏覽器。

A Simple Demo

上面的代碼嚴格來說并不像我們常常寫的測試代碼,它只是打開了一個網頁并做了一些簡單的操作而已。我們可以使用python提供的標準unittest庫來把它寫得更符合我們的測試代碼的風格。使用unittest庫后,我們能在terminal中看到測試報告。

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class GooglePageTest(unittest.TestCase):
     def setUp(self):
          self.driver = webdriver.Firefox()

     def test_click_all_links_on_page(self):
          driver = self.driver
          driver.get("http://www.google.com")
          length = len(driver.find_elements_by_tag_name("a"))
          for i in range(0,length):
               links = driver.find_elements_by_tag_name("a")
               if links[i].is_displayed():
                    links[i].click()
                    driver.back()
                    self.assertIn("Google" or "油Tube",driver.title)

     def tearDown(self):
          self.driver.close()

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

這段代碼首先引入了unittest組件,然后使用我們熟悉的test case的風格寫了一個測試用例,測試了Google主頁上面的所有<a>標簽點擊,對每個打開的頁面檢查title中是否含有期待的關鍵字。測試結束后將自動關閉瀏覽器,并且在terminal中可以看到測試報告。

來自:http://www.cnblogs.com/harolei/p/3428835.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!