在本教程中,我将向您介紹 Selenium Webdriver,它是當今市場上使用最廣泛的自動化測試架構。它是開源的,可與所有著名的程式設計語言(如Java、Python、C#、Ruby、Perl等)一起使用,以實作浏覽器活動的自動化。通過本文,我将告訴您開始使用 Selenium WebDriver 測試 Web 應用程式所需了解的所有資訊。
以下是本教程的主題:
什麼是 Selenium Webdriver?
Selenium 容易學嗎?
Selenium 軟體有什麼作用?
Selenium 的基本知識是什麼?
Selenium RC 的缺點和 WebDriver 的誕生
什麼是浏覽器元素?
定位網頁上的浏覽器元素
浏覽器元素上的操作
什麼是 Selenium WebDriver?
Selenium WebDriver 是一個基于 Web 的自動化測試架構,可以測試在各種Web浏覽器和各種作業系統上啟動的網頁。實際上,您還可以自由使用各種程式設計語言(例如Java、Perl、Python、Ruby、C#、PHP 和 JavaScript)編寫測試腳本。請注意,Mozilla Firefox 是 Selenium WebDriver 的預設浏覽器。
但是很多時候,剛入門的測試人員會想到這個疑問:
Selenium 好學嗎?
要用外行的話回答這個問題,我會說:”是的,是!”。Selenium 真的很容易學習和掌握,因為您隻需要對任意一種常見的程式設計語言(例如 Java、C#、Python、Perl、Ruby、PHP)有基本的了解。預先掌握這些程式設計語言中的任何一種的都可有助于編寫測試用例。但是,如果您沒有,那就不要擔心了。Selenium IDE 是一個可以有效使用的基于 GUI 的工具。
以下是 Selenium 軟體最吸引人的一些用途:
自動化測試: 在大型項目中,自動化測試會派上用場,在大型項目中,如果不是 Selenium,測試人員将必須手動測試每個建立的功能。使用 Selenium,所有手動任務都可以自動化,進而減輕了測試人員的負擔和壓力。
跨浏覽器相容性: Selenium 支援多種浏覽器,例如:Chrome、Mozilla Firefox、Internet Explorer、Safari 和 Opera。
提高測試覆寫率: 通過自動化的測試,可以減少總體測試時間,進而為測試人員騰出時間來同時在不同的測試場景下執行更多測試。
減少測試執行時間: 由于 Selenium 支援并行測試執行,是以可以大大減少并行測試執行時間。
多作業系統支援: Selenium WebDriver 提供跨 Windows、Linux、UNIX、Mac 等多種作業系統的支援。使用 Selenium WebDriver,您可以在 Windows 作業系統上建立測試用例并在 Mac 作業系統上執行。
WebDriver 是 Selenium v2.0 的一部分。Selenium v1 僅由 IDE,RC 和 Grid 組成。但是 Selenium 項目的主要突破是開發 WebDriver 并将其作為 Selenium v2 的替代産品引入。但是,随着 Selenium v3 的釋出,不推薦使用 RC,而将其遷移到舊版軟體包中。 您仍然可以下載下傳并使用 RC,但不要期望對其提供任何支援。
簡而言之,WebDriver相對于 RC 的優勢是:
支援更多的程式設計語言、作業系統和 Web 浏覽器
克服 Selenium 1 的局限性,例如檔案上傳、下載下傳、彈出視窗和對話障礙
與 RC 相比,指令更簡單,API 更好
支援批量測試,跨浏覽器測試和資料驅動的測試
但是,與 RC 相比,缺點是無法生成測試報告。RC 生成詳細的報告。
下圖描述了 WebDriver 的工作方式:

但是您是否想知道為什麼需要 Selenium Webdriver?接下來,我将讨論 Selenium RC 的局限性,因為這是最終開發 WebDriver 的原因。
當我說 Selenium RC 推出時立即引起轟動時,您可能會感到驚訝。那是因為它克服了同源政策問題,而在使用 Selenium Core 測試 Web 應用程式時這是一個主要問題。但是您知道什麼是同源政策問題嗎?
同源政策是用于強制實施 Web 應用程式安全模型的規則。根據同源政策,當且僅當被測試的 JavaScript 和網頁都來自同一域時,Web 浏覽器才會允許 JavaScript 代碼通路網頁上的元素。Selenium Core 是基于 JavaScript 的測試工具,由于無法測試每個網頁的原因而受到限制。
但是,當 Selenium RC 出現時,它使測試人員擺脫了同源政策問題。但是,RC 如何做到這一點? RC 通過使用另一個稱為 Selenium RC 伺服器的元件來做到這一點。 是以,RC 是由兩個元件組合而成的工具:Selenium RC 伺服器和 Selenium RC 用戶端。
Selenium RC 伺服器是一個 HTTP 代理伺服器,旨在“欺騙”浏覽器,使其相信 Selenium Core 和被測試的 Web 應用程式來自同一域。是以,不能阻止 JavaScript 代碼通路和測試任何網站。
盡管 Selenium RC 受到了很大的歡迎,但它也有自己的問題。主要的是執行測試所花費的時間。由于 Selenium RC 伺服器是浏覽器與您的 Selenium 指令之間通信的中間人,是以執行測試非常耗時。除了時間因素之外,RC 的架構也有些複雜。
這種架構涉及首先将 Selenium Core 注入 Web 浏覽器。然後,Selenium Core 将接收來自 RC 伺服器的指令并将其轉換為 JavaScript 指令。此 JavaScript 代碼負責通路和測試 Web 元素。下面這張圖有助于您将了解 RC 的工作原理。
為了克服這些問題,開發了 Selenium WebDriver。WebDriver更快,因為它直接與浏覽器互動,并且不需要外部代理伺服器。由于從作業系統級别控制浏覽器,是以架構也更簡單。下圖将幫助您了解 WebDriver 的工作方式。
WebDriver 的另一個好處是它支援在 HTML Unit 驅動程式(無頭驅動程式)上進行測試。當我們說無頭驅動程式時,它是指浏覽器沒有 GUI 的事實。另一方面,RC 不支援 HTML Unit 驅動程式。這些是 WebDriver 比 RC 得分高的原因。
在學習 Selenium 的概念之前,您應該對 Java 或任何其他面向對象的程式設計語言有基本的了解。Selenium 支援的語言包括 C#、Java、Perl、PHP、Python 和 Ruby。目前,Selenium Webdriver 在 Java 和 C# 中最受歡迎。
現在,讓我們繼續,下一部分學習“浏覽器元素”,我将告訴您這些元素是什麼以及如何在這些 Web 元素上進行測試。
元素是網頁上存在的不同元件。我們在浏覽時注意到的最常見元素是:
文本框
CTA 按鈕
圖像
超連結
單選按鈕 / 複選框
文字區 / 錯誤資訊
下拉框 / 清單框 / 組合框
Web表格 / HTML表格
架構
測試這些元素本質上意味着我們必須檢查它們是否工作正常,并按照我們希望的方式進行響應。例如,如果我們正在測試文本框,您将對它進行什麼測試?
我們是否能夠将文本或數字發送到文本框
我們可以檢索已傳遞到文本框等的文本嗎?
如果我們正在測試圖像,則可能需要:
下載下傳圖檔
上傳圖檔
點選圖檔連結
檢索圖像标題等。
類似地,可以對前面提到的每個元素執行操作。但是隻有将元素放置在網頁上之後,我們才能執行操作并開始對其進行測試,對嗎? 是以,下一個主題,我将介紹元素定位器技術。
定位網頁上存在的浏覽器元素
網頁上的每個元素都具有屬性。元素可以具有多個屬性,并且這些屬性中的大多數對于不同的元素而言都是唯一的。例如,考慮具有兩個元素的頁面:圖像和文本框。 這兩個元素都有一個“名稱”屬性和一個“ ID”屬性。這些屬性值對于每個元素都必須是唯一的。 換句話說,兩個元素不能具有相同的屬性值。元素的“類名”可以具有相同的值。
在本例中,圖像和文本框既不能具有相同的“ ID”值,也不能具有相同的“名稱”值。但是,頁面上的一組元素可能有一些共同的屬性。稍後,我将告訴您這些屬性是哪些,但是在此之前,讓我列出我們可以用來定位元素的 8 個屬性。 這些屬性是 ID、名稱、類名、标簽名、連結文本、部分連結文本、CSS 和 XPath。
由于元素是使用這些屬性定位的,是以我們将其稱為“定位器”。定位器有:
By.id
文法: driver.findElement(By.id(“xxx”));
By.name
文法: driver.findElement(By.name(“xxx”));
By.className
文法: driver.findElement(By.className(“xxx”));
By.tagName
文法: driver.findElement(By.tagName(“xxx”));
By.linkText
文法: driver.findElement(By.linkText(“xxx”));
By.partialLinkText
文法: driver.findElement(By.partialLinkText(“xxx”));
By.css
文法: driver.findElement(By.css(“xxx”));
By.xpath
文法: driver.findElement(By.xpath(“xxx”));
通過檢視上面的文法,您可能已經意識到定位器是在内部調用的。是以,在進行進一步操作之前,您需要學習可用于對元素執行操作的所有其他方法、浏覽器指令和功能。
從現在開始,您将獲得很多樂趣,因為理論更少、代碼更多。是以,請做好準備,打開Eclipse IDE,并安裝必需的 Selenium 軟體包。
要開始測試網頁,我們需要首先打開浏覽器,然後通過提供正确的 URL 導航到該網頁?看看下面的代碼,我在上面複制了同樣的代碼。Firefox 浏覽器将首先啟動,然後将導航到 Facebook 的登入頁面。
import
org.openqa.selenium.WebDriver; 是一個庫包,其中包含啟動加載有特定驅動程式的浏覽器所需的類。
import org.openqa.selenium.firefox.FirefoxDriver; 是一個庫包,其中包含 FirefoxDriver 類,該類是啟動 FirefoxDriver 作為 WebDriver 類啟動的浏覽器所需的。
System.setProperty(“webdriver.gecko.driver”, “files/geckodriver.exe”); – 該指令通知運作時引擎指定路徑中存在 Gecko 驅動程式。在 Firefox 35 之後,我們需要下載下傳 Gecko 驅動程式以使用 WebDriver。如果要在 Chrome 上進行測試,則必須下載下傳ChromeDriver(這是一個.exe檔案),并在此代碼行中指定其路徑。對于其他浏覽器,我們也必須這樣做。
WebDriver driver = new FirefoxDriver(); – 此指令用于啟動新的 Firefox 驅動程式對象。
driver.get(“https://www.edureka.co/”); – 這個方法用于打開指定的URL。
driver.getTitle(); – 此指令擷取浏覽器中目前打開的頁籤的标題。
driver.quit(); – 此指令關閉浏覽器驅動程式。
但是,如果您想導航到其他 URL 然後進行測試該怎麼辦?在這種情況下,您可以使用下面的代碼片段所示的 navigation.to() 指令。然後,如果您想傳回上一頁,則可以通過使用navigation.back()指令來完成。 同樣,要重新整理目前頁面,可以使用navigation.refresh() 指令。
如果您想最大化浏覽器視窗的大小,則可以使用下面的代碼片段來實作。
如果要為浏覽器視窗設定自定義尺寸,則可以設定自己的尺寸,如下面的代碼片段所示。
現在您已經了解了大多數基本知識,我們進入下一個主題。讓我們嘗試在網頁上找到一個元素,然後執行所有可能的操作。
我很确定,你們所有人都有 Facebook 帳戶。是以,讓我向您展示如何繞過代碼本身的憑據登入 Facebook。
登入頁面中有兩個文本字段,一個用于電子郵件 / 電話,另一個用于密碼。我們必須找到這兩個元素,将憑據傳遞給這些元素,然後找到第三個元素:需要單擊的“登入”按鈕。
請看下面的截圖。這是 Facebook 登入頁面的螢幕截圖。
如果您檢查(Ctlr + Shift + i)此頁面,則将在浏覽器中看到相同的視窗。然後,在“元素”下,将顯示頁面上存在的所有元素及其屬性的清單。上面的螢幕快照中突出顯示了三個部分。第一個突出顯示的元素是電子郵件文本字段,第二個是密碼文本字段,第三個是“登入”按鈕。
如果您還記得,我在前面提到過可以使用元素定位器技術來定位這些元素。 讓我們用它來定位這些元素并發送字段值。
這是查找元素的文法:driver.findElement(By.id(“xxx”));
為了發送它的值,我們可以使用方法 sendKeys(“credentials“);
要單擊按鈕,我們必須使用 click();
那麼,讓我們開始尋找元素并對其進行操作。其代碼在下面的代碼片段中。
在第 1 行中,我們通過其唯一的“名稱”屬性來辨別 Email 元素,并将其發送給 EmailID。
在第 2 行中,我們通過其唯一的“名稱”屬性來辨別 Password 元素,并将其發送給密碼。
在第 3 行中,我們通過其唯一 ID 找到“登入”按鈕元素,然後單擊該按鈕。
僅添加這些代碼行可能還不夠。那是因為頁面的動态,它可能不會立即響應,并且在頁面加載時,WebDriver 将終止并引發逾時異常錯誤。此問題可能很快就不會在 Facebook 頁面上發生,但很可能會在其他任何電子商務網站和其他動态網站上發生。
為了克服這個問題,我們需要使用一種先進的技術。我們需要請求我們的 WebDriver 在頁面被通路并且頁面完全加載之後等待,我們需要找到元素然後執行操作。
如果你想讓你的 WebDriver 等待,直到所有元素加載到網頁中,然後關閉浏覽器,那麼我們可以使用 driver.wait() 方法或 Threads.sleep() 方法來實作。但是,如果您正在編寫更進階的代碼,那麼您應該使用隐式等待或顯式等待。但是對于我們的情況,下面的指令就足夠了。
但是,在使用等待條件時,請記住導入該庫:
我們這樣做是因為,等待類及其相關方法将出現在此庫中。
下面是我所解釋代碼的完整代碼片段。
當您用實際的電子郵件和密碼替換憑據并執行此代碼時,Facebook 将在新視窗中打開,輸入您的憑據并登入到您的帳戶。
瞧! 您已成功登入,這意味着您的完整代碼已完全執行。
我使用了 ID 和 Name 屬性來定位元素。實際上,您可以使用任何其他定位器來查找元素。XPath 是最有用和最重要的定位器技術。但是,隻要您甚至可以找到其中一個屬性并将其用于定位元素,就可以了。