注意不是所有瀏覽器都使用同樣的CSS選擇器表達(dá)式,有些CSS可能只在某一個(gè)版本中生效。
示例:如何使用該方法定位元素
milkcheese
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
By XPath
當(dāng)有需要時(shí),WebDriver還可以使用瀏覽器自帶的XPATH。對(duì)于那些不支持XPATH的瀏覽器,我們提供了WebDriver特有的實(shí)現(xiàn)方式。請(qǐng)確保熟悉XPATH在不同的引擎中的區(qū)別,否則會(huì)導(dǎo)致一些不可預(yù)料的問題。
有些標(biāo)簽的屬性有默認(rèn)值,這種情況下不指定屬性值則匹配默認(rèn)值。比如,"input"標(biāo)簽"type"屬性默認(rèn)為"text"。使用XPATH的首要原則是不要忽略這些隱藏的實(shí)現(xiàn)。
使用JavaScript
只要返回的是一個(gè)Web Element,你還可以使用任意的JS代碼查找Web元素,根據(jù)查詢結(jié)果會(huì)自動(dòng)修改為一個(gè)WebElement對(duì)象。
一個(gè)簡(jiǎn)單的使用jQuery的例子:
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
查找頁(yè)面中每個(gè)label的所有Input元素:
List labels = driver.findElements(By.tagName("label"));
List inputs = (List) ((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);
7.3模擬用戶輸入行為
我們已經(jīng)演示了在文本框輸入文本內(nèi)容,其他Web元素應(yīng)該如何操作呢?你可以觸發(fā)CheckBox的某個(gè)選項(xiàng),也可以選擇Select的某個(gè)選項(xiàng)。WebDriver處理Select元素也很簡(jiǎn)單。
WebElement select = driver.findElement(By.tagName("select"));
List allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
System.out.println(String.format("Value is: %s", option.getAttribute("value")));
option.click();
}
上面的例子,將選擇Web頁(yè)面中的第一個(gè)Select元素,并將循環(huán)打印出選項(xiàng)的取值并單擊選項(xiàng)。或許你已經(jīng)注意到,使用這個(gè)方法并不是有效的。WebDriver提供一個(gè)“Select”類,這個(gè)類的方法更適合于處理上述這種場(chǎng)景。
Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");
上面的例子,首先去除選定第一個(gè)選項(xiàng)的焦點(diǎn),然后選中取值為"Edam"的選項(xiàng)。
一旦你完成了所有表單字段的輸入,下一步是提交表單。一種方法是找到Web頁(yè)面中的Submit按鈕并單擊:
driver.findElement(By.id("submit")).click();
作為另一種選擇,WebDriver的Element類有一個(gè)更加便利的方法"sublmit"。如果你對(duì)表單中的某個(gè)Element使用該方法,WebDriver將會(huì)走讀其所在的DOM對(duì)象,直到找到其所屬的表單,并提交。如果該Element并不在某個(gè)表單中,將會(huì)拋出異常 NoSuchElementException。
element.submit();
7.4在windows和frames間切換
有些Web程序包含許多Frame和窗口,WebDriver提供"switch to"方法在這之間進(jìn)行切換:
driver.switchTo().window("windowName");
所有傳輸給WebDriver的指定將被傳輸給切換后的窗口。如何直到窗口的名稱呢?查看JS并打開該窗口可以了:
Click here to open a new window
作為另一種選擇,你可以使用一個(gè)“窗口句柄”傳遞給"switchTo().window()"方法。根據(jù)此方法,將會(huì)使用迭代器遍歷所有打開的窗口:
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
}