1.xpath較復雜的定位方法:
現在要引用id為“J_password”的input元素,可以像下面這樣寫:
WebElement password = driver.findElement(By.xpath("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"));
其中//*[@id=’ J_login_form’]這一段是指在根元素下查找任意id為J_login_form的元素,此時相當於引用到了form元素。后面的路徑必須按照源碼的層級依次往下寫。按照圖所示代碼中,我們要找的input元素包含在一個dt標簽內,而dt又包含在dl標簽內,所以中間必須寫上dl和dt兩層,才到input這層。當然我們也可以用*號省略具體的標簽名稱,但元素的層級關系必須體現出來,比如我們不能寫成//*[@id='J_login_form']/input[@id='J_password'],這樣肯定會報錯的。
另外一種寫法:WebElement password = driver.findElement(By.xpath("//*[@id='J_login_form']/*/*/input[@id='J_password']"));
2.xpath的模糊定位方法:
這段代碼中的“退出”這個超鏈接,沒有標准id元素,只有一個rel和href,不是很好定位。用xpath的幾種模糊匹配模式來定位它,主要有四種方式:
a. 用contains關鍵字,定位代碼如下:
driver.findElement(By.xpath(“//a[contains(@href, ‘logout’)]”));
這句話的意思是尋找頁面中href屬性值包含有logout這個單詞的所有a元素,由於這個退出按鈕的href屬性里肯定會包含logout,所以這種方式是可行的,也會經常用到。其中@后面可以跟該元素任意的屬性名。
b. 用start-with,定位代碼如下:
driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));
這種方式一般用於知道超鏈接上顯示的部分或全部文本信息時,可以使用。
這句的意思是尋找rel屬性以nofo開頭的a元素。其中@后面的rel可以替換成元素的任意其他屬性
c. 用Text關鍵字,定位代碼如下:
driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));
直接查找頁面當中所有的退出二字,根本就不用知道它是個a元素了。這種方法也經常用於純文字的查找
d.如果知道超鏈接元素的文本內容,也可以用
driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));
3.XPath 關於網頁中的動態屬性的定位,例如,ASP.NET 應用程序中動態生成 id 屬性值,可以有以下四種方法:
a.starts-with 例子: input[starts-with(@id,'ctrl')] 解析:匹配以 ctrl開始的屬性值
b.ends-with 例子:input[ends-with(@id,'_userName')] 解析:匹配以 userName 結尾的屬性值
c.contains() 例子:Input[contains(@id,'userName')] 解析:匹配含有 userName 屬性值
參考網址:http://www.cnblogs.com/qingchunjun/p/4208159.html
xpath詳解:http://www.cnblogs.com/ktgu/archive/2009/04/16/1353246.html