揭祕webdriver實現原理

    經過研究selenium-webdriver的源碼,筆者發現其實webdriver的實現原理並不高深莫測沒法揣度。在這裏以webdriver ruby binding的firefox-webdriver實現爲例,簡單介紹一下webdriver的工做原理。 web

  • 當測試腳本啓動firefox的時候,selenium-webdriver 會首先在新線程中啓動firefox瀏覽器。若是測試腳本指定了firefox的profile,那麼就以該profile啓動,不然的話就新啓1個profile,並啓動firefox; chrome

  • firefox通常是以-no-remote的方法啓動,啓動後selenium-webdriver會將firefox綁定到特定的端口,綁定完成後該firefox實例便做爲webdriver的remote server存在; 設計模式

  • 客戶端(也就是測試腳本)建立1個session,在該session中經過http請求向remote server發送restful的請求,remote server解析請求,完成相應操做並返回response; 瀏覽器

  • 客戶端接受response,並分析其返回值以決定是轉到第3步仍是結束腳本; ruby

這就是webdriver的工做流程,看起來很複雜實際上當瞭解了webdriver的實現原理後,理解上述問題應該比較簡單。 restful

webdriver是按照server – client的經典設計模式設計的。 session

server端就是remote server,能夠是任意的瀏覽器。當咱們的腳本啓動瀏覽器後,該瀏覽器就是remote server,它的職責就是等待client發送請求並作出相應; post

client端簡單說來就是咱們的測試代碼,咱們測試代碼中的一些行爲,好比打開瀏覽器,轉跳到特定的url等操做是以http請求的方式發送給被 測試瀏覽器,也就是remote server;remote server接受請求,並執行相應操做,並在response中返回執行狀態、返回值等信息; 測試

舉個實際的例子,下面代碼的做用是」命令」firefox轉跳到google主頁: google

driver = Selenium::WebDriver.for :firefox

driver.navigate.to "http://google.com"

在執行driver.navigate.to 「http://google.com」 這句代碼時,client,也就是咱們的測試代碼向remote server發送了以下的請求:

POST session/285b12e4-2b8a-4fe6-90e1-c35cba245956/url

post_data {"url":"http://google.com"}

經過post的方式請求localhost:port/hub/session/session_id/url地址,請求瀏覽器完成跳轉url的操做。

若是上述請求是可接受的,或者說remote server是實現了這個接口,那麼remote server會跳轉到該post data包含的url,並返回以下的response

{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}

該response中包含以下信息

  • name:remote server端的實現的方法的名稱,這裏是get,表示跳轉到指定url;

  • sessionId:當前session的id;

  • status:請求執行的狀態碼,非0表示未正確執行,這裏是0,表示一切ok不準擔憂;

  • value:請求的返回值,這裏返回值爲空,若是client調用title接口,則該值應該是當前頁面的title;

若是client發送的請求是定位某個特定的頁面元素,則response的返回值多是這樣的:

{"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}

name,sessionId,status跟上面的例子是差很少的,區別是該請求的返回值是ELEMENT:{2192893e- f260-44c4-bdf6-7aad3c919739},表示定位到元素的id,經過該id,client能夠發送如click之類的請求與 server端進行交互。

那麼remote server端的這些功能是如何實現的呢?答案是瀏覽器實現了webdriver的統一接口,這樣client就能夠經過統一的restful的接口去進 行瀏覽器的自動化操做。目前webdriver支持ie, chrome, firefox, opera等主流瀏覽器,其主要緣由是這些瀏覽器實現了webdriver約定的各類接口。

相關文章
相關標籤/搜索