Selenium webdriver 学习总结-元素定位

webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一种办法。
  1、工具选择:在我们开发测试脚本的过程中各个浏览器给我们也提供了方便定位元素的工具,我比较喜欢使用firefox的firebug工具,也是目前很多开发测试人员比较热衷的选择,原因是firefox是唯一能够集成selenium IDE的浏览器,并且firebug给用户提供了丰富的扩展组件,我们可以根据自己的需要来选择,一般情况下,使用firebug+firefinder就足够使用了,firefinder支持xpath以及css选择器定位元素的功能,很方便帮助我们调试测试脚本
  2、元素定位的方法:findElement() 与 findElements()
  findElement() 该方法返回基于指定查询条件的webElement对象,或抛出不符合条件的异常  eg:driver.findElement(By.id("userID"));
  findElements() 该方法返回指定查询条件的WebElement的对象集合,或返回null
  3、WebElement对象提供的各种定位元素策略
ID:driver.findElement(By.id(<elementID>))
Name:driver.findElement(By.name(<elementName>))
className:driver.findElement(By.className(<elementClassName>))
tagName:driver.findElement(By.tagName(<htmlTagName>))
linkText:driver.findElement(By.linkText(<linkText>))
partialLinkText:driver.findElement(By.partialLinkText(<partialLinkText>))
css:driver.findElement(By.cssSelector(<cssSelector>))
xpath:driver.findElement(By.xpath(<xpathQuery>))
  4、webelement类提供了诸多方法,在我们开发脚本过程中如何选择最可靠,效率最高的方法,使用id,name是首选,因为他们在html标签中是唯一的,所以是最可靠的
  ID定位:driver.findElement(By.id("username"))
  name定位:driver.findElement(By.name("username"))
  class定位:driver.findElement(By.className("username"))
  多学一招:WebElement类支持查询子类元素,如果页面中存在重复元素,但在不同div中,我们可以先定位到其父元素,然后定位其子元素,方法如下:
  WebElement hello = driver.findElement(By.id("div1")).findElement(By.lindText("hello"));
  5、使用WebElements定位多个相似的元素,比如页面中存在五个单选按钮,他们有相同的class属性,值为:myRadio,我们想对五个按钮循环操作,我们可以把它们全部取出来放到集合中,然后做循环操作,如下:
List<WebElement> radios = driver.findElements(By.className("myRadio"));
for(int i = 0;i<radios.size();i++){
radios.get(i).click();
}
  其他定位方法与操作id,name类似,这里不再赘述,接下来我着重对css选择器与Xpath描述下
  一、WebDriver 的By类中提供了cssSelector()方法,该方法使用有以下几种形式:
  1、使用相对路径定位元素
  如,我们要定为DOM中的input元素,我们可以这样操作,不考虑其在DOM中的位置,但这样做存在一定弊端,当DOM中存在多个input元素时,该方法总返回DOM中的第一个元素,这并不是我们所期待的
  eg:WebElement username = driver.findElement(By.cssSelector("input"));
  另外,为了使用这种方法更准确的定位元素,我们可以结合该元素的其他属性来实现精确定位的目的
  a、结合id来定位,driver.findElement(By.cssSelector("input#username")); 在标签与id之间使用#连接,如果对css了解的朋友一看就知道为什么会这样写了,不了解也没关系,只要记住这种写法就OK了
  另外该方法也可简写为driver.findElement(By.cssSelector("#username")); 有点儿类似于id选择器

b、使用元素的任何属性来定位元素
  driver.findElement(By.cssSelector("标签名[属性名='属性值']"));
  c、匹配部分属性值
^=        driver.findElement(By.cssSelector("标签名[属性名^='xxx']"));  匹配属性值以xxx开头的元素
$=        driver.findElement(By.cssSelector("标签名[属性名$='xxx']"));  匹配属性值以xxx结尾的元素
*=         driver.findElement(By.cssSelector("标签名[属性名^='xxx']"));  匹配属性值包含xxx的元素
  2、使用相对+绝对路径方法,这里是我自己定义的方法,方便记忆,的确也是这样来实现的
  driver.findElement(By.cssSelector("div#login>input"))   该方法中“div#login>input” 首先通过相对路径定位到id为login的div元素,然后查找其子元素input(绝对路径)
  二、使用xpath定位元素,相比cssSelector,xpath是我比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能
  1、使用绝对路径定位元素
  driver.findElement(By.xpath("/html/body/div/form/input"))
  2、使用相对路径定位元素
  driver.findElement(By.xpath("//input"))   返回查找到的第一个符合条件的元素
  3、使用索引定位元素,索引的初始值为1,注意与数组等区分开
  driver.findElement(By.xpath("//input[2]"))   返回查找到的第二个符合条件的元素
  4、结合属性值来定位元素
  driver.findElement(By.xpath("//input[@id='username']"));
  driver.findElement(By.xpath("//img[@alt='flowr']"));
  5、使用逻辑运算符,结合属性值定位元素,and与or
  driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));
  6、使用属性名来定位元素
  driver.findElement(By.xpath("//input[@button]"))
  7、类似于cssSlector,使用部分属性值匹配元素
starts-with()    driver.findElement(By.xpath("//input[stars-with(@id,'user')]"))
ends-with        driver.findElement(By.xpath("//input[ends-with(@id,'name')]"))
contains()        driver.findElement(By.xpath("//input[contains(@id,"ernam")]"))
  8、使用任意属性值匹配元素
  driver.findElement(By.xpath("//input[@*='username']"))
  9、使用xpath轴来定位元素
  这里略了,详见w3school.com
  三、使用innerText定位元素
  1、使用cssSelector查找innerText定位元素
  driver.findElement(By.cssSelector("span[textContent='新闻']"));
  2、使用xpath的text函数
  driver.findElement(By.xpath("//span[contains(text(),'hello')]"))   包含匹配
  driver.findElement(By.xpath("//span[text()='新闻']"))     绝对匹配
 
转自:http://www.blogjava.net/qileilove/archive/2013/12/25/408002.html

Selenium webdriver 学习总结-元素定位的更多相关文章

  1. java selenium webdriver实战 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  2. (java)selenium webdriver学习--通过id、name定位,输入内容,搜索,关闭操作、通过tagname查找元素

    selenium webdriver学习--通过id.name定位,输入内容,搜索,关闭操作:通过tagname查找元素 打开谷歌浏览器,输入不同的网站,搜索框的定位含有不同元素(有时为id,有时为n ...

  3. selenium webdriver学习(四)------------定位页面元素(转)

    selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...

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

    Python3.x:Selenium中的webdriver进行页面元素定位 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver ...

  5. selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面(转)

    selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面 博客分类: Selenium-webdriver 元素拖放drag and drop  Q群里 ...

  6. [小北De编程手记] : Lesson 03 - Selenium For C# 之 元素定位

    无论哪一种自动化测试的驱动框架(基于B/S,桌面应用,还是手机App).都应当具有一套优秀的元素定位技术.通常的自动化测试流程也可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作和验证元 ...

  7. (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出

    selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...

  8. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

  9. (java)selenium webdriver学习,选择模块,点击下一页,获取当前url

    selenium webdriver学习,选择模块,点击下一页,获取当前url 查找下一页有多种方法,这里列举两种: isSelected()函数用于判断是否点击选中,返回Boolean类型 impo ...

随机推荐

  1. [转]Java中的对象和对象引用实例浅析

    在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别 ...

  2. Java基础-关键字-final

    在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继 ...

  3. linux中为什么已经是root用户仍不能执行程序

    .sh文件 ,获取root权限,提示Permission Denied. 这是因为文件本身没有可执行特性. chmod +x a.sh chmod 755 a.sh

  4. RequestMethod 相关

    Http协议的Delete和Put方法是做什么的?怎么用? RequestMethod 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一般来说,Web服务器默认的只支持Pos ...

  5. win7下面完全删除mysql

    今天因为一些原因重装完成mysql的时候,在启动mysql服务的时候,一直卡死在哪快.最后整的都无语了. 在google里搜索:mysql安装失败 ,会找到一堆类似的问题汇总,其实上面说的方法都是正确 ...

  6. easyui 动态修改窗口title

    http://blog.csdn.net/liu251890347/article/details/39292307?utm_source=tuicool 使用easyui作为前台框架极大的节省了项目 ...

  7. 回顾bidirectional path tracing

    最近因为研究需要,回顾了一下BDPT,主要看VEACH的那篇论文,同时参考了pbrt,mitsuba的实现,自己写了一份新的bdpt实现.以前实现的那一份BDPT不是基于物理的,而且无法处理镜面和透明 ...

  8. CSS 兼容 总结

    1> margin加倍的问题 设置为float的div在ie下设置的margin会加倍.这是一个ie6都存在的bug. 解决方案是在这个div里面加上display:inline; 例如: &l ...

  9. Linux下使用popen()执行shell命令

    转载 http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html 简单说一下popen()函数 函数定义 #include < ...

  10. Memcache的部署和使用(转)

    一.memcache简介 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力. Mem ...