Selenium 4 的新技巧

今天,我們將介紹 Selenium 4 提供的一些新技巧和功能的詳細資訊。

在他的系列文章的第三篇中,Simon Stewart 繼續談論 Selenium 4 的新功能,並回顧新版本中的一些技巧。

在我之前的文章中,我們討論了如何貢獻 Selenium,以及為何我們將版本號碼提升到 4。 前言已經夠多了! 今天,我們將介紹 Selenium 4 提供的一些新技巧和功能的詳細資訊。

尋找元素和相對定位器

您知道,在頁面上尋找元素可能非常困難。 我看過很多人使用非常複雜的 XPATH 表達式,並嘗試找出複雜的 CSS 選擇器等等。 SeleniumConf 上甚至有關於這個主題的完整演講。 難道沒有更好的方法來做到這一點嗎?

想想我們如何描述頁面上元素的位置。 想想您會如何透過電話做到這一點。 您永遠不會談論原始 DOM,「喔,找到巢狀在 'id' 為 'foo' 的 SPAN 標籤內的第五個 DIV 元素」。 您永遠不會這樣說! 相反,當談論頁面上物件的位置時,您會說類似「找到圖片上方的那個東西,以及連結右邊的那個東西」的話。

很久以前,一個名為 Sahi 的專案開始以這種方式定位元素。 Sahi 具有 Relation API,這是一種尋找元素的絕佳方式,而且使用起來非常流暢和愉快。 多年前,當我開始 WebDriver 時,我曾與 Narayan(Sahi 的創作者)交談,我向他承諾,我會暫緩實作 Sahi 的這項旗艦功能。 這項功能很棒,但也是 Sahi 引以為傲的功能。 然而,現在有其他工具,例如 Tyco,正在實作這種風格的 API,因此現在似乎是在 Selenium 中執行相同操作的合適時機。 在 Selenium 4 中,我們稱它們為「相對定位器」。 您有時可能會看到我們將它們稱為「友善定位器」,因為最初的實作是這樣稱呼它們的,但「相對」更能描述它們的工作方式。 我們有一些:near、above、below、left of、right of。 它們讓您可以用人類語言談論頁面上元素的位置。

展望未來,我們也計劃讓使用者能夠新增新的定位器類型,不僅在用戶端,而且在 Selenium Server 上也是如此。 例如,雖然 JS UI 框架來來去去(還有人記得使用 jquery 嗎?),但如果能夠為人們喜歡的目前工具(例如 React)新增自訂定位器,那就太好了。

網站身份驗證

自我們啟動專案以來,人們一直要求的一項功能是能夠對網站進行身份驗證。 以前,您可以透過正確製作瀏覽器前往的 URL 來做到這一點,但這會將憑證洩漏給任何中間人,並將其留在伺服器日誌中,因此瀏覽器已逐漸移除此功能。 這很遺憾,因為我們知道人們經常需要在測試中執行此操作。 在 Selenium 4 中,我們現在提供一種機制來註冊可用於針對這些網站進行身份驗證的使用者名稱和密碼。

攔截網路流量

Selenium 測試的一個常見抱怨是它們速度慢且不穩定。 雖然與瀏覽器的繫結非常出色,並且完全由 W3C WebDriver 規範描述,但任何端對端測試都可能比簡單的單元測試更容易出現不穩定性,這是事實,因為移動部件更多,而且出錯的可能性也更高。

解決此問題的一種方法是將應用程式的後端存根化,在測試中攔截網路流量並傳回預先設定的回應。 諸如 mountebank 之類的工具使 API 測試變得容易。 如果有一個類似 Selenium 的工具,那不是很好嗎?

使用 Selenium 4,我們現在提供一種機制來執行此操作,使用 NetworkInterceptor(嗯,這就是我們在 Java 繫結中稱呼它的方式)。 將您的 WebDriver 執行個體傳遞給它,每次瀏覽器即將發出 HTTP 請求時都會呼叫它,讓您可以傳回幾乎任何您想要的東西

Chrome 除錯協定

正如我之前提到的,Selenium 4 的優點之一是我們致力於確保穩定且現代化的使用者介面 API。 這是什麼意思? 首先,我們需要承認,經過很長一段時間後,瀏覽器自動化領域現在又重新出現競爭。 值得注意的是 Puppeteer 和 Cypress 的形式,退一步來說,它們提供什麼? 它們建立在 Chrome DevTools Protocol (CDP)> 之上,這是一種旨在啟用 Chromium 基礎瀏覽器內除錯器的協定。

由於其設計目的,它是一種喋喋不休的協定,而不是使用者介面 API,可讓您內省到瀏覽器中。 更糟的是,在測試和瀏覽器之間引入網路躍點,這種喋喋不休會導致測試速度變慢,因為網路延遲會增加。 這就是為什麼 Puppeteer 等工具希望您在本地電腦上執行的原因。 這對於個別測試的速度來說很棒,但使得平行化更加困難,因為您無法輕鬆使用 Sauce Labs 等服務。

更複雜的是,由於 CDP 被設計為除錯協定,因此它可能會在版本之間無預警地變更。 這就是 Puppeteer 和 Cypress 與特定版本的瀏覽器綁定的原因,這會為您(作為測試作者)帶來兩難:您如何在多個版本的瀏覽器上進行測試? 更新測試 API 以取得不同的瀏覽器可能會導致您不再進行有效的 API 呼叫。 不這樣做會將您與可能過時的瀏覽器版本綁定。

儘管如此,使用 CDP 開啟了許多可能性,這就是我們在 Selenium 4 中新增對其支援的原因。 事實上,我們的一些新功能是建立在其之上的(儘管我們隱藏了詳細資訊!)

但我們也更進一步,不僅僅是新增基本支援。 Selenium 4 可以同時支援多個版本的 CDP,這表示您可以使用目前和 Beta 版本的 Chromium 基礎瀏覽器進行測試,而無需重寫測試。 我們透過提供「理想化的 CDP」來做到這一點,它穩定且涵蓋我們認為測試需要的功能。 如果這種理想化的世界觀對您來說還不夠,我們也會公開原始 CDP API,讓您可以彈性地選擇最適合您測試的方法。

我們正在將此經驗回饋到新的 W3C WebDriver Bidi 規範中,這有助於使其更適合測試人員。

我在這篇文章中省略了與 Selenium 4 的另一個重要技巧(新的 Selenium Grid)相關的所有詳細資訊,我將在下一篇文章中介紹。 敬請期待!

這最初發布在 https://saucelabs.com/blog/new-tricks-in-selenium-4

上次修改時間:2021 年 8 月 7 日:重新命名目錄 (e9895f27c26)