【Selenium】WebDriver的工作原理

一、先通過一個簡單的類比說個好理解的,這個比喻是我從美版知乎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語言的腳本了。


三、原理補充

1、關於WebDriver

設計模式:按照Server-Client的經典設計模式設計;

Server端:即Remote Server(遠程服務器),可以是任意的瀏覽器,當腳本啓動瀏覽器時,該瀏覽器就是Remote Server,它的職責是等待Client發送請求並做出響應;

Client端:簡單來說就是我們的測試代碼,測試代碼中的一些行爲是以HTTP請求的方式發送給被測試瀏覽器——Remote Server,Remote Server接受請求,執行相應操作,
並在Response中返回執行狀態、返回值等信息;

2、WebDriver工作流程

①WebDriver啓動目標瀏覽器,並綁定至指定端口,啓動的瀏覽器實例將作爲WebDriver的Remote Server;

②Client端通過CommandExcuter發送HTTPRequest給Remote Server的偵聽端口(通信協議:the webdriver wire protocol);

③Remote Server需要依賴原生的瀏覽器組件(比如:chromedriver.exe)來轉化瀏覽器的native調用;

轉載原文:

  1. https://blog.csdn.net/yoyocat915/article/details/80246744
  2. https://www.cnblogs.com/imyalost/p/7242747.html#4109245
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章