selenium webdriver(2)—页面对象定位

webdriver的元素定位很灵活,提供了多种定位方式:

  • Id
  • LinkText
  • PartialLinkText
  • Name
  • TagName
  • Xpath
  • ClassName
  • CssSelector

这些方法可以在org.openqa.selenium.By中找到,下面一一道来;

假如有这样的需求:登录安居客网站,搜索陆家嘴附近的二手房源,网页是这样的

这个需求涉及到一个输入框和一个提交按钮,先查看网页源码

在输入框中输入“陆家嘴”然后点击“二手房”按钮,如果能跳转到陆家嘴相关页面就完成了这个需求,我们尝试用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();     
  }  
}
时间: 2024-11-05 12:08:32

selenium webdriver(2)—页面对象定位的相关文章

java selenium webdriver实战 页面元素定位

自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选择下拉列表中的那个下拉列表或者输入框中输入什么值 其中定位页面元素是三步骤的第一步,本篇介绍常用的定位方法 webDriver对象的findElement函数用于定位一个页面元素,findElements函数用户定位多个页面元素,定位的页面元素使用webElement对象进行存储 常用的方法有: 1

【selenium学习笔记】webdriver进行页面元素定位

[selenium学习笔记]webdriver进行页面元素定位 进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver就是利用元素的这些属性来进行定位的. 可以用于定位的常用的元素属性: id name class name tag name link text partial link te

Python3.x:Selenium中的webdriver进行页面元素定位

Python3.x:Selenium中的webdriver进行页面元素定位 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver就是利用元素的这些属性来进行定位的. 可以用于定位的常用的元素属性: id name class name tag name link text partial link text xpath css selector 对应于webdriver中的定位一个元素方法分别是: driver.find_e

Selenium webdriver 学习总结-元素定位

Selenium webdriver 学习总结-元素定位 webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一种办法. 1.工具选择:在我们开发测试脚本的过程中各个浏览器给我们也提供了方便定位元素的工具,我比较喜欢使用firefox的firebug工具,也是目前很多开发测试人员比较热衷的选择,原因是firefox是唯一能够集成selenium IDE

Selenium弹出新页面无法定位元素问题(Unable to locate element)--多窗口切换

最近学习到多窗口切换,在页面操作过程中有时点击某个链接会弹出新的窗口,这时需要先切换到新窗口才能对其进行操作.Webdriver提供了switch_to.window( ) 方法实现在不同窗口中切换. 查阅相关资料,得到两种方法来定位到当前页面: 方法一: browser.switch_to_window(browser.window_handles[1]) 方法二:直接定位当前最新弹出的窗口 for handle in browser.window_handles:#方法二,始终获得当前最后的

python+selenium—webdriver入门(二)

本文中主要介绍webdriver常见的对象定位方法: 一.对象定位的目的 二.常见的对象定位方法 一.对象定位的目的: 1.操作对象 2.获得对象的属性,如:对象的class属性.name属性等 3.获得对象的text 4.获取对象的数量 二.常见的对象定位方法: 1.find element方法: 1.id 2.name 3.class name 4.tag name 5.css定位 6.xpath定位 7.link text 8.partial link text 1 # !/usr/bin

Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析

加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链接等.比如在用户名输入框和密码输入框输入正确的用户名和密码,然后点击登录按钮进行登录.在Selenium自动化中,Selenium提供多种API来对HTML元素进行操作,对于每个HTML元素,需要一个可以标识它的标识符,在Selenium中称之为定位器,Selenium支持多种不同类型的定位器,有标

Selenium Webdriver元素定位的八种常用方式

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下. 1. By.name() 假设我们要测试的页面源码如下: <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><

selenium测试框架篇,页面对象和元素对象的管理

前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对