1. 程式人生 > >Selenium2.0之WebDriver

Selenium2.0之WebDriver

1、什麼情況下選用WebDriver?
(1)Selenium-1.0不支援的瀏覽器功能。
(2)multiple frames, multiple browser windows, popups, and alerts.
(3)頁面導航。
(4)下拉。
(5)基於AJAX的UI元素。

2、WebDriver的幾個實現:
Name of driver              Available on which OS?      Class to instantiate
HtmlUnit Driver             All                         org.openqa.selenium.htmlunit.HtmlUnitDriver
Firefox Driver              All                         org.openqa.selenium.firefox.FirefoxDriver
Internet Explorer Driver    Windows                     org.openqa.selenium.ie.InternetExplorerDriver
Chrome Driver               All                         org.openqa.selenium.chrome.ChromeDriver

(1)HtmlUnit Driver是純java的驅動器,全部在記憶體中執行,不會實際開啟瀏覽器,但其速度很快。
(2)Firefox Driver:速度慢。

3、WebDriver常用的函式介面(以HtmlUnitDriver為例)
WebDriver driver = new HtmlUnitDriver();
(1)頁面導航:
driver.get( "http://www.google.com" ); 完全裝載頁面後將控制返回給測試指令碼。
注意:當頁面又很多AJAX呼叫時,該介面無法確認頁面是否完全裝載,這是需要使用"waits"。
(2)與頁面互動
例如:<input type= "text" name= "passwd" id= "passwd-id" />
WebElement element;
element = driver.findElement(By.id( "passwd-id" ));
element = driver.findElement(By.name( "passwd" ));
element = driver.findElement(By.xpath( "//input[@id=’passwd-id’]" ));
(XPATH返回第一個匹配到的元素,如果沒有匹配到,丟擲NoSuchElementException)
element.sendKeys( "some text" );
element.sendKeys( " and some" , Keys.ARROW_DOWN); (按向下箭頭)
(任何頁面元素都可以呼叫sendKeys,例如可以測試一些快捷方式鍵,鍵盤的每次輸入都是附加在文字串的後面)
element.clear(); 清除文字域內容

4、填寫表單
(1)處理SELECT標籤:
WebElement select = driver.findElement(By.xpath( "//select" ));
List<WebElement> allOptions = select.findElements(By.tagName( "option" ));
for (WebElement option : allOptions) {
System.out.println(String.format( "Value is: %s" , option.getValue()));
option.setSelected();
}
(2)使用Select類處理SELECT標籤:
Select select = new Select(driver.findElement(By.xpath( "//select" )));
select.deselectAll();
select.selectByVisibleText( "Edam" );

5、提交:
(1)driver.findElement(By.id( "submit" )).click();
(2)element.submit();(要求element必須在表單中,否則丟擲NoSuchElementException)

6、檢查元素是否在頁面上(並且可以獲取元素的尺寸和位置,拖拉元素):
WebElement plain = driver.findElement(By.name( "q" ));
RenderedWebElement element = (RenderedWebElement) element;(例如HtmlUnit Driver就無法顯示出內容)

對元素拖拉:
RenderedWebElement element = (RenderedWebElement) driver.findElement(By.name( "source" ));
RenderedWebElement target = (RenderedWebElement) driver.findElement(By.name( "target" ));
element.dragAndDropOn(target);

7、在視窗和frame之間移動
(1)在命名的視窗之間移動:switchTo
driver.switchTo().window( "windowName" ); (可以通過js或者開啟視窗的連結獲取視窗名稱)
(2)也可通過視窗控制代碼切換:
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
}
(3)frame之間切換或者切換到iframe:
driver.switchTo().frame( "frameName" );
通過索引訪問subframe:
driver.switchTo().frame( "frameName.0.child" );(frameName的第一個subframe的明價child的frame)

8、彈出對話方塊:
視窗彈出後,可以使用如下語句訪問到彈出視窗:
Alert alert = driver.switchTo().alert();
獲取到alert視窗後,可進行各種操作。

9、頁面導航:
navigate().to()和get()功能完全一樣。
driver.navigate().to( "http://www.example.com" );

瀏覽器的前進和後退
driver.navigate().forward();
driver.navigate().back();
(注意這兩個方法取決於瀏覽器的實現,可以會出現某些呼叫失敗)


10、Cookies(必須首先在目標url域上)
// Go to the correct domain
driver.get( "http://www.example.com" );
// Now set the cookie. This one’s valid for the entire domain
Cookie cookie = new Cookie( "key" , "value" );
driver.manage().addCookie(cookie);
// And now output all the available cookies for the current URL
Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
System.out.println(String.format( "%s -> %s" , loadedCookie.getName(), loadedCookie.getValue()));
}

12、WebDriver支援的瀏覽器不如Selenium RC多:
為了支援更多的瀏覽器並且使用WebDriver API,可以使用SeleneseCommandExecutor
Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName( "safari" );
CommandExecutor executor = new SeleneseCommandExecutor( "http:localhost:4444/" , "http://WebDriver driver = new RemoteWebDriver(executor, capabilities);

這種方法的限制條件:目前findElements方法不能使用,並且首先js沙盒。

本文轉自:http://katrina-lxd.blog.sohu.com/167646699.html