轉自Selenium WebDriver
注意:本章內容官方團隊正在完善中。
介紹 WebDriver###
Selenium 2.0 最主要的一個新特性就是集成了 WebDriver API。WebDriver 提供更精簡的編程幾口,以解決 Selenium-RC API 中的一些限制。WebDriver 為那些頁面元素可以不通過頁面重新加載來更新的動態網頁提供了更好的支持。WebDriver 的目標是提供一套精心設計的面向對象的 API 來更好的支持現代高級 web 應用的測試工作。
同 Selenium-RC 相比,WebDriver 如何驅動瀏覽器的?###
Selenium-WebDriver 直接通過瀏覽器自動化的本地接口來調用瀏覽器。如何直接調用,和調用的細節取決于你使用什么瀏覽器。本章后續的內容介紹了每個 “browser driver” 的詳細信息。
相比 Selenium-RC ,WebDriver 確實非常不一樣。Selenium-RC 在所有支持的瀏覽器中工作原理是一樣的。它將 JavaScript 在瀏覽器加載的時候注入瀏覽器,然后使用這些 JavaScript 驅動 AUT 運行 WebDriver 使用的是不同的技術,再一次強調,它是直接調用瀏覽器自動化的本地接口。
WebDriver 和 Selenium-Server###
你可能需要,也可能不需要 Selenium Server,取決于你打算如何使用 Selenium-WebDriver。如果你僅僅需要使用 WebDriver API,那就不需要 Selenium-Server。如果你所有的測試和瀏覽器都在一臺機器上,那么你僅需要 WebDriver API。WebDriver 將直接操作瀏覽器。
在有些情況下,你需要使用 Selenium-Server 來配合 Selenium-WebDriver 工作,例如:
- 你使用 Selenium-Grid 來分發你的測試給多個機器或者虛擬機。
- 你希望連接一臺遠程的機器來測試一個特定的瀏覽器。
- 你沒有使用 Java 綁定(例如 Python, C#, 或 Ruby),并且可能希望使用 HtmlUnit Driver。
設置一個 Selenium-WebDriver 項目###
安裝 Selenium 意味著當你創建一個項目,你可以在項目中使用 Selenium 開發。具體怎么做取決于你的項目語言和開發環境。
Java
創建一個 Selenium 2.0 Java 項目最簡單的方式是使用 maven。Maven 將下載 Java 綁定(Selenium 2.0 的 Java 客戶端)和其所有依賴,并且通過 pom.xml(mvn項目配置)為你創建項目。當你完成這些操作的時候,你可以將 maven 項目導入到你偏好的 IDE 中,例如 IntelliJ IDEA 或 Eclipse。
首先,創建一個用于放置項目的文件夾。然后,在這個文件夾中創建 pom.xml 文件,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MySel20Proj</groupId>
<artifactId>MySel20Proj</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.28.0</version>
</dependency>
<dependency>
<groupId>com.opera</groupId>
<artifactId>operadriver</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.opera</groupId>
<artifactId>operadriver</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
</project>
確保你指定了最新版本。在編寫本文檔時,范例代碼中的即為最新版本。但是,稍后 Selenium 2.0 還會不斷有新發布。檢查Maven 下載頁面 中的最新版本,并修改上述文件中依賴的版本。
命令行進入本目錄,運行如下命令:
mvn clean install
該命令會下載 Selenium 和其所有依賴,并添加到這個項目中。
最后,將項目導入到你的 IDE。對于不太熟悉 IDE 的用戶,我們提供了附件來說明相關內容。
Importing a maven project into IntelliJ IDEA
Importing a maven project into Eclipse
[
從 Selenium 1.0 遷移###
對于那些已經使用 Selenium 1.0 編寫測試套件的用戶,我們提供了一些遷移的建議。Selenium 2.0 的核心工程師 Simon Stewart 寫了一篇關于從 Selenium 1.0 遷移的文章,包含在本文的附件中。
Migrating From Selenium RC to Selenium WebDriver
[
實例介紹 Selenium-WebDriver API###
WebDriver 是一個進行 web 應用測試自動化的工具,主要用于驗證它們的行為是否符合期望。WebDriver 的目標是提供一套易于掌握的 API,且比 Selenium-RC (1.0) 更易于使用,頁能是你的測試更具可讀性和維護性。它沒有同任何特定的測試框架進行綁定,所以可以在單元測試或者是 main 方法中工作良好。本小節介紹 WebDriver API,并且幫助你熟悉它。如果你還沒有任何 WebDriver 項目,請按照上一小節的介紹新建一個。
建好項目后,你可以發現 WebDriver 和任何普通的庫一樣:它是自包含的,通常不需要進行任何額外的處理或者運行安裝。這一點和 Selenium-RC 的代理服務器是不一樣的。
注意: 使用 Chrome Driver、 Opera Driver、Android Driver 和 iPhone Driver 是需要一些額外操作的。
我們準備了一個簡單的例子:在 Google 上搜索 “Cheese”,然偶輸出搜索結果頁的頁面標題到 console。
package org.openqa.selenium.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Selenium2Example {
public static void main(String[] args) {
// 創建了一個 Firefox driver 的實例
// 注意,其余的代碼依賴于接口而非實例
WebDriver driver = new FirefoxDriver();
// 使用它訪問 Google
driver.get("http://www.google.com");
// 同樣的事情也可以通過以下代碼完成
// driver.navigate().to("http://www.google.com");
// 找到搜索輸入框
WebElement element = driver.findElement(By.name("q"));
// 輸入要查找的詞
element.sendKeys("Cheese!");
// 提交表單
element.submit();
// 檢查頁面標題
System.out.println("Page title is: " + driver.getTitle());
// Google 搜索結果由 JavaScript 動態渲染
// 等待頁面加載完畢,超時時間設為10秒
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});
//應該能看到: "cheese! - Google Search"
System.out.println("Page title is: " + driver.getTitle());
//關閉瀏覽器
driver.quit();
}
}
在接下來的章節中,你將學習到更多使用 WebDriver 的知識,例如根據瀏覽器歷史記錄前進和后退,如何測試 frames 和 windows。針對這些點我們提供了全面的討論和范例。
Selenium-WebDriver API 和操作###
獲取一個頁面####
訪問一個頁面或許是使用 WebDriver 時你第一件想要做的事情。最常見的是調用 “get” 方法:
driver.get("http://www.google.com");
包括操作系統和瀏覽器在內的多種因素影響,WebDriver 可能會也可能不會等待頁面加載。在某些情況下,WebDriver可能在頁面加載完畢前就返回控制了,甚至是開始加載之前。為了確保健壯性,你需要使用 Explicit and Implicit Waits 等到頁面元素可用。
查找 UI 元素(web 元素)####
WebDriver 實例可以查找 UI 元素。每種語言實現都暴露了 “查找單個元素” 和 “查找所有元素” 的方法。第一個方法如果找到則返回該元素,如果沒找到則拋出異常。第二種如果找到則返回一個包含所有元素的列表,如果沒找到則返回一個空數組。
“查找” 方法使用了一個定位器或者一個叫 “By” 的查詢對象。“By” 支持的元素查找策略如下:
By id
這是最高效也是首選的方法用于查找一個元素。UI 開發人員常犯的錯誤是,要么沒有指定 id,要么自動生成隨機 id,這兩種情況都應避免。及時是使用 class 也比使用自動生成隨機 id 要好的多。
HTML:
<div id="coolestWidgetEvah">...</div>
Java:
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
By Class Name
"class" 是 DOM 元素上的一個屬性。在實踐中,通常是多個 DOM 元素有同樣的 class 名,所以通常用它來查找多個元素。
HTML:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
Java:
List<WebElement> cheeses = driver.findElements(By.className("cheese"));
By Tag Name
根據元素標簽名查找。
HTML:
<iframe src="..."></iframe>
Java:
WebElement frame = driver.findElement(By.tagName("iframe"));
By Name
查找 name 屬性匹配的表單元素。
HTML:
<input name="cheese" type="text"/>
Java:
WebElement cheese = driver.findElement(By.name("cheese"));
By Link Text
查找鏈接文字匹配的鏈接元素。
HTML:
<a >cheese</a>>
Java:
WebElement cheese = driver.findElement(By.linkText("cheese"));
By Partial Link Text
查找鏈接文字部分匹配的鏈接元素。
HTML:
<a >search for cheese</a>>
Java:
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
By CSS
正如名字所表明的,它通過 css 來定位元素。默認使用瀏覽器本地支持的選擇器,可參考 w3c 的 css 選擇器。如果瀏覽器默認不支持 css 查詢,則使用 Sizzle。ie6、7 和 ff3.0 都使用了 Sizzle。
注意使用 css 選擇器不能保證在所有瀏覽器里都表現一樣,有些在某些瀏覽器里工作良好,在另一些瀏覽器里可能無法工作。
HTML:
<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
Java:
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
By XPATH
此處略過不譯
用戶輸入 - 填充表單####
我們已經了解了怎么在輸入框或者文本框中輸入文字,但是如何操作其他的表單元素呢?你可以切換多選框的選中狀態,你可以通過“點擊”以選中一個 select 的選項。操作 select 元素不是一件很難的事情:
WebElement select = driver.findElement(By.tagName("select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
System.out.println(String.format("Value is: %s", option.getAttribute("value")));
option.click();
}
上述代碼將找到頁面中第一個 select 元素,然后遍歷其中的每個 option,打印其值,再依次進行點擊操作以選中這個 option。這并不是處理 select 元素最高效的方式。WebDriver 有一個叫 “Select” 的類,這個類提供了很多有用的方法用于 select 元素進行交互。
Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");```
上述代碼取消頁面上第一個 select 元素的所有 option 的選中狀態,然后選中字面值為 “Edam” 的 option。
如果你已經完成表單填充,你可能希望提交它,你只要找到 “submit” 按鈕然后點擊它即可。
`driver.findElement(By.id("submit")).click();`
或者,你可以調用 WebDriver 為每個元素提供的 “submit” 方法。如果你對一個 form 元素調用該方法,WebDriver 將調用這個 form 的 submit 方法。如果這個元素不是一個 form,將拋出一個異常。
`element.submit();`
####在窗口和幀(frames)之間切換####
有些 web 應用含有多個幀或者窗口。WebDriver 支持通過使用 “switchTo” 方法在多個幀或者窗口之間切換。
`driver.switchTo().window("windowName");`
所有 dirver 上的方法調用均被解析為指向這個特定的窗口。但是我們如何知道這個窗口的名字?來看一個打開窗口的鏈接:
`<a href="somewhere.html" target="windowName">Click here to open a new window</a>`
你可以將 “window handle” 傳遞給 “switchTo().window()” 方法。因此,你可以通過如下方法遍歷所有打開的窗口:
`for (String handle : driver.getWindowHandles()) { driver.switchTo().window(handle); }`
你也可以切換到指定幀:
`driver.switchTo().frame("frameName");`
你可以通過點分隔符來訪問子幀,也可以通過索引號指定它,例如:
`driver.switchTo().frame("frameName.0.child");`
該方法將查找到名為 “frameName” 的幀的第一個子幀的名為 “child” 的子幀。所有幀的計算都會從 **top** 開始。
####彈出框####
由 Selenium 2.0 beta 1 開始,就內置了對彈出框的處理。如果你觸發了一個彈出框,你可以通過如下方訪問到它:
`Alert alert = driver.switchTo().alert();`
該方法將返回目前被打開的彈出框。通過這個返回對象,你可以訪問、關閉、讀取它的內容甚至在 prompt 中輸入一些內容。這個接口可以勝任 alerts,comfirms 和 prompts 的處理。
####導航:歷史記錄和位置####
更早的時候,我們通過 “get” 方法來訪問一個頁面 (driver.get("[http://www.example.com"))。正如你所見,WebDriver](http://www.example.com%22%29%29.xn--%2Cwebdriver-cl5px68gk0xsl2a2g9g/) 有一些更小巧的、聚焦任務的接口,而 navigation 就是其中一個非常有用的任務。因為加載頁面是一個非常基本的需求,實現該功能的方法取決于 WebDriver 暴露的接口。它等同于如下代碼:
`driver.navigate().to("http://www.example.com");`
重申一下: “navigate().to()” 和 “get()” 做的事情是完全一樣的。只是前者更易用。
“navigate” 接口暴露了訪問瀏覽器歷史記錄的接口:
`driver.navigate().forward();
driver.navigate().back();`
需要注意的是,該功能的表現完全依賴于你所使用的瀏覽器。如果你習慣了一種瀏覽器,那么在另一種瀏覽器中使用它時,完全可能發生一些意外的事情。
####Cookies####
在我們繼續介紹更多內容之前,還有必要介紹一下如何操作 cookie。首先,你必須在 cookie 所在的域。如果你希望在加載一個大頁面之前重設 cookie,你可以先訪問站點中一個較小的頁面,典型的是 404 頁面 ([http://example.com/some404page)。](http://example.com/some404page)%E3%80%82)
// 進到正確的域
driver.get("http://www.example.com");
// 設置 cookie,這個cookie 對整個域都有效
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);
// 輸出當前 url 所有可用的 cookie
Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}
// 你可以通過3中方式刪除 cookie
// By name
driver.manage().deleteCookieNamed("CookieName");
// By Cookie
driver.manage().deleteCookie(loadedCookie);
// Or all of them
driver.manage().deleteAllCookies();
####改變 UA####
當使用 Firefox Driver 的時候這很容易:
`
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);`
####拖拽####
以下代碼演示了如何使用 “Actions” 類來實現拖拽。瀏覽器本地方法必須要啟用:
WebElement element = driver.findElement(By.name("source"));WebElement target = driver.findElement(By.name("target"));(new Actions(driver)).dragAndDrop(element, target).perform();
####Driver 特性和權衡####
###Selenium-WebDriver’s Drivers###
WebDriver 是編寫測試時需要用到的方法的主要接口,這套接口有幾套實現。包括:
####HtmlUnit Driver####
這是目前 WebDriver 最快速最輕量的實現。顧名思義,它是基于 HtmlUnit 的。HtmlUnit 是一個由 Java 實現的沒有 GUI 的瀏覽器。任何非 Java 的語言綁定, Selenium Server 都需要使用這個 driver。
**使用**
`WebDriver driver = new HtmlUnitDriver();`
**優勢**
- WebDriver 最快速的實現
- 純 Java 實現,跨平臺
- 支持 JavaScript
**劣勢**
需要模擬瀏覽器中 JavaScript 的行為(如下)。
**JavaScript in the HtmlUnit Driver**
沒有任何一個主流瀏覽器支持 HtmlUnit 使用的 JavaScript 引擎(Rhino)。如果你使用 HtmlUnit,測試結果可能和真實在瀏覽器中跑的很不一樣。
當我們說到 “JavaScript” 時通常是指 “JavaScript 和 DOM”。雖然 DOM 由 W3C 組織定義,但是每個瀏覽器在 DOM 和 JavaScript 的交互的實現方面都有一些怪異和不同的地方。HtmlUnit 完全實現了 DOM 規范,并且對 JavaScript 提供了良好的支持,但它的實現和真實的瀏覽器都不一樣:雖然它模擬了瀏覽器中的實現,但既不同于 W3C 指定的標準,也不同于其他主流瀏覽器的實現。
使用 WebDriver,我們需要做出選擇:如果我們啟用 HtmlUnit 的 JavaScript 支持,團隊可能會遇到只有在這中情況下才會遇到的問題;如果我們禁用 JavaScript,但實際上越來越多的網站都依賴于 JavaScript。我們使用了最保守的方式,默認禁用 JavaScript 支持。對于 WebDriver 和 HtmlUnit 的每個發布版本,我們都會再次評估:這個版本是否可以默認開啟 JavaScript 支持。
**啟用 JavaScript**
啟用 JavaScript 也非常簡單:
HtmlUnitDriver driver = new HtmlUnitDriver(true);
上述代碼會使得 HtmlUnit Driver 模擬 Firefox3.6 對 JavaScript 的處理。
####Firefox Driver####
我們通過一個 Firefox 的插件來控制 Firefox 瀏覽器。使用的配置文件是從默認安裝的版本精簡成只包含 Selenium WebDriver.xpi (插件) 的版本。我們還修改了一些默認配置([see the source to see which ones](http://code.google.com/p/selenium/source/browse/trunk/java/client/src/org/openqa/selenium/firefox/FirefoxProfile.java#55)),使得 Firefox Driver 可以運行和測試在 Windows、Mac、Linux 上。
**使用**
`WebDriver driver = new FirefoxDriver();`
**優勢**
在真實的瀏覽器里運行,且支持 JavaScript
比 IE Driver 快
**劣勢**
- 比 HtmlUnit Driver 慢
- 需要修改 Firefox 配置
例如你想修改 UA,但是你得到的是一個假的包含很多擴展的配置文件。這里有兩種方式可以拿到真是的配置,假定配置文件是由 Firefox 配置管理器生成的:
ProfilesIni allProfiles = new ProfilesIni();
FirefoxProfile profile = allProfiles.getProfile("WebDriver");
profile.setPreferences("foo.bar", 23);
WebDriver driver = new FirefoxDriver(profile);
如果配置文件沒有注冊至 Firefox:
File profileDir = new File("path/to/top/level/of/profile");
FirefoxProfile profile = new FirefoxProfile(profileDir);
profile.addAdditionalPreferences(extraPrefs);
WebDriver driver = new FirefoxDriver(profile);
當我們開發 Firefox Driver 的特性時,需要評估它們是否可用。例如,直到我們認為本地方法在 Linux 的 Firefox 上是穩定的了,否則我們會默認禁用它。如需開啟:
FirefoxProfile profile = new FirefoxProfile();
profile.setEnableNativeEvents(true);
WebDriver driver = new FirefoxDriver(profile);
**信息**
查看 [Firefox section in the wiki page](http://code.google.com/p/selenium/wiki/FirefoxDriver) 以獲得更多新鮮信息。
####Internet Explorer Driver####
這個 driver 由一個 .dll 文件控制,并且只在 windows 系統中可用。每個 Selenium 的發布版本都包含可用于測試的核心功能,兼容 XP 上的 ie6、7、8 和 Windows7 上的 ie9。
**使用**
WebDriver driver = new InternetExplorerDriver();
**優勢**
運行在真實的瀏覽器中,并且支持 JavaScript,包括最終用戶會碰到的一些怪異的問題。
**劣勢**
- 顯然它只在 Windows 系統上有效。
- 相對較慢。
- Xpath 在很多版本中都是非原生支持。Sizzle 會注入到瀏覽器,這使得它比其他瀏覽器要慢很多,也比在相同的瀏覽器中使用 CSS 選擇器要慢。
- IE 6、7 不支持 CSS 選擇器,由 Sizzle 注入替代。
- IE 8、9 雖然原生支持 CSS 選擇器,但它們不完全支持 CSS3.
**信息**
訪問 [Internet Explorer section of the wiki page](http://code.google.com/p/selenium/wiki/InternetExplorerDriver) 以獲得更多新鮮信息。特別注意配置部分的內容。
####Chrome Driver####
Chrome Driver 由 Chromium 項目團隊自己維護和支持。WebDriver 通過 chromedriver 二進制包(可以在 chromiun 的下載頁面找到)來工作。你需要確保同時安裝了某版本的 chrome 瀏覽器和 chromedriver。chromedriver 需要存放在某個指定的路徑下使得 WebDriver 可以自動發現它。chromedriver 可以發現安裝在默認路徑下的 chrome 瀏覽器。這些都可以被環境變量覆蓋。請查看 [wiki](http://code.google.com/p/selenium/wiki/ChromeDriver) 以獲得更多信息。
**使用**
WebDriver driver = new ChromeDriver();
**優勢**
- 運行在真實的瀏覽器中,并且支持 JavaScript。
- 由于 chorme 是一個 webkit 內核的瀏覽器,Chrome Driver 能讓你的站點在 Safari 中運行。注意自從 Chrome 使用了自己的 Javascript 引擎 V8 以后(之前是 Safari 的 Nitro 引擎),Javascript 的執行可能會一點不一樣。
**劣勢**
比 HtmlUnit 慢
**信息**
查看 [wiki](http://code.google.com/p/selenium/wiki/ChromeDriver) 以獲得更多最新信息。更多信息可以在 [下載頁面](http://seleniumhq.org/download/) 找到。
**運行 Chrome Driver**
下載 [Chrome Driver](http://code.google.com/p/chromium/downloads/list) 并參考 [wiki](http://code.google.com/p/selenium/wiki/ChromeDriver) 上的其他建議。
####Opera Driver####
查看 [wiki](http://code.google.com/p/selenium/wiki/OperaDriver)
####iPhone Driver####
查看 [wiki](http://code.google.com/p/selenium/wiki/IPhoneDriver)
####Android Driver####
查看 [wiki](http://code.google.com/p/selenium/wiki/AndroidDriver)
###可選擇的后端:混合 WebDriver 和 RC 技術###
####WebDriver-Backed Selenium-RC####
Java 版本的 WebDriver 提供了一套 Selenium-RC API 的實現。這意味著你可以使用 WebDriver 技術底層的 Selenium-RC API。這從根本上提供了向后兼容。這使得那些使用了 Selenium-RC API 的測試套件可以使用 WebDriver。這緩和了到 WebDriver 的遷移成本。同時,也允許你在同一個測試中使用兩者的 API。
Selenium-WebDriver 的用法如下:
// 你可以使用任何 WebDriver 的實現,這里以 Firefox 的為例。
WebDriver driver = new FirefoxDriver();
// 基準 url,selenium 用于解析相對路徑。
String baseUrl = "http://www.google.com";
// 創建一個 Selenium 實現。
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
// 使用 selenium 進行一些操作。
selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");
// Get the underlying WebDriver implementation back. This will refer to the
// same WebDriver instance as the "driver" variable above.
WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver();
// 最后,通過調用 WebDriverBackedSelenium 實例的 stop 方法關閉瀏覽器。
// 應該避免使用 quit 方法,因為這樣,在瀏覽器關閉后 jvm 還會繼續運行。
selenium.stop();
**優勢**
- 允許 WebDriver 和 Selenium API 并存。
- 提供了簡單的機制從 Selenium RC API 遷移至 WebDriver。
- 不需要運行 Selenium RC server。
**劣勢**
- 沒有實現所有的方法。
- 一些高級用法可能無效(例如 Selenium Core 中的 “browserbot” 或其他內置的 js 方法)。
- 由于底層的實現,有些方法會比較慢。
####Backing WebDriver with Selenium####
WebDriver 支持的瀏覽器數量沒有 Selenium RC 多,所以如果希望使用 WebDriver 時獲得更多的瀏覽器支持,你可以使用 SeleneseCommandExecutor。
通過下面的代碼,WebDriver 可以支持 safari(確保禁用彈出層):
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setBrowserName("safari");
CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"), new URL("http://www.google.com/"), capabilities);
WebDriver driver = new RemoteWebDriver(executor, capabilities);
這種方案有一些明顯的限制,特別是 findElements 不會如預期工作。同時,我們使用了 Selenium Core 來驅動瀏覽器,所以你也會受到 JavaScript 的沙箱限制。
###運行 Selenium Server 以使用 RemoteDrivers?###
從 [Selenium 下載頁面](https://code.google.com/p/selenium/downloads/list) 下載 selenium-server-standalone-.jar,你也可以選擇下載 IEDriverServer。如果你需要測試 chrome,則從 [google code](http://chromedriver.googlecode.com/) 下載它。
把 IEDriverServer 和 chromedriver 解壓到某個路徑,并確保這個路徑在 $PATH / %PATH% 中,這樣 Selenium Server 就可以不需要任何設置就能操作 IE 和 chrome。
從命令行啟動服務:
`java -jar <path_to>/selenium-server-standalone-<version>.jar`
如果你希望使用本地事件功能,在命令行添加以下參數:
`-Dwebdriver.enable.native.events=1`
查看幫助:
`java -jar <path_to>/selenium-server-standalone-<version>.jar -help`
為了運轉正常,以下端口應該允許 TCP 請求鏈接:4444, 7054-5(或兩倍于你計劃并發運行的實例數量)。在 Windows 中,你可能需要 unblock 這個應用。
###更多資源###
你可以在 [WebDriver wiki](http://code.google.com/p/selenium/wiki/FurtherResources) 找到更多有用的資源。
當然,你可以在互聯網上搜索到更多 Selenium 的話題,包括 Selenium-WebDriver’s drivers。有不少博客和眾多論壇的帖子談及到 Selenium。另外,Selenium 用戶群組也是很重要的資源:[http://groups.google.com/group/selenium-users。](http://groups.google.com/group/selenium-users%E3%80%82)
###接下來###
本章節簡要地從較高的層面介紹了 WebDriver 和其可信功能。一旦你熟悉了 Selenium WebDriver API 你可能會想要學習如何創建一個易于維護、可擴展的測試套件,并且提高哪些特性頻繁修改的 AUT 的健壯性。大多數 Selenium 專家推薦的一種方式是:使用頁面對象設計模式(可能是一個頁面工廠)來設計你的測試代碼。 Selenium WebDriver 在 Java 和 C sharp 中通過一個 PageFactory 類提供了這項支持。它同其他高級話題一樣,將在下一章節討論。同時,對于此項技術的較高層次的描述,你可以希望查看“測試設計考慮”章節。這兩個章節都描述了如何通過模塊化的思想使你的測試代碼更易于維護。