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) {
// 創(chuàng)建一個(gè)FirefoxDriver實(shí)例
// 這個(gè)類依賴于接口而不是接口的實(shí)現(xiàn)
WebDriver driver = new FirefoxDriver();
// 使用get方法訪問Google
driver.get("http://www.google.com");
// 使用下面這個(gè)方法也能夠達(dá)到訪問Google的目的
// driver.navigate().to("http://www.google.com");
// 找到html輸入框的name
WebElement element = driver.findElement(By.name("q"));
// 輸入要查找的內(nèi)容
element.sendKeys("Cheese!");
// 提交表單,WebDriver會(huì)自動(dòng)找到我們需要提交的元素所在的表單
element.submit();
// 打印網(wǎng)頁(yè)的標(biāo)題
System.out.println("Page title is: " + driver.getTitle());
// Google的搜索網(wǎng)頁(yè)會(huì)通過JS動(dòng)態(tài)渲染
// 等待頁(yè)面加載完畢,超時(shí)時(shí)間為10秒
(new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});
// 控制臺(tái)上將打印如下信息: "cheese! - Google Search"
System.out.println("Page title is: " + driver.getTitle());
// 關(guān)閉瀏覽器
driver.quit();
}
}
在本章節(jié)的接下來篇幅,我們將學(xué)習(xí)如何使用WebDriver操作你的瀏覽器,如何使用框架和窗口來測(cè)試Web網(wǎng)站。當(dāng)然,我們將提供更加翔實(shí)的論述和舉例。
7.Selenium-WebDriver API詳解
7.1獲取Web頁(yè)面
我們第一件要做的事是通過WebDriver取得Web頁(yè)面的控制權(quán),一般情況下使用get方法
driver.get("http://www.google.com");
在某些情況下,比如操作系統(tǒng)和瀏覽器的穿插組合,WebDriver有可能不會(huì)等待Web頁(yè)面加載完成,這種情況下WebDriver會(huì)返回錯(cuò)誤或者直接運(yùn)行下一步操作。為了保證程序的健壯性,你需要等待頁(yè)面中某個(gè)元素加載完成后再進(jìn)行下一步操作,請(qǐng)參考Explicit and Implicit Waits。
7.2定位UI元素
我們可以通過WebDriver實(shí)例或者WebElement類來定位UI元素。我們?yōu)槊糠N編程語言都提供了兩種方法:“Find Element”和“Find Elements”。第一種方法返回的一個(gè)WebElement,找不到則拋出異常。第二個(gè)方法返回一個(gè)WebElement鏈表(List),在找不到任何DOM元素的情況下會(huì)返回空的鏈表。
Find方法會(huì)使用類似探測(cè)器的類,類名叫做By。下面列舉By的一些常用方法:
By ID
當(dāng)我們定位一個(gè)UI 元素,這個(gè)是有效也是好的方法。不過這個(gè)方法不是的,有的前端開發(fā)在設(shè)計(jì)UI元素時(shí)會(huì)遺漏ID或者使用動(dòng)態(tài)ID,這兩種情況下都要避免使用這個(gè)方法。這時(shí)候使用獲取class名稱方法比By ID更合適。
示例:如何使用該方法定位元素
...
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
By Class Name
在這種場(chǎng)景下,我們引用DOM元素的屬性。實(shí)際情況是很多元素都有一樣的Class Name,因此找到多個(gè)有相同Class Name的元素,比找到第一個(gè)擁有這個(gè)Class Name的元素來的更重要。
示例:如何使用該方法定位元素
Cheddar
Gouda
List cheeses = driver.findElements(By.className("cheese"));
By Tag Name
DOM元素Tag的名稱。
示例:如何使用該方法定位元素
WebElement frame = driver.findElement(By.tagName("iframe"));
By Name
找到與Name屬性相同的Input元素。
示例:如何使用該方法定位元素
WebElement cheese = driver.findElement(By.name("cheese"));
By Link Text
找到與Text屬性精確匹配的超鏈接。
示例:如何使用該方法定位元素
cheese
WebElement cheese = driver.findElement(By.linkText("cheese"));
By Partial Link Text
找到與Text屬性模糊匹配的超鏈接。
示例:如何使用該方法定位元素
search for cheese
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
By CSS
這個(gè)方法名稱意味著它是一個(gè)CSS探測(cè)器。前提是瀏覽器默認(rèn)支持這種方法,建議根據(jù)W3C的標(biāo)準(zhǔn)文檔構(gòu)建CSS選擇器。如果瀏覽器不支持CSS選擇器,可以使用Sizzle。IE6,7和FireFox3.0是使用Sizzle作為CSS查詢引擎。