Selenium 如何與 Web 瀏覽器互動?
Selenium 是一個用於 Web 應用自動化測試的開源框架。除此之外,它還可以用於各種管理任務,例如網站監控。
Selenium 有四種主要型別:
- Selenium-IDE。
- Selenium-RC。
- Selenium Grid。
- Selenium WebDriver。
讓我們看看每種型別的用途:
Selenium IDE - 這是一個整合開發環境,具有易於使用的介面,用於構建和執行 Selenium 測試用例。它是一個原型工具,用於以記錄使用者操作的方式構建測試指令碼。記錄的操作將儲存為指令碼,可以根據需要重複使用。
雖然 Selenium IDE 是一個 Firefox 外掛,但透過使用 Selenium RC,可以在任何瀏覽器上執行在其上建立的指令碼。
它可以用於建立簡單的測試用例,並對選定位置使用斷言和驗證,但對於建立高階測試用例,我們使用 Selenium RC 或 WebDriver。
Selenium RC - RC 是一個遠端控制,它透過接管瀏覽器的控制權,然後透過注入編寫的自定義指令碼來執行自動化程式碼進行測試。Selenium RC 使用 Selenium RC 伺服器與瀏覽器互動。它在網頁載入時將 JavaScript 函式注入瀏覽器。
RC 具有一個優勢,因為它為使用者提供自動化測試結果的 HTML 檔案,而 WebDriver 則不具備此功能。
Selenium RC 為其支援的每種語言(如 Java、C#、Perl、Ruby、PHP、Python)提供 API 和庫,使其成為第一個允許使用者使用他們喜歡的任何語言進行程式設計的自動化 Web 測試工具。
它跨平臺、跨瀏覽器工作,並且可以輕鬆支援新的瀏覽器。
Selenium Grid - 要在不同的遠端機器上同時執行不同的測試用例,我們使用 Selenium Grid。這提高了執行速度。假設我們有一個測試套件,其中包含複雜和簡單的測試用例。在這種情況下,我們可以根據複雜性劃分測試用例並分別執行它們。
更快地執行和並行執行測試用例是 Selenium Grid 的主要優勢。在 Selenium RC 的支援下,它可以在多臺遠端機器上的多個環境中執行多個測試用例。
Selenium WebDriver - WebDriver 直接作用於瀏覽器,並使用瀏覽器內建的功能來觸發測試人員編寫的自動化測試。
WebDriver 的另一個優勢是它可以使用 HTMLUnit 瀏覽器(HTMLUnit 瀏覽器是無頭瀏覽器,這意味著對使用者來說是不可見的,簡單來說就是沒有 GUI),由於這些原因,在 HTMLUnit 瀏覽器上進行測試速度更快,因為這些瀏覽器節省了載入頁面元素所需的時間。這導致測試用例的執行時間更短。
由於 WebDriver 從作業系統級別控制瀏覽器,因此它比其前身 Selenium RC 更快。
現在讓我們來看看 Selenium 的架構,以瞭解 Selenium 如何與不同的語言協同工作並支援不同的瀏覽器,從而產生相同的輸出,即測試用例執行。
上圖描述了 Selenium WebDriver 的工作原理。以下是組合在一起執行自動化測試指令碼的不同模組。
Selenium 庫 - 由於不同語言的限制,開發人員構建了 Selenium 客戶端庫/語言繫結以支援多種語言,例如,如果我們在 Java 中使用瀏覽器驅動程式,它將使用 Java 繫結。
資料通訊 - 為在伺服器和客戶端(瀏覽器)之間進行通訊,Selenium WebDriver 使用 JSON。JSON Wire Protocol 是一種 REST API,用於在 HTTP 伺服器之間傳輸資訊。每個瀏覽器驅動程式都有自己的 HTTP 伺服器。
自定義客戶端(無頭瀏覽器) - 瀏覽器驅動程式充當瀏覽器的助手,它與相應的瀏覽器進行通訊,而不會洩露瀏覽器功能的內部邏輯。當任何瀏覽器驅動程式接收到任何命令時,它將在相應瀏覽器上執行該命令併發送回 HTTP 響應。驅動程式只是特定於每個瀏覽器,用於安全連線。所有這些瀏覽器驅動程式都直接在作業系統之上工作,這使得它比傳統的 Selenium RC 更快。
既然我們已經瞭解了 Selenium 的內部工作原理,那麼讓我們來看看當我們在 Selenium 中執行指令碼時,典型情況下的執行步驟:
Selenium 指令碼為每個 Selenium 命令建立一個 HTTP 請求並將其傳送到瀏覽器驅動程式。
然後使用瀏覽器驅動程式將 HTTP 請求傳送到伺服器。
在 HTTP 伺服器上執行步驟。
執行狀態被髮送到 HTTP 伺服器,然後由自動化指令碼捕獲。
簡而言之,這就是 Selenium 的整個工作原理及其架構。