selenium webdriver(2)—頁面對象定位

webdriver的元素定位很靈活,提供了多種定位方式:css

  • Idjava

  • LinkTextcss3

  • PartialLinkTextweb

  • Namechrome

  • TagName測試

  • Xpath網站

  • ClassNameui

  • CssSelectorspa

這些方法能夠在org.openqa.selenium.By中找到,下面一一道來;code

by

假若有這樣的需求:登陸安居客網站,搜索陸家嘴附近的二手房源,網頁是這樣的

anjuke

這個需求涉及到一個輸入框和一個提交按鈕,先查看網頁源碼anjuke_source

在輸入框中輸入「陸家嘴」而後點擊「二手房」按鈕,若是能跳轉到陸家嘴相關頁面就完成了這個需求,咱們嘗試用webdriver提供的元素定位方法來解決

ID                                                                                                                                                                              

id是惟一標識,經過id來定位是很是快速和準確的

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      //id
      WebElement text=driver.findElement(By.id("glb_search0"));
      text.sendKeys("陸家嘴");
      WebElement button=driver.findElement(By.id("btnSubmit"));
      button.click();
      
      if(driver.getTitle().contains("陸家嘴"))
          System.out.print("搜索成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("搜索失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

Name                                                                                                                                                                        

提交表單時能夠經過name屬性獲取數據,較id來講並不經常使用,有id屬性時建議優先使用id屬性,上面的源碼中text輸入框是有name屬性的,button依然用id來獲取(固然,若是測試須要的話能夠修改源碼,沒有修改源碼權限的自動化測試是很難進行的)。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      //name
      WebElement text=driver.findElement(By.name("kw"));
      text.sendKeys("陸家嘴");
      WebElement button=driver.findElement(By.id("btnSubmit"));
      button.click();
      
      if(driver.getTitle().contains("陸家嘴"))
          System.out.print("搜索成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("搜索失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

TagName                                                                                                                                                                  

tagname通常用來獲取批量數據,如統計頁面連接數,輸入框數量等等,用tagname來定位單一元素有點麻煩

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      List<WebElement> inputs=driver.findElements(By.tagName("input"));
      for(int index=0;index<inputs.size();index++){
          if(inputs.get(index).getAttribute("id").equals("glb_search0"))
              inputs.get(index).sendKeys("陸家嘴");
          if(inputs.get(index).getAttribute("id").equals("btnSubmit"))
              inputs.get(index).click();
      }
          
      if(driver.getTitle().contains("陸家嘴"))
          System.out.print("搜索成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("搜索失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

ClassName                                                                                                                                                                

當標籤具備class屬性時也可以使用classname來定位,不過要注意class的值不是惟一的findElement方法返回匹配到的第一個元素

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      //classname
      WebElement text=driver.findElement(By.className("kw"));
      text.sendKeys("陸家嘴");
      WebElement button=driver.findElement(By.className("btn"));
      button.click();
          
      if(driver.getTitle().contains("陸家嘴"))
          System.out.print("搜索成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("搜索失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

Xpath                                                                                                                                                                        

xpath相關教程能夠參考w3school上的教程,爲了程序的統一性,平時工做中我都是使用xpath來定位元素的

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      //xpath
      WebElement text=driver.findElement(By.xpath("//input[@id='glb_search0']"));
      text.sendKeys("陸家嘴");
      WebElement button=driver.findElement(By.xpath("//input[@id='btnSubmit']"));
      button.click();
          
      if(driver.getTitle().contains("陸家嘴"))
          System.out.print("搜索成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("搜索失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

CssSelector                                                                                                                                                               

CssSelector教程能夠參考css3-selectors,CssSelector和xpath應該是實際工做中用的最多的定位方法了,二者沒有優劣之分,看我的喜愛吧。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      //cssSelector
      WebElement text=driver.findElement(By.cssSelector("input[id='glb_search0']"));
      text.sendKeys("陸家嘴");
      WebElement button=driver.findElement(By.cssSelector("input[id='btnSubmit']"));
      button.click();
          
      if(driver.getTitle().contains("陸家嘴"))
          System.out.print("搜索成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("搜索失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

LinkText和PartialLinkText                                                                                                                                       

LinkText和PartialLinkText用來定位網頁中的超連接,須要a標籤中的所有或部份內容便可。例如,須要訪問熱門版塊中的古美羅陽能夠這樣定位

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      //linkText
      WebElement a=driver.findElement(By.linkText("古美羅陽"));
      a.click();
      //partialLinkText
      //WebElement a=driver.findElement(By.partialLinkText("古美"));
      //a.click();
      if(driver.getTitle().contains("古美羅陽"))
          System.out.print("訪問成功,當前頁面爲"+driver.getTitle());
      else
          System.out.print("訪問失敗,當前頁面爲"+driver.getTitle());
      
      driver.quit();     
  }  
}

層級定位                                                                                                                                                                     

webdriver提供了層級定位的方式即經過父元素訪問其子元素,好比,輸出熱門版塊下的全部版塊

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;  
import org.openqa.selenium.chrome.ChromeDriver;  
import org.openqa.selenium.WebElement;
 
public class NewTest  
{  
  public static void main(String[] args)  
  {    
      System.setProperty("webdriver.chrome.driver",
      "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.get("http://anjuke.com");
      
      
      WebElement element=driver.findElement(By.xpath("//div[@id='content_Rd0']/dl[@class='dl0']/dd"));
      
      List<WebElement> links=element.findElements(By.tagName("a"));
      
      for(int index=0;index<links.size();index++){
          System.out.println(links.get(index).getAttribute("text"));
      }      
      driver.quit();     
  }  
}
相關文章
相關標籤/搜索