文章轉(zhuǎn)于: http://www./2013/01/selenium-webdriver%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3%EF%BC%88%E4%BA%8C%EF%BC%89.html
Selenium WebDriver學(xué)習(xí)文檔(二)
注:本文翻譯自http:///docs/03_webdriver.jsp,翻譯不完全,次要部分沒有翻譯。文中只涉及了Java編程語言,翻譯過程中稍有改動(dòng)。如有什么問題需要交流,請(qǐng)聯(lián)系我。
SeleniumWebDriver的API命令和操作
加載頁面
你可能想使用WebDriver做的第一件事情是導(dǎo)航到一個(gè)頁面。正常的方式是通過調(diào)用“get”方法:
driver.get("http://www.google.com"); |
依賴于幾個(gè)因素,包括OS
/瀏覽器組合等,WebDriver可能或可能不會(huì)等待頁面加載完全。在某些情況下,WebDriver可能在頁面加載完全之前返回控制權(quán),或者在頁面剛
剛加載時(shí),或加載中等。為保證持續(xù)健壯性,你需要使用顯式和隱式等待等待元素在頁面中存在 。
定位UI元素(WebElements)
在WebDriver中定位Web頁面的元素,可以使用WebDriver實(shí)例,也可以使用WebElement實(shí)例。每種編程語言綁定都暴露一個(gè)
“Find Element”和“Find
Elements”的方法。前者返回WebElement對(duì)象,否則拋出一個(gè)異常。后者則返回WebElement列表。如果沒有匹配查詢的DOM元素,
則返回一個(gè)空列表。
查找定位元素方法,需要一個(gè)By類型的一個(gè)定位器或查詢對(duì)象。By類型支持如下:
通過ID
這是最有效、優(yōu)先的定位元素的方式。UI開發(fā)人員設(shè)下的常見的陷阱是,頁面上的元素ID不唯一,或者頁面渲染時(shí)每次都自動(dòng)生成,這應(yīng)該都是可以避免的。請(qǐng)使用html元素的class屬性,而不要使用自動(dòng)生成的ID。
HTML示例:
<div id="coolestWidgetEvah">...</div> |
代碼示例:
WebElement element = driver.findElement(By.id("coolestWidgetEvah")); |
通過class屬性
在本部分,class指的是DOM元素的類屬性。在實(shí)際使用中, 通常許多DOM元素使用相同的類屬性.從而定位多個(gè)元素比只定位第一個(gè)元素更有實(shí)際意義。
示例:
HTML示例:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div> |
代碼示例:
List<WebElement> cheeses = driver.findElements(By.className("cheese")); |
按標(biāo)簽名稱
按DOM元素的標(biāo)簽名稱定位元素.例如:
HTML示例:
<iframe src="..."></iframe> |
代碼示例:
WebElement frame = driver.findElement(By.tagName("iframe")); |
按名稱屬性
按DOM元素的名稱屬性定位元素.例如:
HTML示例:
<input name="cheese" type="text"/> |
代碼示例:
WebElement cheese = driver.findElement(By.name("cheese")); |
按鏈接文本
定位匹配可見的文本的鏈接元素,例如:
HTML示例:
<a href="http://www.google.com/search?q=cheese">cheese</a> |
代碼示例:
WebElement cheese = driver.findElement(By.linkText("cheese")); |
按鏈接文本部分匹配定位
定位部分匹配的可見文本的鏈接元素,例如:
HTML示例:
<a href="http://www.google.com/search?q=cheese">search for cheese</a> |
代碼示例:
WebElement cheese = driver.findElement(By.partialLinkText("cheese")); |
通過CSS
顧名思義,這是一個(gè)使用CSS的元素定位戰(zhàn)略。默認(rèn)情況下,使用瀏覽器內(nèi)建支持,所以請(qǐng)參考w3c
css選擇器http://www./TR/CSS/#selectors來了解可用的CSS選擇器。如果瀏覽器沒有內(nèi)置的CSS查詢器,使
用Sizzl css查詢引擎,比如,IE 6,7和FF3.0等。
要注意的是:不是所有的瀏覽器工作方式都一樣,一些css在一些版本的瀏覽器工作,但是有些可能無法在另一個(gè)版本瀏覽器工作。
HTML示例:
<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使用瀏覽器內(nèi)置的XPath特性。在那些沒有內(nèi)置XPATH特性支持的瀏覽器中,使用WebDriver的實(shí)現(xiàn)。需要注意不同XPTAH引擎的不同,否則會(huì)引起不期望的一些結(jié)果。
HTML示例:
<input type="text" name="example" />
<INPUT type="text" name="other" /> |
代碼示例:
List<WebElement> inputs = driver.findElements(By.xpath("http://input")); |
使用JavaScript
您可以執(zhí)行任意的JavaScript來定位頁面元素,只要javascript函數(shù)返回一個(gè)DOM元素,它會(huì)自動(dòng)轉(zhuǎn)換到WebElement對(duì)象。加載jQuery函數(shù)的頁面上的例子如下:
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]"); |
發(fā)現(xiàn)所有的緊挨著label元素的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); |
用戶輸入-填寫表格
我們已經(jīng)看到了如何將文本輸入到一個(gè)textarea或text輸入域,但對(duì)于其他元素,應(yīng)該怎么做呢?你可以“toggle”來切換復(fù)選框的狀態(tài),您可以使用“click”來點(diǎn)擊選擇的OPTION標(biāo)簽。處理SELECT標(biāo)簽不是很麻煩:
代碼示例:
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();
} |
這段腳本將定位頁面上的第一個(gè)“SELECT”元素,依次循環(huán)它的OPTIONs選項(xiàng),打印出它們的值,并依次選擇選項(xiàng)。這不是最有效的處理SELECT元素的方式。WebDriver包括一個(gè)名為“Select”的方法,來處理下拉選擇框。
代碼示例:
Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam"); |
這段代碼會(huì)先反選全部的選項(xiàng)表,然后選“Edam”選項(xiàng)。
一旦你完成填寫表單時(shí),你可能要提交。方法之一是要找到“提交”按鈕,然后單擊它:
代碼示例:
driver.findElement(By.id("submit")).click(); |
另外,WebDriver在每一個(gè)元素上有一個(gè)方便的“submit方法。如果你調(diào)用處于表單內(nèi)的元素的提交方法,會(huì)喚醒DOM找到from標(biāo)簽的結(jié)束符號(hào)并提交表單。如果該元素是不在form表單,NoSuchElementException異常將被拋出。
代碼示例:
在窗口和幀(Frame)之間移動(dòng)
一些web應(yīng)用程序有很多的幀和窗口。WebDriver支持在命名的窗口間移動(dòng),使用switchTo方法:
代碼示例:
driver.switchTo().window("windowName"); |
自此,所有的driver的調(diào)用都針對(duì)當(dāng)前窗口執(zhí)行。但是你怎么獲取窗口的名稱?你可以試試打開該窗口的javascript或鏈接。
<a href="somewhere.html" target="windowName">Click here to open a new window</a> |
另外,你也可以傳遞一個(gè)“窗口句柄”的“switchTo().window()”方法。知道了這一點(diǎn),就可以遍歷所有打開的窗口,像這樣:
代碼示例:
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
} |
你還可以在幀間進(jìn)行切換,或者進(jìn)入子幀:
代碼示例:
driver.switchTo().frame("frameName"); |
還可以使用點(diǎn)操作符和索引訪問子幀,如:
代碼示例:
driver.switchTo().frame("frameName.0.child"); |
該腳本會(huì)定位到名為“child”的幀,它為名為“frameName”的幀的第一個(gè)子幀。
彈出對(duì)話框:
從Selenium2.0測試版1起,就支持處理彈出對(duì)話框。當(dāng)你觸發(fā)一個(gè)打開彈出窗口的動(dòng)作,您可以訪問編寫下述腳本訪問該警示窗口:
代碼示例:
Alert alert = driver.switchTo().alert(); |
導(dǎo)航:歷史和位置
在前文,我們介紹了WebDriver如何使用 “get”命令(driver.get(“http://www.”)
)來加載頁面。正如你所看到的一樣
,WebDriver有一些較小的,服務(wù)特定任務(wù)的API接口。導(dǎo)航是一個(gè)非常有用的任務(wù),可以用來加載頁面,也可以用來模擬前進(jìn)和后退操作。
navigate().to()和get()執(zhí)行的操作是一樣的,互為同義詞。
代碼示例:
driver.navigate().to("http://www."); |
driver.navigate().forward();
driver.navigate().back();
Cookies
在進(jìn)入下一部分前,你可能有興趣了解如何使用Cookie。首先,你需要進(jìn)入cookie有效的域。如果你試圖預(yù)先設(shè)定cookie,然后再與網(wǎng)站進(jìn)行交
互,且您的主頁較大/需要一段時(shí)間加載,你可以在網(wǎng)站上找到一個(gè)更小的頁面進(jìn)行加載,通常404頁較小(http://
/some404page)。
定制瀏覽器選項(xiàng):
在Firefox瀏覽器上,定制操作比較簡單:
代碼示例:
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile); |
拖拽操作
使用Action類進(jìn)行拖拽的例子:
代碼示例:
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
|