使用python selenium進行自動化functional test

Why Automation Testing

如今彷佛你們都一致認同一個項目應該有足夠多的測試來保證功能的正常運做,並且這些此處的‘測試’特指自動化測試;而且大多數人會認爲若是還有哪一個項目依然採用人工測試來保證代碼的正確性的話,那簡直是太落後了,太難以想象了。css

可是在我如今的項目裏,以前大部分的狀況下咱們仍是在使用手動測試,項目依然在每週一次井井有理的上線着。固然有部分緣由是由於項目業務和技術上的特殊性,可是這開始讓我思考:咱們究竟爲何要進行自動化?什麼狀況下該進行自動化?自動化測試使用與全部的測試場景嗎?html

我認爲自動化測試對咱們的項目之因此重要,有幾點緣由:java

Automated Software Testing Saves Timepython

咱們的項目如今以每週一次的頻率上線,因爲項目自己的特殊性,每次上線後就要進行一次大規模的手動測試來保證不會break任何已有功能。這樣的測試每週一次的重複着,測試的內容也毫無變化,這消耗了團隊成員大部分的時間和精力。因此引入自動化測試以後咱們就可以運行自動化測試來完成這些重複性的工做,節省了時間和沒必要要的勞動。程序員

Team Morale Improvesweb

並非說若是沒有測試咱們就對本身的代碼沒有了信心。可是不管多麼厲害的程序員都沒有辦法保證本身的代碼可以100%毫無差錯的運行,尤爲是當這些代碼須要和一個已有的項目結合起來運做的時候。當咱們的代碼和別的項目結合的時候,咱們有時會擔憂咱們的代碼可以單獨的運做,可是卻會在集成後破壞一些原有的功能。特別是在這種狀況確實發生過以後,這樣的擔憂又會被進一步放大。自動化運行的測試可以在必定程度上保證咱們的代碼是按照咱們的期待運做的,這就增強了開發人員對本身的代碼的信心。而且這種信心不是出於程序員對本身的代碼的欣賞,而是本身的代碼可以真的經受檢驗後正常運做。同時,這樣的信心也來自於自動化測試帶來的第三個好處:編程

Increase Test Coverage瀏覽器

正是由於自動化測試能夠覆蓋到更多的人工測試須要花大量時間精力才能覆蓋到的測試範圍和深度,咱們才能知道咱們的代碼在必定程度上已經可以經受住考驗了,才能對本身的代碼更有信心的繼續後續的集成和開發。app

Selenium + Python

Selenium是一個自動化瀏覽器的工具,常被用來作web應用的自動化測試。它與其餘的測試工具相比優點主要在於:maven

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

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 "YouTube",driver.title) def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()

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

相關文章
相關標籤/搜索