Selenium用戶指南 - 第四章 Selenium 2.0和WebDriver[3]

目錄    上一頁    下一頁

命令和操作

存取一個頁面

  可能你想使用WebDriver做的第一件事情是導航到一個頁面。要做到這點的普通方法是通過調用“get”。

driver.get("http://www.google.com");

取決於幾個因素,包括OS/瀏覽器的組合,WebDriver可能或可能不會等待頁面被裝載。在某些情況下,WebDriver可能返回控制,先於頁面完成,或甚至啓動和裝載。爲了確保健壯性,你需要使用顯式或隱含地等待,以等待元素存在頁面上。

定位UI元素(Web元素)

用WebDriver定位元素可以使用WebDriver實例本身,或者在一個WebElement上。每一種語言綁定都暴露了一個“查找單個元素”和“查找多個元素”方法。第一個返回一個WebElement對象,否則將拋出一個異常。後一個返回一個WebElement列表,它可能返回一個空列表,如果沒有DOM元素匹配這個查詢。

“查找”方法帶有一個定位器或稱之爲“By”的查詢對象。“By”策略列表如下:

按id查找

這是定位一個元素最有效和首選的方法。UI開發者製造的常見陷阱是在頁面上沒有唯一的id或自動生成的id,兩者都應該避免。在一個html元素上的class屬性,比自動生成的id屬性更適當。

下面是如何找到一個看起來像這樣的元素的示例:

<div id="coolestWidgetEvah">...</div>
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));

按類(class)名稱查找

此處的“Class”意指DOM元素的class屬性。時常在實際使用中,有許多DOM元素帶有相同的class,因此查找多個元素比查找第一個元素成爲更實際的選項。

如何查找一個看起來像這樣的元素的示例:

<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
List<WebElement> cheeses = driver.findElements(By.className("cheese"));

按標記(tag)名稱查找

元素的DOM標記名稱

如何查找一個看起來像這樣的元素的示例:

<iframe src="..."></iframe>
WebElement frame = driver.findElement(By.tagName("iframe"));

按名稱(name)查找

用匹配的name屬性找到輸入元素

如何查找一個看起來像這樣的元素的示例:

<input name="cheese" type="text"/>
WebElement cheese = driver.findElement(By.name("cheese"));

按鏈接文本查找

用可見的文本查找超鏈接元素

如何查找一個看起來像這樣的元素的示例:

<a href="http://www.google.com/search?q=cheese">cheese</a>>
WebElement cheese = driver.findElement(By.linkText("cheese"));

按部分鏈接文本查找

用部分可見的文本查找超鏈接元素

如何查找一個看起來像這樣的元素的示例:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));

按css樣式查找

如同名稱所隱含的,這是一個按css的定位器策略。缺省地使用本地瀏覽器支持,請參考W3C的css選擇器,以獲得一列常用可得到的css選擇器列表。如果瀏覽器沒有對css選擇器本地的支持,則使用Sizzle。IE6,7和Firefox 3.0目前使用Sizzle作爲css查詢引擎。

小心,不是所有瀏覽器都是一樣的,某些css可能工作在一個版本,但在另一個版本不工作。

下面是查找cheese的示例

<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));

按XPath查找

在高級別,只要可能,WebDriver使用瀏覽器內置的XPath能力。在那些沒有內置XPath支持的瀏覽器,我們提供了我們自己的實現。這可能回導致某些未預期得行爲,除非你知道各種各樣的XPath引擎之間的差異。

Driver Tag and Attribute Name ;Attribute Values Native XPath Support
HtmlUnit Driver Lower-cased As they appear in the HTML Yes
Internet Explorer Driver Lower-cased As they appear in the HTML No
Firefox Driver Case insensitive As they appear in the HTML Yes

這有一點抽象,看看下面的HTML片段:

<input type="text" name="example" />
<INPUT type="text" name="other" />
List<WebElement> inputs = driver.findElements(By.xpath("//input"));

下面是找到的匹配的數量

XPath expression HtmlUnit Driver Firefox Driver Internet Explorer Driver
//input 1 (“example”) 2 2
//INPUT 0 2 0

有時HTML元素的屬性不需要顯式的聲明,它們有缺省的已知值。例如,“input”標記不需要“type”屬性,因爲缺省爲“text”。經驗法則是使用WebDriver的XPath時,不應預期能夠匹配這些隱含的屬性。

使用Javascript

你可以執行任何Javascript,以找到一個元素,只要你找到一個DOM元素,它將自動轉換爲WebElement對象。

簡單的示例在一個裝載了jQuery的頁面上:

WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");

查找頁面上的每個標籤所指的input元素:

List<WebElement> labels = driver.findElements(By.tagName("label"));
List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);
 

用戶輸入 - 填充窗體

我們已經看到如何鍵入文本到一個textarea或text域,但其他的元素哪?你可以“切換”複選框的狀態,你可以使用“click”去設置類似於選項(OPTION)標記的選擇。處理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),打印出它們的值,然後依次選擇每一個。正如你注意到的,這不是處理SELECT元素最有效的方式。WebDriver提供許多類,包括一個稱之爲"Select"的,提供了實用的方法與它們交互。

Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");

這將取消頁面上的第一個SELECT元素選擇所有的選項,然後選擇帶有顯示文本“Edam”的選項。

一旦,你完成了窗體的填充,你可能希望提交它。完成這個的一個方法是查找“submit”按鈕然後“click”它。

driver.findElement(By.id("submit")).click();

替代地,WebDriver在每個元素上有替代的方法“submit”。如果你在一個窗體內的元素上調用它,WebDriver會走查DOM直到找到這個包圍的窗體,然後在其上調用提交。如果一個元素沒有在窗體內,則拋出NoSuchElementException。

element.submit();

在window和frame之間移動

有些Web應用程序有許多frame和多個window。WebDriver支持使用“switch”方法在命名的window之間移動:

driver.switchTo().window("windowName");

所有對驅動器的調用,現在將被解釋作定向到特殊的window。但你如何獲得window的名稱?可以看看打開它的Javascript或鏈接:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

替代地,你可以傳遞一個“window句柄”給 “switchTo().window()” 方法,知道這個,就可以像這樣遍歷每一個打開的窗口:


for (String handle : driver.getWindowHandles()) {
    driver.switchTo().window(handle);
}

你也可以從一個frame轉到到另一個(或到iframe):

driver.switchTo().frame("frameName");

可以訪問子frame,通過使用.(dot)分隔路徑,你也可以指定frame按它的索引。 那就是:

driver.switchTo().frame("frameName.0.child");

這將到名稱爲“frameName”的frame的第一個子frame的名稱爲“child”的frame。從top(根窗口)開始評估所有的frame。

彈出對話框

從Selenium 2.0 beta 1 開始,有內置的對彈出對話框的處理支持。在你觸發一個動作打開一個彈出對話框後,你可以訪問這個對話框用下面的方式:


Alert alert = driver.switchTo().alert();

這將返回目前打開的alert對象。用這個對象你現在可以接受,關閉,讀取它的內容,甚至鍵入一個提示框的內容。這個接口在alert,confirm和prompt對話框上工作的同樣好。參考JavaDoc以獲取更多的信息。

 

導航:歷史和位置

在較早,我們涉及了導航到一個頁面使用“get”命令(driver.get("http://www.example.com"))。正如你看到的,WebDriver有大量的較小的,聚焦於任務的接口,而導航是一個有用的任務。因爲裝載一個頁面是一個如此基本的要求,完成這個任務的方法在主WebDriver接口,但它僅僅是一個下面方法的同義詞:


driver.navigate().to("http://www.example.com");
 

重申: “navigate().to()” 和“get()” 做完全相同的事情。只是一個比另一個更容易的鍵入。

“navigate” 接口也暴露在你的瀏覽器歷史中前後移動的能力:

driver.navigate().forward();
driver.navigate().back();

請注意這個功能完全依賴於潛在的瀏覽器。如果你使用這個功能在不同的瀏覽器,出現一些未預期的事情是完全可能的。

Cookies

在我們移動到下個步驟前,你可能對理解如何使用cookies感興趣。首先,你必須在cookie有效的域。如果你試圖預置cookies,先於你開始與一個站點的交互,而且你的主頁很大,需要花費一些時間裝載。

// 跳轉到正確的域

driver.get("http://www.example.com");

// 現在設置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()));
}

可以用三種方法刪除cookie

// 按名稱

driver.manage().deleteCookieNamed("CookieName");

// 按Cookie

driver.manage().deleteCookie(loadedCookie);

// 或所有

driver.manage().deleteAllCookies();

改變用戶代理

使用Firefox驅動器是容易的:

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();

© Copyright 2008-2012, Selenium Project. Last updated on Feb 02, 2012.
目錄    上一頁    下一頁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章