1. 程式人生 > 實用技巧 >Selenium家族譜(三生三世)

Selenium家族譜(三生三世)

  引言

  Selenium發展至今已經到selenium3,以及即將面世selenium4,它的專案進展可以看這裡:https://github.com/SeleniumHQ/selenium/projects/2。我們平時可能經常使用selenium框架,但是對它的原理及淵源可能不清楚,下面我整理了一份關於selenium的前世今生。

  Selenium誕生的背景

  市場上已經有一款很牛逼的工具,也是眾所周知的——QTP。在UI自動化錄製及指令碼編寫等方面都表現非常優秀,企業級的工具。那麼為什麼會出現Selenium?

  Jason Huggins在2004年發起了Selenium專案,當時身處ThoughtWorks的他,為了不想讓自己的時間浪費在無聊的重複性工作中,幸運的是,所有被測試的瀏覽器都支援Javascript。Jason和他所在的團隊採用Javascript編寫一種測試工具來驗證瀏覽器頁面的行為;

  這個JavaScript類庫就是Selenium core,同時也是seleniumRC、Selenium IDE的核心元件。Selenium由此誕生。

  關於Selenium的命名比較有意思,當時QTP mercury是主流的商業自化工具,是化學元素汞(俗稱水銀),而Selenium是開源自動化工具,是化學元素硒,硒可以對抗汞。

  

  Selenium 1.0

  先看Selenium1.0版本的家族成員

 

  用一個簡單的公式表達:

  Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC

  Selenium IDE

  Selenium IDE是嵌入到Firefox瀏覽器中的一個外掛,實現簡單的瀏覽器操作的錄製與回放功能。當然目前谷歌瀏覽器也支援,但是不太好用。

  Selenium Grid

  Selenium Grid是一種自動化的測試輔助工具,用於分散式執行指令碼,Grid通過利用現有的計算機基礎設施,能加快Web-App的功能測試。利用Grid可以很方便地實現在多臺機器上和異構環境中執行測試用例。

  Selenium RC

  Selenium RC(Remote Control)是Selenium家族的核心部分。Selenium RC 支援多種不同語言編寫的自動化測試指令碼,通過Selenium RC的伺服器作為代理伺服器去訪問應用,從而達到測試的目的。  

  Selenium RC分為Client Libraries和Selenium Server。Client Libraries庫主要用於編寫測試指令碼,用來控制Selenium Server的庫。Selenium Server分為3部分:

  1.Launcher:啟動瀏覽器

  2.Http Proxy:selenium Server的Http代理

  3.Core:嵌入到瀏覽器的js程式碼。

  有Launcher啟動瀏覽器,將core嵌入到瀏覽器,並把瀏覽器代理設定為selenium Server的Http Proxy。

  使用的是JavaScript注入技術與瀏覽器打交道,需要Selenium RC啟動一個Server,將操作Web元素的API呼叫轉化為一段段Javascript,在Selenium核心啟動瀏覽器之後注入這段Javascript。

  開發過Web應用的人都知道,Javascript可以獲取並呼叫頁面的任何元素,自如的進行操作。

  由此才實現了Selenium的目的:自動化Web操作。這種Javascript注入技術的缺點是速度不理想,而且穩定性大大依賴於Selenium核心對API翻譯成的Javascript質量高低。

  

  Selenium Server負責控制瀏覽器行為。所以,我們在學習Selenium1.0的時候,核心應該是學習RC,它的工作原理是這樣的:

  

  

  在2006年的時候,Google的工程師Simon Stewart發起了WebDriver的專案;因為長期以來Google一直是Selenium的重度使用者,但卻被限制在有限的操作範圍內。

  Selenium RC 是在瀏覽器中執行JavaScript應用,使用瀏覽器內建的JavaScript翻譯器來翻譯和執行selenese命令(selenese是Selenium命令集合)。

  WebDriver是通過原生瀏覽器支援或者瀏覽器擴充套件來直接控制瀏覽器。WebDriver針對各個瀏覽器而開發,取代了嵌入到被測Web應用中的JavaScript,與瀏覽器緊密整合,因此支援建立更高階的測試,避免了JavaScript安全模型導致的限制。

  除了來自瀏覽器廠商的支援之外,WebDriver還利用作業系統級的呼叫,模擬使用者輸入。

  Selenium與WebDriver原是屬於兩個不同的專案,WebDriver的建立者Simon Stewart早在2009年8月的一份郵件中解釋了專案合併的原因。

  

  注意:

  Selenium與WebDriver合併原因:為何把兩個專案合併?部分原因是WebDriver解決了Selenium存在的缺點(例如能夠繞過JavaScript沙箱,我們有出色的API),部分原因是Selenium解決了WebDriver存在的問題(例如支援廣泛的瀏覽器),部分原因是因為Selenium的主要貢獻者和我都覺得合併專案是為使用者提供最優秀框架的最佳途徑。

  selenium RC是核心,所以內容有點多,可以瞭解一下。

  Webdriver產生背景

  2006年, Webdriver是由Google工程師開發的,WebDriver是通過原生瀏覽器支援或者瀏覽器拓展來控制瀏覽器, 取代了嵌入web的JavaScript(此處提到了JavaScript的沙箱機制,突破JavaScript的安全模型),除了來自瀏覽器廠商的支援外(也就是直接控制瀏覽器進行直接溝通), WebDriver還利用作業系統級別的呼叫, (什麼作業系統級別的呼叫?) , 模擬使用者輸入。

  Selenium 2.0

  因為Selenium和Webdriver的合併

  用一個簡單的公式表達:

  Selenium 2.0 =Selenium 1.0 + Webdriver

  2009年, Selenium和WebDriver合併,也就是現在用的Selenium2. Webdriver也就有了一個清晰的API,也就是Webdriver API。

  此時 selenium 2.0 = Selenium 1.0 + Webdriver, 還是相容selenium 1.0的, 這個時候不同瀏覽器的驅動方式不同, chrome用的是chromedriver, 其他有的是用selenium RC, 有的是用第三方開發的driver;
所以這個時候, 針對不同的瀏覽器, 匯入的包是不一樣的, 可能是selenium包,也有可能的webdriver包

from selenium import selenium,
from selenium import webdriver

  需要強調的是,在Selenium 2.0中主推的是WebDriver,可以將其看作Selenium RC的替代品。因為Selenium為了保持向下的相容性,所以在Selenium 2.0中並沒有徹底地拋棄Selenium RC。

所以,我們在學習Selenium2.0的時候,核心是學習WebDriver。它的工作原理是這樣的:

  

  用python實現的程式碼如下:

__author__ = 'Leo'

if __name__ == '__main__':

    from selenium import webdriver
    import time

    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('selenium')
    driver.find_element_by_id('su').click()
    time.sleep(1.1)
    driver.close()

  Selenium 3.0

  Selenium 3.0做了一些不大不小的更新:

  1、終於去掉了RC,簡單用公式表示為:

  Selenium 3.0 = Selenium 2.0 - Selenium RC(Remote Control)

  

  selenium3.0是selenium2.0的優化, 最大的變化是 產生了協議The WebDriver Wire Protocol這套協議非常之強大,幾乎可以操作瀏覽器做任何事情,包括開啟、關閉、最大化、最小化、元素定位、元素點選、上傳檔案等等等等。

  2、Selenium3.0只支援Java8版本以上。

  3、Selenium3.0中的Firefox瀏覽器驅動獨立了,以前裝完selenium2就可以驅動Firefox瀏覽器了,現在和Chrome一樣,必須下載和設定瀏覽器驅動。

  4、MAC OS 整合Safari的瀏覽器驅動。預設在/usr/bin/safaridriver 目錄下。

  5、只支援IE 9.0版本以上。

  Selenium 4.0

  在這裡看到Selenium 4.0 專案的進展:

  https://github.com/SeleniumHQ/selenium/projects/2

  

  附錄

  selenium中文文件:https://selenium-python-zh.readthedocs.io/en/latest/

  selenium官方文件:https://www.selenium.dev/selenium-ide/docs/en/introduction/getting-started

  selenium for python 官方文件:https://selenium-python.readthedocs.io/

  訪問中文官方文件:https://www.selenium.dev/documentation/zh-cn/,如圖:

  

  總結:

  selenium工具是唯一可以跟QTP媲美的,也就是UFT。版本在不斷更新,可以深入瞭解一下。接下來我再針對每個元件各講一個例項。另外有興趣的朋友,可以加入我們測試開發交流群,一起學習!