您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源功能測(cè)試工具 > Selenium
Selenium Webdriver元素定位的八種常用方式
作者:測(cè)試控 發(fā)布時(shí)間:[ 2016/6/30 13:34:40 ] 推薦標(biāo)簽:功能測(cè)試工具 軟件測(cè)試

  在使用selenium webdriver進(jìn)行元素定位時(shí),通常使用findElement或findElements方法結(jié)合By類(lèi)返回的元素句柄來(lái)定位元素。其中By類(lèi)的常用定位方式共八種,現(xiàn)分別介紹如下。
  1. By.name()
  假設(shè)我們要測(cè)試的頁(yè)面源碼如下:
  <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Google Search</span></button>
  當(dāng)我們要用name屬性來(lái)引用這個(gè)button并點(diǎn)擊它時(shí),代碼如下:
  1 public class SearchButtonByName {
  2         public static void main(String[] args){
  3                WebDriver driver = new FirefoxDriver();
  4                driver.get("http://www.forexample.com");
  5                WebElement searchBox = driver.findElement(By.name("btnK"));
  6                searchBox.click();
  7         }
  8 }
  2. By.id()
  頁(yè)面源碼如下:
  1 <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Google Search</span></button>
  要引用該button并點(diǎn)擊它時(shí),代碼如下:
  1 public class SearchButtonById {
  2
  3         public static void main(String[] args){
  4
  5             WebDriver driver = new FirefoxDriver();
  6
  7             driver.get("http://www.forexample.com");
  8
  9             WebElement searchBox = driver.findElement(By.id("gbqfba"));
  10
  11             searchBox.click();
  12
  13         }
  14
  15 }
  3. By.tagName()
  該方法可以通過(guò)元素的標(biāo)簽名稱(chēng)來(lái)查找元素。該方法跟之前兩個(gè)方法的區(qū)別是,這個(gè)方法搜索到的元素通常不止一個(gè),所以一般建議結(jié)合使用findElements方法來(lái)使用。比如我們現(xiàn)在要查找頁(yè)面上有多少個(gè)button,可以用button這個(gè)tagName來(lái)進(jìn)行查找,代碼如下:
  
  public class SearchPageByTagName{
  public static void main(String[] args){
  WebDriver driver = new FirefoxDriver();
  driver.get("http://www.forexample.com");
  List<WebElement> buttons = driver.findElements(By.tagName("button"));
  System.out.println(buttons.size());  //打印出button的個(gè)數(shù)
  }
  }                   
  
  另外,在使用tagName方法進(jìn)行定位時(shí),還有一個(gè)地方需要注意的是,通常有些HTML元素的tagName是相同的,如下圖(1)所示。


  圖(1)

  從圖中我們可以看到,單選框、復(fù)選框、文本框和密碼框的元素標(biāo)簽都是input,此時(shí)單靠tagName無(wú)法準(zhǔn)確地得到我們想要的元素,需要結(jié)合type屬性才能過(guò)濾出我們要的元素。示例代碼如下:
  
  1 public class SearchElementsByTagName{
  2
  3         public static void main(String[] args){
  4
  5             WebDriver driver = new FirefoxDriver();
  6
  7             driver.get("http://www.forexample.com");
  8
  9             List<WebElement> allInputs = driver.findElements(By.tagName("input"));
  10
  11             //只打印所有文本框的值
  12
  13             for(WebElement e: allInputs){
  14
  15                   if (e.getAttribute(“type”).equals(“text”)){
  16
  17                   System.out.println(e.getText().toString());  //打印出每個(gè)文本框里的值
  18
  19                   }
  20
  21             }
  22
  23        }
  24
  25 }
  
  4. By.className()
  className屬性是利用元素的css樣式表所引用的偽類(lèi)名稱(chēng)來(lái)進(jìn)行元素查找的方法。對(duì)于任何HTML頁(yè)面的元素來(lái)說(shuō),一般程序員或頁(yè)面設(shè)計(jì)師會(huì)給元素直接賦予一個(gè)樣式屬性或者利用css文件里的偽類(lèi)來(lái)定義元素樣式,使元素在頁(yè)面上顯示時(shí)能夠更加美觀。一般css樣式表可能會(huì)長(zhǎng)成下面這個(gè)樣子:
  
  1 .buttonStyle{
  2
  3     width: 50px;
  4
  5     height: 50px;
  6
  7     border-radius: 50%;
  8
  9     margin: 0% 2%;
  10
  11 }
  
  定義好后,可以在頁(yè)面元素中引用上述定義好的樣式,如下:
  1 <button name="sampleBtnName" id="sampleBtnId" class="buttonStyle">I'm Button</button>
  如果此時(shí)我們要通過(guò)className屬性來(lái)查找該button并操作它的話,可以使用className屬性了,代碼如下:
  
  1 public class SearchElementsByClassName{
  2
  3     public static void main(String[] args){
  4
  5         WebDriver driver = new FirefoxDriver();
  6
  7         driver.get("http://www.forexample.com");
  8
  9         WebElement searchBox =  driver.findElement(By.className("buttonStyle"));
  10
  11         searchBox.sendKeys("Hello, world");
  12
  13     }
  14
  15 }
  
  注意:使用className來(lái)進(jìn)行元素定位時(shí),有時(shí)會(huì)碰到一個(gè)元素指定了若干個(gè)class屬性值的“復(fù)合樣式”的情況,如下面這個(gè)button:<button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登錄</button>。這個(gè)button元素指定了三個(gè)不同的css偽類(lèi)名作為它的樣式屬性值,此時(shí)必須結(jié)合后面要介紹的cssSelector方法來(lái)定位了,稍后會(huì)有詳細(xì)例子。
  5. By.linkText()
  這個(gè)方法比較直接,即通過(guò)超文本鏈接上的文字信息來(lái)定位元素,這種方式一般專(zhuān)門(mén)用于定位頁(yè)面上的超文本鏈接。通常一個(gè)超文本鏈接會(huì)長(zhǎng)成這個(gè)樣子:
  1 <a href="/intl/en/about.html">About Google</a>
  我們定位這個(gè)元素時(shí),可以使用下面的代碼進(jìn)行操作:
  
  1 public class SearchElementsByLinkText{
  2
  3     public static void main(String[] args){
  4
  5         WebDriver driver = new FirefoxDriver();
  6
  7         driver.get("http://www.forexample.com");
  8
  9         WebElement aboutLink = driver.findElement(By.linkText("About Google"));
  10
  11         aboutLink.click();
  12
  13     }
  14
  15 }
  
  6. By.partialLinkText()
  這個(gè)方法是上一個(gè)方法的擴(kuò)展。當(dāng)你不能準(zhǔn)確知道超鏈接上的文本信息或者只想通過(guò)一些關(guān)鍵字進(jìn)行匹配時(shí),可以使用這個(gè)方法來(lái)通過(guò)部分鏈接文字進(jìn)行匹配。代碼如下:
  1 public class SearchElementsByPartialLinkText{
  2
  3     public static void main(String[] args){
  4
  5         WebDriver driver = new FirefoxDriver();
  6
  7         driver.get("http://www.forexample.com");
  8
  9         WebElement aboutLink = driver.findElement(By.partialLinkText("About"));
  10
  11         aboutLink.click();
  12
  13     }
  14
  15 }
  注意:使用這種方法進(jìn)行定位時(shí),可能會(huì)引起的問(wèn)題是,當(dāng)你的頁(yè)面中不止一個(gè)超鏈接包含About時(shí),findElement方法只會(huì)返回第一個(gè)查找到的元素,而不會(huì)返回所有符合條件的元素。如果你要想獲得所有符合條件的元素,還是只能使用findElements方法。

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd