1. 程式人生 > >selenium定位元素的八種方法

selenium定位元素的八種方法

order 邏輯運算 百度一 運算符 唯一標識 drive () cto gettext

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定位元素的八種方法