Selenium WebDriver的工作原理

原文鏈接:https://blog.csdn.net/yoyocat915/article/details/80246744

先通過一個簡單的類比說個好理解的,這個比喻是我從美版知乎Quora上看到的,覺得比較形象、好理解拿來用用。可以把WebDriver驅動瀏覽器類比成出租車司機開出租車。

類比

在開出租車時有三個角色:

  • 乘客:他/她告訴出租車司機去哪裏,大概怎麼走
  • 出租車司機:他按照乘客的要求來操控出租車
  • 出租車:出租車按照司機的操控完成真正的行駛,把乘客送到目的地


在WebDriver中也有類似的三個角色:

  • 自動化測試代碼:自動化測試代碼發送請求給瀏覽器的驅動(比如火狐驅動、谷歌驅動)
  • 瀏覽器驅動:它來解析這些自動化測試的代碼,解析後把它們發送給瀏覽器
  • 瀏覽器:執行瀏覽器驅動發來的指令,並最終完成工程師想要的操作。

所以在這個類比中:

1. 工程師寫的自動化測試代碼就相當於是乘客

2. 瀏覽器的驅動就相當於是出租車司機

3. 瀏覽器就相當於是出租車

 

WebDriver的工作原理

從技術上講,也同樣是上面的三個角色:

1. WebDriver API(基於Java、Python、C#等語言)

對於java語言來說,就是下載下來的selenium的Jar包,比如selenium-java-3.8.1.zip包,代表Selenium3.8.1的版本

2. 瀏覽器的驅動(browser driver)

每個瀏覽器都有自己的驅動,均以exe文件形式存在。比如谷歌的chromedriver.exe、火狐的geckodriver.exe、IE的IEDriverServer.exe

3. 瀏覽器:就是我們很熟悉的常用的各種瀏覽器。

 

三者是如何通訊的?

WebDriver腳本運行的時候,它們之間是如何通信的呢?爲什麼同一個browser driver即可以處理java語言的腳本,也可以處理python語言的腳本呢?讓我們來看一下,一條Selenium腳本執行時後端都發生了哪些事情:

  1. 對於每一條Selenium腳本,一個http請求會被創建並且發送給瀏覽器的驅動;
  2. 瀏覽器驅動中包含了一個HTTP Server,用來接收這些http請求;
  3. HTTP Server接收到請求後根據請求來具體操控對應的瀏覽器;
  4. 瀏覽器執行具體的測試步驟;
  5. 瀏覽器將步驟執行結果返回給HTTP Server;
  6. HTTP Server又將結果返回給Selenium的腳本,如果是錯誤的http代碼我們就會在控制檯看到對應的報錯信息。

 

爲什麼使用HTTP協議呢?

因爲HTTP協議是一個瀏覽器和Web服務器之間通信的標準協議,而幾乎每一種編程語言都提供了豐富的http libraries,這樣就可以方便的處理客戶端Client和服務器Server之間的請求request及響應response,WebDriver的結構中就是典型的C/S結構,WebDriver API相當於是客戶端,而小小的瀏覽器驅動纔是服務器端。

那爲什麼同一個瀏覽器驅動即可以處理Java語言的腳本,也可以處理Python語言的腳本呢?這就要提到WebDriver基於的協議:JSON Wire protocol。JSON Wire protocol是在http協議基礎上,對http請求及響應的body部分的數據的進一步規範。

我們知道在HTTP請求及響應中常常包括以下幾個部分:http請求方法、http請求及響應內容body、http響應狀態碼等。

常見的http請求方法:

GET:用來從服務器獲取信息。比如獲取網頁的標題信息

POST:向服務器發送操作請求。比如findElement,Click等

http響應狀態碼:

在WebDriver中爲了給用戶以更明確的反饋信息,提供了更細化的http響應狀態碼,比如:

7: NoSuchElement

11:ElementNotVisible

200:Everything OK

現在到了最關鍵的http請求及響應的body部分了:

body部分主要傳送具體的數據,在WebDriver中這些數據都是以JSON的形式存在並進行傳送的,這就是JSON Wire protocol。

JSON是一種數據交換的格式,是對XML的升級與替代,下面是一個JSON文件的例子:

  {
 
    "firstname": "Alex",
    "lastname": "Smith",
    "moble": "13300000000"
  }

下面的例子是WebDriver中在成功找到一個元素後JSON Wire Protocol的返回:

{"status" : 0, "value" : {"element" : "123422"}}
所以在Client和Server之間,只要是基於JSON Wire Protocol來傳遞數據,就與具體的腳本語言無關了,這樣同一個瀏覽器的驅動就即可以處理Java語言的腳本,也可以處理Python語言的腳本了。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章