先看一看xpath的语法

我们将在下面的例子中使用这个 XML 文档。

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book> <book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book> </bookstore>

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

问题引入:

用Selenium IDE录制后的脚本如下:

driver.findElement(By.name("pass")).clear();

driver.findElement(By.name("pass")).sendKeys("密 码");

driver.findElement(By.id("passwords")).clear();

driver.findElement(By.id("passwords")).sendKeys("123456");

回放的时候,页面非常难定位,需要很长时间才能找到密码框并输入密码,如果超时了找不到就会报错。

解决方案:

既然有时候能回放成功,有时候又找不到页面元素,那肯定是这个元素定位不够准确,所以在查找的时候会消耗很长时间,那么通过xpah定位是否可以?

Xpath查找元素对象时有这样一种定位方式,即通过//定位,详情请参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

比如这里密码框是输入框input,想要查找input的位置可以通过//input来实现,如果只是//input则可能会定位到多个input元素,此时就需要通过键值对更精确的定位,语法就是//input[@key=value],即://input[@name='pass']

driver.findElement(By.xpath("//input[@name='pass']")).clear();

driver.findElement(By.xpath("//input[@name='pass']")).sendKeys("密 码");

driver.findElement(By.xpath("//input[@id= passwords]")).clear();

driver.findElement(By.xpath("//input[@id= passwords]")).sendKeys("123456");

重新回放,时间仍然很长,看来通过一个元素键值对定位是不可靠的,那能不能通过多个元素呢?就跟QTP中的高级描述性编程一样。那xpath的语法是什么,多个元素键值对怎么连接到一起呢?

首先查找name=pass的这个元素的另外一个元素键值对:class= textfild,用这两个定位一下试试看。

driver.findElement(By.xpath("//input[@name='pass' and @class=’ textfild’]")).clear();

driver.findElement(By.xpath("//input[@name='pass' and @class=’ textfild’]")).sendKeys("密 码");

driver.findElement(By.xpath("//input[@id= passwords and @class=’ textfild required’]")).clear();

driver.findElement(By.xpath("//input[@id=passwords and @class=’textfild required’]")).sendKes(“12..”);

再回访,速度果然快了,很快便识别到了密码框的位置,并且进行了输入。

关于xpath 查找元素还可以通过contains(一个字符串查找函数)来实现,语法是

//input[contains(@id,vakue) and contains(@id,value)],此中的id和value就是定位input元素的键值对

例如:

//input[contains(@class,'textfild') andcontains(@name,'pass')]

那最后经过整合和简化,4句的代码可简化为以下两句

driver.findElement(By.xpath("//input[contains(@class,'textfild') andcontains(@name,'pass')]")).clear();

driver.findElement(By.xpath("//input[@id='passwords' and @class='textfild required' and @type='password']")).sendKeys("123456");

为什么能简化为2行呢,看上面的截图,其实一上来的时候密码框里有“密码”两个字,当鼠标移入密码框获取焦点以后,“密码”文字消失,用户就可以输入自己真正的密码。所以

driver.findElement(By.xpath("//input[@name='pass' and @class=’ textfild’]")).sendKeys("密 码");

这句话是我们不需要的。因为当密码框获取焦点以后,“密码”文字就消失了,所以下面的清空也没有必要存在了

driver.findElement(By.xpath("//input[@id= passwords and @class=’ textfild required’]")).clear();

这样,代码就简化了。

By.Xpath快速定位页面元素常用方法的更多相关文章

  1. web自动化测试---xpath方式定位页面元素

    在实际应用中,如果存在多个相同元素,包括属性相同时,一般会选用这种方式,当然如果定位属性唯一的话,也是可以使用的,不过这种方式没有像id,tag,name等容易理解,下面讲下xpath定位元素的方法 ...

  2. 定位页面元素之xpath详解以及定位不到测试元素的常见问题

    一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是 ...

  3. 使用CSS选择器定位页面元素

    摘录:http://blog.csdn.net/defectfinder/article/details/51734690 CSS选择器也是一个非常好用的定位元素的方法,甚至比Xpath强大.在自动化 ...

  4. Selenium 定位页面元素 以及总结页面常见的元素 以及总结用户常见的操作

    1. Selenium常见的定位页面元素 2.页面常见的元素 3. 用户常见的操作 1. Selenium常见的定位页面元素 driver.findElement(By.id());driver.fi ...

  5. selenium第三课(selenium八种定位页面元素方法)

    selenium webdriver进行元素定位时,通过seleniumAPI官方介绍,获取页面元素的方式一共有以下八种方式,现按照常用→不常用的顺序分别介绍一下. 官方api地址:https://s ...

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

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

  7. Python+Selenium自动化-定位页面元素的八种方法

    Python+Selenium自动化-定位页面元素的八种方法   本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...

  8. selenium定位页面元素的一件趣事

    PS:本博客selenium分类不会记载selenium打开浏览器,定位元素,操作页面元素,切换到iframe,处理alter.confirm和prompt对话框这些在网上随处可见的信息:本博客此分类 ...

  9. FireFox浏览器-xpath快速定位插件:Xpath Checker

    FireFox浏览器-xpath快速定位插件:Xpath Checker 插件截图:

随机推荐

  1. MyBatis 是一款优秀的持久层框架

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  2. Merging an upstream repository into your fork

    1. Check out the branch you wish to merge to. Usually, you will merge into master. $ git checkout ma ...

  3. [转]seajs详解

    [转]seajs详解 SeaJS 是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(kk:模块可按需加载或全部加载). SeaJS ...

  4. Sublime Text 模版插件: SublimeTmpl

    开发者的插件介绍页面:http://www.fantxi.com/blog/archives/sublime-template-engine-sublimetmpl/ 写了个sublime的模版插件, ...

  5. 解析IE, FireFox, Opera 浏览器支持Alpha透明的方法

    先请看如下代码: filter:alpha(opacity=50);       /* IE */  -moz-opacity:0.5;              /* Moz + FF */  op ...

  6. Laravel5.1 关联模型之后操作

    之前写过关于模型关联的笔记,但是模型关联好后的一些使用没有介绍,今天补上 1 写入关联模型 1.1 使用Save方法(一对多) 我们准备了两个模型:Post和Comment. 它们的关系是一对多关系. ...

  7. 一次清除SQL SERVER错误日志的体会!

    之前在UAT环境搭建的SQL SERVER 2008 R2数据库一直用得比较正常,但最近发现在Sharepoint中不能进行任何操作了,开始以为是什么配置出了问题(因为一直在研究一些新的应用和集成,需 ...

  8. 剑指 offer set 21 圆圈中最后剩下的数字

    思路 1. 经典解法是用环形链表模拟圆圈, 然后每次减少一个节点. 时间复杂度为 o(mn), 空间复杂度为 o(n) 2. 转化成数学问题, 递推公式决定下一个元素. 时间复杂度为 o(n), 空间 ...

  9. ios 开发之 -- UILabel的text竖行显示

    让UILabel的内容竖行显示,我经常用一下两种方式: 第一种:使用换行符 \n label.text = @"请\n竖\n直\n方\n向\n排\n列"; label.number ...

  10. 说说M451例程讲解之定时器

    关于定时器 相信很多人都不会陌生,无论是51还是32,任何微控制器,都会有定时器 定时器控制器包含 4 组 32-位定时器,TIMER0~TIMER3,提供用户便捷的计数定时功能.定时器可执行很多功能 ...