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();     
  }  
}
相关文章
相关标签/搜索