Selenium WebDriver教程

【注】本文譯自:
https://www.edureka.co/blog/selenium-tutorial
在本教程中,我將向您介紹 Selenium Webdriver,它是當(dāng)今市場(chǎng)上使用最廣泛的自動(dòng)化測(cè)試框架。它是開(kāi)源的,可與所有著名的編程語(yǔ)言(如Java、Python、C#、Ruby、Perl等)一起使用,以實(shí)現(xiàn)瀏覽器活動(dòng)的自動(dòng)化。通過(guò)本文,我將告訴您開(kāi)始使用 Selenium WebDriver 測(cè)試 Web 應(yīng)用程序所需了解的所有信息。
以下是本教程的主題:
什么是?Selenium Webdriver?
Selenium 容易學(xué)嗎?
Selenium 軟件有什么作用?
Selenium 的基本知識(shí)是什么?
Selenium RC 的缺點(diǎn)和 WebDriver 的誕生
什么是瀏覽器元素?
定位網(wǎng)頁(yè)上的瀏覽器元素
瀏覽器元素上的操作
什么是 Selenium WebDriver?
Selenium WebDriver 是一個(gè)基于 Web 的自動(dòng)化測(cè)試框架,可以測(cè)試在各種Web瀏覽器和各種操作系統(tǒng)上啟動(dòng)的網(wǎng)頁(yè)。實(shí)際上,您還可以自由使用各種編程語(yǔ)言(例如Java、Perl、Python、Ruby、C#、PHP 和 JavaScript)編寫測(cè)試腳本。請(qǐng)注意,Mozilla Firefox 是 Selenium WebDriver 的默認(rèn)瀏覽器。
但是很多時(shí)候,剛?cè)腴T的測(cè)試人員會(huì)想到這個(gè)疑問(wèn):
Selenium 好學(xué)嗎?
要用外行的話回答這個(gè)問(wèn)題,我會(huì)說(shuō):”是的,是!”。Selenium 真的很容易學(xué)習(xí)和掌握,因?yàn)槟恍枰獙?duì)任意一種常見(jiàn)的編程語(yǔ)言(例如 Java、C#、Python、Perl、Ruby、PHP)有基本的了解。預(yù)先掌握這些編程語(yǔ)言中的任何一種的都可有助于編寫測(cè)試用例。但是,如果您沒(méi)有,那就不要擔(dān)心了。Selenium IDE 是一個(gè)可以有效使用的基于 GUI 的工具。
Selenium 軟件有什么作用?
以下是 Selenium 軟件最吸引人的一些用途:
自動(dòng)化測(cè)試:在大型項(xiàng)目中,自動(dòng)化測(cè)試會(huì)派上用場(chǎng),在大型項(xiàng)目中,如果不是 Selenium,測(cè)試人員將必須手動(dòng)測(cè)試每個(gè)創(chuàng)建的功能。使用 Selenium,所有手動(dòng)任務(wù)都可以自動(dòng)化,從而減輕了測(cè)試人員的負(fù)擔(dān)和壓力。
跨瀏覽器兼容性:Selenium 支持多種瀏覽器,例如:Chrome、Mozilla Firefox、Internet Explorer、Safari 和 Opera。
提高測(cè)試覆蓋率:通過(guò)自動(dòng)化的測(cè)試,可以減少總體測(cè)試時(shí)間,從而為測(cè)試人員騰出時(shí)間來(lái)同時(shí)在不同的測(cè)試場(chǎng)景下執(zhí)行更多測(cè)試。
減少測(cè)試執(zhí)行時(shí)間:由于 Selenium 支持并行測(cè)試執(zhí)行,因此可以大大減少并行測(cè)試執(zhí)行時(shí)間。
多操作系統(tǒng)支持:Selenium WebDriver 提供跨 Windows、Linux、UNIX、Mac 等多種操作系統(tǒng)的支持。使用 Selenium WebDriver,您可以在 Windows 操作系統(tǒng)上創(chuàng)建測(cè)試用例并在 Mac 操作系統(tǒng)上執(zhí)行。
Selenium 的基本知識(shí)是什么?
WebDriver 是 Selenium v2.0 的一部分。Selenium v1 僅由 IDE,RC 和 Grid 組成。但是 Selenium 項(xiàng)目的主要突破是開(kāi)發(fā) WebDriver 并將其作為 Selenium v2 的替代產(chǎn)品引入。但是,隨著 Selenium v3 的發(fā)布,不推薦使用 RC,而將其遷移到舊版軟件包中。 您仍然可以下載并使用 RC,但不要期望對(duì)其提供任何支持。
簡(jiǎn)而言之,WebDriver相對(duì)于 RC 的優(yōu)勢(shì)是:
支持更多的編程語(yǔ)言、操作系統(tǒng)和 Web 瀏覽器
克服 Selenium 1 的局限性,例如文件上傳、下載、彈出窗口和對(duì)話障礙
與 RC 相比,命令更簡(jiǎn)單,API 更好
支持批量測(cè)試,跨瀏覽器測(cè)試和數(shù)據(jù)驅(qū)動(dòng)的測(cè)試
但是,與 RC 相比,缺點(diǎn)是無(wú)法生成測(cè)試報(bào)告。RC 生成詳細(xì)的報(bào)告。
下圖描述了 WebDriver 的工作方式:

但是您是否想知道為什么需要 Selenium Webdriver?接下來(lái),我將討論 Selenium RC 的局限性,因?yàn)檫@是最終開(kāi)發(fā) WebDriver 的原因。
Selenium RC 的缺點(diǎn)和 WebDriver 的誕生
當(dāng)我說(shuō) Selenium RC 推出時(shí)立即引起轟動(dòng)時(shí),您可能會(huì)感到驚訝。那是因?yàn)樗朔?strong>同源策略問(wèn)題,而在使用 Selenium Core 測(cè)試 Web 應(yīng)用程序時(shí)這是一個(gè)主要問(wèn)題。但是您知道什么是同源政策問(wèn)題嗎?
同源策略是用于強(qiáng)制實(shí)施 Web 應(yīng)用程序安全模型的規(guī)則。根據(jù)同源策略,當(dāng)且僅當(dāng)被測(cè)試的 JavaScript 和網(wǎng)頁(yè)都來(lái)自同一域時(shí),Web 瀏覽器才會(huì)允許 JavaScript 代碼訪問(wèn)網(wǎng)頁(yè)上的元素。Selenium Core 是基于 JavaScript 的測(cè)試工具,由于無(wú)法測(cè)試每個(gè)網(wǎng)頁(yè)的原因而受到限制。
但是,當(dāng) Selenium RC 出現(xiàn)時(shí),它使測(cè)試人員擺脫了同源政策問(wèn)題。但是,RC 如何做到這一點(diǎn)? RC 通過(guò)使用另一個(gè)稱為 Selenium RC 服務(wù)器的組件來(lái)做到這一點(diǎn)。 因此,RC 是由兩個(gè)組件組合而成的工具:Selenium RC 服務(wù)器和?Selenium RC 客戶端。
Selenium RC 服務(wù)器是一個(gè) HTTP 代理服務(wù)器,旨在“欺騙”瀏覽器,使其相信 Selenium Core 和被測(cè)試的 Web 應(yīng)用程序來(lái)自同一域。因此,不能阻止 JavaScript 代碼訪問(wèn)和測(cè)試任何網(wǎng)站。
盡管 Selenium RC 受到了很大的歡迎,但它也有自己的問(wèn)題。主要的是執(zhí)行測(cè)試所花費(fèi)的時(shí)間。由于 Selenium RC 服務(wù)器是瀏覽器與您的 Selenium 命令之間通信的中間人,因此執(zhí)行測(cè)試非常耗時(shí)。除了時(shí)間因素之外,RC 的架構(gòu)也有些復(fù)雜。
這種架構(gòu)涉及首先將 Selenium Core 注入 Web 瀏覽器。然后,Selenium Core 將接收來(lái)自 RC 服務(wù)器的指令并將其轉(zhuǎn)換為 JavaScript 命令。此 JavaScript 代碼負(fù)責(zé)訪問(wèn)和測(cè)試 Web 元素。下面這張圖有助于您將了解 RC 的工作原理。

為了克服這些問(wèn)題,開(kāi)發(fā)了 Selenium WebDriver。WebDriver更快,因?yàn)樗苯优c瀏覽器交互,并且不需要外部代理服務(wù)器。由于從操作系統(tǒng)級(jí)別控制瀏覽器,因此架構(gòu)也更簡(jiǎn)單。下圖將幫助您了解 WebDriver 的工作方式。

WebDriver 的另一個(gè)好處是它支持在 HTML Unit 驅(qū)動(dòng)程序(無(wú)頭驅(qū)動(dòng)程序)上進(jìn)行測(cè)試。當(dāng)我們說(shuō)無(wú)頭驅(qū)動(dòng)程序時(shí),它是指瀏覽器沒(méi)有 GUI 的事實(shí)。另一方面,RC 不支持 HTML Unit 驅(qū)動(dòng)程序。這些是 WebDriver 比 RC 得分高的原因。
在學(xué)習(xí) Selenium 的概念之前,您應(yīng)該對(duì) Java 或任何其他面向?qū)ο蟮木幊陶Z(yǔ)言有基本的了解。Selenium 支持的語(yǔ)言包括 C#、Java、Perl、PHP、Python 和 Ruby。當(dāng)前,Selenium Webdriver 在 Java 和 C# 中最受歡迎。
現(xiàn)在,讓我們繼續(xù),下一部分學(xué)習(xí)“瀏覽器元素”,我將告訴您這些元素是什么以及如何在這些 Web 元素上進(jìn)行測(cè)試。
什么是瀏覽器元素?
元素是網(wǎng)頁(yè)上存在的不同組件。我們?cè)跒g覽時(shí)注意到的最常見(jiàn)元素是:
文本框
CTA 按鈕
圖像
超鏈接
單選按鈕 / 復(fù)選框
文字區(qū) / 錯(cuò)誤信息
下拉框 / 列表框 / 組合框
Web表格 / HTML表格
框架
測(cè)試這些元素本質(zhì)上意味著我們必須檢查它們是否工作正常,并按照我們希望的方式進(jìn)行響應(yīng)。例如,如果我們正在測(cè)試文本框,您將對(duì)它進(jìn)行什么測(cè)試?
我們是否能夠?qū)⑽谋净驍?shù)字發(fā)送到文本框
我們可以檢索已傳遞到文本框等的文本嗎?
如果我們正在測(cè)試圖像,則可能需要:
下載圖片
上傳圖片
點(diǎn)擊圖片鏈接
檢索圖像標(biāo)題等。
類似地,可以對(duì)前面提到的每個(gè)元素執(zhí)行操作。但是只有將元素放置在網(wǎng)頁(yè)上之后,我們才能執(zhí)行操作并開(kāi)始對(duì)其進(jìn)行測(cè)試,對(duì)嗎? 因此,下一個(gè)主題,我將介紹元素定位器技術(shù)。
定位網(wǎng)頁(yè)上存在的瀏覽器元素
網(wǎng)頁(yè)上的每個(gè)元素都具有屬性。元素可以具有多個(gè)屬性,并且這些屬性中的大多數(shù)對(duì)于不同的元素而言都是唯一的。例如,考慮具有兩個(gè)元素的頁(yè)面:圖像和文本框。 這兩個(gè)元素都有一個(gè)“名稱”屬性和一個(gè)“ ID”屬性。這些屬性值對(duì)于每個(gè)元素都必須是唯一的。 換句話說(shuō),兩個(gè)元素不能具有相同的屬性值。元素的“類名”可以具有相同的值。
在本例中,圖像和文本框既不能具有相同的“ ID”值,也不能具有相同的“名稱”值。但是,頁(yè)面上的一組元素可能有一些共同的屬性。稍后,我將告訴您這些屬性是哪些,但是在此之前,讓我列出我們可以用來(lái)定位元素的 8 個(gè)屬性。 這些屬性是 ID、名稱、類名、標(biāo)簽名、鏈接文本、部分鏈接文本、CSS 和 XPath。
由于元素是使用這些屬性定位的,因此我們將其稱為“定位器”。定位器有:
By.id??語(yǔ)法: driver.findElement(By.id(“xxx”));
By.name??語(yǔ)法: driver.findElement(By.name(“xxx”));
By.className??語(yǔ)法: driver.findElement(By.className(“xxx”));
By.tagName??語(yǔ)法: driver.findElement(By.tagName(“xxx”));
By.linkText??語(yǔ)法: driver.findElement(By.linkText(“xxx”));
By.partialLinkText??語(yǔ)法: driver.findElement(By.partialLinkText(“xxx”));
By.css??語(yǔ)法: driver.findElement(By.css(“xxx”));
By.xpath??語(yǔ)法: driver.findElement(By.xpath(“xxx”));
通過(guò)查看上面的語(yǔ)法,您可能已經(jīng)意識(shí)到定位器是在內(nèi)部調(diào)用的。因此,在進(jìn)行進(jìn)一步操作之前,您需要學(xué)習(xí)可用于對(duì)元素執(zhí)行操作的所有其他方法、瀏覽器命令和功能。
瀏覽器元素上的操作
從現(xiàn)在開(kāi)始,您將獲得很多樂(lè)趣,因?yàn)槔碚摳?、代碼更多。因此,請(qǐng)做好準(zhǔn)備,打開(kāi)Eclipse IDE,并安裝必需的 Selenium 軟件包。
要開(kāi)始測(cè)試網(wǎng)頁(yè),我們需要首先打開(kāi)瀏覽器,然后通過(guò)提供正確的 URL 導(dǎo)航到該網(wǎng)頁(yè)?看看下面的代碼,我在上面復(fù)制了同樣的代碼。Firefox 瀏覽器將首先啟動(dòng),然后將導(dǎo)航到 Facebook 的登錄頁(yè)面。
package seleniumWebDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class WebDriverClass
{
????public static void main(String[] args)
????{
????????System.setProperty("webdriver.gecko.driver", "files/geckodriver.exe");
????????WebDriver driver = new FirefoxDriver();
????????driver.get("https://www.facebook.com/");
????????driver.getTitle();
????????driver.quit();
????}
}
import
org.openqa.selenium.WebDriver;?是一個(gè)庫(kù)包,其中包含啟動(dòng)加載有特定驅(qū)動(dòng)程序的瀏覽器所需的類。
import
org.openqa.selenium.firefox.FirefoxDriver;?是一個(gè)庫(kù)包,其中包含 FirefoxDriver 類,該類是啟動(dòng) FirefoxDriver 作為 WebDriver 類啟動(dòng)的瀏覽器所需的。
System.setProperty(“webdriver.gecko.driver”, “files/geckodriver.exe”); –?該命令通知運(yùn)行時(shí)引擎指定路徑中存在 Gecko 驅(qū)動(dòng)程序。在 Firefox 35 之后,我們需要下載 Gecko 驅(qū)動(dòng)程序以使用 WebDriver。如果要在 Chrome 上進(jìn)行測(cè)試,則必須下載ChromeDriver(這是一個(gè).exe文件),并在此代碼行中指定其路徑。對(duì)于其他瀏覽器,我們也必須這樣做。
WebDriver driver = new FirefoxDriver(); –?此命令用于啟動(dòng)新的 Firefox 驅(qū)動(dòng)程序?qū)ο蟆?/p>
driver.get(“https://www.edureka.co/”); –?這個(gè)方法用于打開(kāi)指定的URL。
driver.getTitle();?–?此命令獲取瀏覽器中當(dāng)前打開(kāi)的選項(xiàng)卡的標(biāo)題。
driver.quit(); –?此命令關(guān)閉瀏覽器驅(qū)動(dòng)程序。
但是,如果您想導(dǎo)航到其他 URL 然后進(jìn)行測(cè)試該怎么辦?在這種情況下,您可以使用下面的代碼片段所示的 navigation.to() 命令。然后,如果您想返回上一頁(yè),則可以通過(guò)使用navigation.back()命令來(lái)完成。 同樣,要刷新當(dāng)前頁(yè)面,可以使用navigation.refresh() 命令。
driver.navigate().to(“https://www.edureka.co/testing-with-selenium-webdriver”);
driver.navigate().refresh();
driver.navigate().back();
如果您想最大化瀏覽器窗口的大小,則可以使用下面的代碼片段來(lái)實(shí)現(xiàn)。
driver.manage().window().maximize();
如果要為瀏覽器窗口設(shè)置自定義尺寸,則可以設(shè)置自己的尺寸,如下面的代碼片段所示。
Dimension d = new Dimension(420,600);
driver.manage().window().setSize(d);
現(xiàn)在您已經(jīng)了解了大多數(shù)基本知識(shí),我們進(jìn)入下一個(gè)主題。讓我們嘗試在網(wǎng)頁(yè)上找到一個(gè)元素,然后執(zhí)行所有可能的操作。
我很確定,你們所有人都有 Facebook 帳戶。因此,讓我向您展示如何繞過(guò)代碼本身的憑據(jù)登錄 Facebook。
登錄頁(yè)面中有兩個(gè)文本字段,一個(gè)用于電子郵件 / 電話,另一個(gè)用于密碼。我們必須找到這兩個(gè)元素,將憑據(jù)傳遞給這些元素,然后找到第三個(gè)元素:需要單擊的“登錄”按鈕。
請(qǐng)看下面的截圖。這是?Facebook?登錄頁(yè)面的屏幕截圖。

如果您檢查(Ctlr + Shift + i)此頁(yè)面,則將在瀏覽器中看到相同的窗口。然后,在“元素”下,將顯示頁(yè)面上存在的所有元素及其屬性的列表。上面的屏幕快照中突出顯示了三個(gè)部分。第一個(gè)突出顯示的元素是電子郵件文本字段,第二個(gè)是密碼文本字段,第三個(gè)是“登錄”按鈕。
如果您還記得,我在前面提到過(guò)可以使用元素定位器技術(shù)來(lái)定位這些元素。 讓我們用它來(lái)定位這些元素并發(fā)送字段值。
這是查找元素的語(yǔ)法:driver.findElement(By.id(“xxx”));
為了發(fā)送它的值,我們可以使用方法?sendKeys(“credentials“);
要單擊按鈕,我們必須使用?click();
那么,讓我們開(kāi)始尋找元素并對(duì)其進(jìn)行操作。其代碼在下面的代碼片段中。
driver.findElement(By.name("email")).sendKeys("xxx@gmail.com");
driver.findElement(By.name("pass")).sendKeys("xxxxxx");
driver.findElement(By.id("u_0_q")).click();
在第 1 行中,我們通過(guò)其唯一的“名稱”屬性來(lái)標(biāo)識(shí) Email 元素,并將其發(fā)送給 EmailID。
在第 2 行中,我們通過(guò)其唯一的“名稱”屬性來(lái)標(biāo)識(shí) Password 元素,并將其發(fā)送給密碼。
在第 3 行中,我們通過(guò)其唯一 ID 找到“登錄”按鈕元素,然后單擊該按鈕。
僅添加這些代碼行可能還不夠。那是因?yàn)轫?yè)面的動(dòng)態(tài),它可能不會(huì)立即響應(yīng),并且在頁(yè)面加載時(shí),WebDriver 將終止并引發(fā)超時(shí)異常錯(cuò)誤。此問(wèn)題可能很快就不會(huì)在 Facebook 頁(yè)面上發(fā)生,但很可能會(huì)在其他任何電子商務(wù)網(wǎng)站和其他動(dòng)態(tài)網(wǎng)站上發(fā)生。
為了克服這個(gè)問(wèn)題,我們需要使用一種先進(jìn)的技術(shù)。我們需要請(qǐng)求我們的 WebDriver 在頁(yè)面被訪問(wèn)并且頁(yè)面完全加載之后等待,我們需要找到元素然后執(zhí)行操作。
如果你想讓你的 WebDriver 等待,直到所有元素加載到網(wǎng)頁(yè)中,然后關(guān)閉瀏覽器,那么我們可以使用?driver.wait()?方法或?Threads.sleep()?方法來(lái)實(shí)現(xiàn)。但是,如果您正在編寫更高級(jí)的代碼,那么您應(yīng)該使用隱式等待或顯式等待。但是對(duì)于我們的情況,下面的命令就足夠了。
driver.wait(5000);
// or use this:-Thread.sleep(5000);
但是,在使用等待條件時(shí),請(qǐng)記住導(dǎo)入該庫(kù):
import java.util.concurrent.TimeUnit;
我們這樣做是因?yàn)椋却惣捌湎嚓P(guān)方法將出現(xiàn)在此庫(kù)中。
下面是我所解釋代碼的完整代碼片段。
package seleniumWebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.util.concurrent.TimeUnit;
public class WebDriverClass
{
????public static void main(String[] args)
????{
????????System.setProperty("webdriver.gecko.driver", "files/geckodriver.exe");
????????WebDriver driver = new FirefoxDriver();
????????driver.get("https://www.facebook.com/");
????????driver.manage().window().maximize();
????????driver.getTitle();
????????driver.navigate().to(“https://www.edureka.co/testing-with-selenium-webdriver”);
? ? ? ? driver.navigate().back();
????????driver.navigate().refresh();
????????driver.wait(5000);
????????// or use
????????// Thread.sleep(5000);
????????driver.findElement(By.name("email")).sendKeys("xxx@gmail.com");
????????driver.findElement(By.name("pass")).sendKeys("xxxxxx");
????????driver.findElement(By.id("u_0_q")).click();
????????driver.quit();
????}
}
當(dāng)您用實(shí)際的電子郵件和密碼替換憑據(jù)并執(zhí)行此代碼時(shí),F(xiàn)acebook 將在新窗口中打開(kāi),輸入您的憑據(jù)并登錄到您的帳戶。
瞧! 您已成功登錄,這意味著您的完整代碼已完全執(zhí)行。
我使用了 ID 和 Name 屬性來(lái)定位元素。實(shí)際上,您可以使用任何其他定位器來(lái)查找元素。XPath?是最有用和最重要的定位器技術(shù)。但是,只要您甚至可以找到其中一個(gè)屬性并將其用于定位元素,就可以了。
Selenium WebDriver教程的評(píng)論 (共 條)
