1.簡單查詢
By ID: WebElement element=driver.findElement(By.id("userId"));
By Name:WebElement element=driver.findElement(By.name("cheese"));
By TagName:WebElement element=driver.findElement(By.tagName("a"));
By ClassName:WebElement element=driver.findElement(By.className("login"));
By LinkText:WebElement element=driver.findElement(By.linkText("Blog");
這種方式很簡單,只需要知道id等等屬性值就好。那麼問題來了,怎麼知道屬性值是什麼呢?總不至於通過網頁原始碼一個一個檢視吧!其實Firefox 有一款很強大的外掛,叫 Firebug。它是一款很經典的定位網頁元素以及檢視網頁原始碼的外掛。安裝方法是在火狐的附加元件裡搜尋”Firebug",然後我這邊選擇的是 “Firebug 2.0.8",安裝即可。
2.Xpath
關於Xpath的教程可以參考w3School:http://www.w3school.com.cn/xpath/
為了方便定位以及確認Xpath是否正確,Firefox也有一款外掛叫Xpath finder。選擇附加元件,然後搜尋 Xpath即可看到,我這邊的版本是 Xpath finder 1.02,點選安裝即可。
Xpath使用路徑表示式來選取XML文件中的節點或者節點集。
選取節點
下面列出了最有用的路徑表示式:
表示式 | 描述 |
---|---|
nodename | 選取此節點的所有子節點。 |
/ | 從根節點選取。 |
// | 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置。 |
. | 選取當前節點。 |
.. | 選取當前節點的父節點。 |
@ | 選取屬性。 |
謂語
謂語用來查詢某個特定的節點或者包含某個指定的值得節點。謂語被嵌在[]中。
在下面的表格中,我們列出了帶有謂語的一些路徑表示式,以及表示式的結果:
路徑表示式 | 結果 |
---|---|
/bookstore/book[1] | 選取屬於 bookstore 子元素的第一個 book 元素。 |
/bookstore/book[last()] | 選取屬於 bookstore 子元素的最後一個 book 元素。 |
/bookstore/book[last()-1] | 選取屬於 bookstore 子元素的倒數第二個 book 元素。 |
/bookstore/book[position()<3] | 選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素。 |
//title[@lang='eng'] | 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。 |
/bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。 |
/bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。 |
使用:WebElement element=driver.findElement(By.xpath("//ul[@class='nav logged_out']/li"));
表示首先查詢class屬性的值為 ”nav logged_out"的ul元素,然後查詢到這些ul元素下面的所有li元素。
3.CSS選擇器
其實大部分的元素都會有一個ID或者Name,這樣通過方法1就可以解決,比較奇葩複雜的也全部可以通過XPath來解決。那麼為啥還要用CSS呢?恩,據說是因為CSS是最快的。這個需要點CSS功底。想當初W3C的教程我可是看了好久。
CSS教程:http://www.w3school.com.cn/css/index.asp
使用:List<WebElement> webElements = webdriver.findElements(By.cssSelector("ul.nav li"));
.nav 代表 class="nav"。
#nav 代表 id="nav"。
ul 代表屬性為 “ul"。
上面那句話的意思是選擇所有class屬性值為”nav"的ul下面的li。話說,有點繞啊~~