selenium定位元素的八種方法
web driver提供了八種元素定位的方法:
id, name, class name, tag name,
link text, partial link text, xpath, css selector
如百度首頁,百度一下按鈕的元素信息
<input type="submit" id="su" value="百度一下" class="bg s_btn">
百度首頁新聞的頁面的元素信息
<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>
1. id定位-->
id在大多數情況下是唯一的。如百度一下的按鈕
driver.findElement(By.id("su")).click();
2. name定位 -->
也有元素沒有id,和其他同級元素共用一個id,如新聞。此時要通過其他方式去定位。name指定元素的名稱,但name在當前頁面不一定唯一。
driver.findElement(By.name("tj_trnews")).click();
3. class name -->沒有使用成功
html規定class來指定元素的類名。沒有使用成功
4. tag name -->
HTML的本質就是通過tag來定義實現不同的功能,每一個元素本質上也是一個tag。tag往往用來定義一類功能,所以通過tag識別某個元素的概率很低。如頁面存在大量的<div>,<input>,<a>等tag。
5. link text -->
link專門用來定位文本鏈接。
driver.findElement(By.linkText("地圖")).click();
driver.findElement(By.linkText("新聞")).click();
driver.findElement(By.linkText("地圖")).click();
6. partial link text -->
partial link text是對link text的補充,有些文本鏈接會比較長,此時可以取部分文本進行定位。
driver.findElement(By.partialLinkText("新聞")).click();
7. xpath -->
a.絕對路徑定位
driver.findElement(By.xpath("/html/body/div[1]/div[1]/div/div[3]/a[2]")).click();
註意此處的index下標是從1開始的,不是從0。即div[1]表示當前層級下第1個div標簽
b.利用元素屬性定位
地圖有三個屬性,href,name,class。
driver.findElement(By.xpath("//a[@name=‘tj_trnews‘]")).click();
driver.findElement(By.xpath("//a[@href=‘http://news.baidu.com‘]")).click()
driver.findElement(By.xpath("//a[@class=‘mnav‘]")).click();
參照2中圖會發現,如果定位地圖,會發現class屬性相同。不加索引,會指向第一個,即新聞;添加索引[3],即可實現對地圖的定位。
WebElement baiduNew= driver.findElement(By.xpath("//a[@class=‘mnav‘]"));
System.out.println(baiduNew.getText()); //新聞
WebElement baiduMap = driver.findElement(By.xpath("//a[@class=‘mnav‘][3]"));
System.out.println(baiduMap.getText()); //地圖
c.層級與屬性結合
如果一個元素本身沒有可以標識這個元素的屬性值,可以找其上一級元素。如果上一級元素有可以唯一標識的值,就可以拿來使用。
定位百度首頁地圖。雙引號註意轉譯
driver.findElement(By.xpath("//*[@id=\"u1\"]/a[1]")).click();
driver.findElement(By.xpath("//*[@id=‘u1‘]/a[3]")).click();
如果父元素沒有可利用的屬性,繼續向上查找爺爺元素
driver.findElement(By.xpath("//*[@class=‘head_wrapper‘]/div[3]/a[2]")).click();
嘗試省略父元素或用*代替父元素,沒有成功。父元素不可省略。
driver.findElement(By.xpath("//*[@class=‘head_wrapper‘]//a[2]")).click();
driver.findElement(By.xpath("//*[@class=‘head_wrapper‘]/*/a[2]")).click();
d.使用邏輯運算符
如果一個元素不能唯一的區分一個元素,也可以使用邏輯運算符使用多個屬性來查找元素。如2中圖片,class相同,可以添加其他屬性來確定元素。
driver.findElement(By.xpath("//a[@name=‘tj_trnews‘ and @class=‘mnav‘]")).click();
findElement(By.xpath("//input[@id=‘kw‘ and @class=‘su‘]/span/input"))
e.使用插件快速生成xpath
chrome:元素-右鍵,檢查元素-copy-copy xpath
Firefox:元素-右鍵,查看元素-復制-復制xpath
8.css selector -->
如百度首頁,百度一下的信息
選擇器 | 例子 | 描述 |
.class | .mnav | class選擇器,選擇class="mnav"的所有元素 |
#id | #su | id選擇器,選擇id=‘su‘的所有元素 |
* | * | 選擇所有元素 |
element | input | 選擇所有<input>元素 |
element>element | div>input | 選擇父元素為div的所有input元素 |
element+element | div+input | 選擇緊接在div後所有的input元素 |
[attribute==value] | [name=‘tj_trnews‘] | 選擇name="tj_trnews"的所有元素 |
a.使用class屬性定位
driver.findElement(By.cssSelector(".mnav")).click();
默認查找第一個元素,如果要查找其他的元素,需要使用nth-child(index)
driver.findElement(By.cssSelector(".mnav:nth-child(3)")).click();
b.使用id屬性定位
driver.findElement(By.cssSelector("#su")).click();
driver.findElement(By.cssSelector("#u1>a")).click();
driver.findElement(By.cssSelector("#u1>a:nth-child(3)")).click();
c.通過tag ame定位
driver.findElement(By.cssSelector("span>input")).sendKeys("hello");
driver.findElement(By.cssSelector("span+input")).sendKeys("hello");
d.通過屬性定位
driver.findElement(By.cssSelector("[name=‘tj_trnews‘]")).click();
e.組合定位
driver.findElement(By.cssSelector("div>a.mnav")).click(); //定位到新聞
driver.findElement(By.cssSelector("#u1 > a:nth-child(3)")).click();定位到地圖
f.使用插件生成css路徑
chrome:元素-copy-copy selector
firefox: 元素-復制-復制CSS路徑
xpath與CSS類似功能對比
<a href="http://news.ifeng.com/a/20180616/58747157_0.shtml?_zbs_firefox" title="特朗普競選團隊前競選經理被令入獄候審">特朗普競選團隊前競選經理被令入獄候審</a>
定位方式 | XPath | CSS |
tag name | //a | a |
By id | //a[@id=‘u1‘] | a#u1 |
By class |
//a[@class=‘mnav‘] | a.mnav |
By link text | //a[@title=‘特朗普競選團隊前競選經理被令入獄候審‘] |
a[title=特朗普競選團隊前競選經理被令入獄候審] a[title^=特朗普] a[title$=入獄候審] a[title*=競選經理] |
定位子元素 | //div/a[@class=‘mnav‘] | div>a.mnav |
使用index | //*[@id=‘u1‘]/a[3] | #u1 > a:nth-child(3) |
selenium定位元素的八種方法