先看一看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. Differential Geometry之第八章常Gauss曲率曲面

    第八章.常Gauss曲率曲面 1.常正Gauss曲率曲面 2.常负Gauss曲率曲面与Sine-Gordon方程 3.Hilbert定理 4.Backlund变换 4.1.线汇与焦曲面 4.2.Bac ...

  2. Unity四元数和旋转

    四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转. ...

  3. php -- php的事务处理

    MYSQL的事务处理主要有两种方法. 1.用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mys ...

  4. git把任意代码提交到已存在的github库中

    git init git add . git remote add origin 远程urlgit branch --set-upstream-to=origin/mastergit pull --a ...

  5. hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. JavaScript入门之函数返回值

    函数返回值 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  7. 关于ie中实现弹性盒模型-我的css

    css3中的弹性盒模型大家都不陌生,但是能否在ie6中实现呢?第三方库中涉及到的页少之又少,也有一部分css框架中支持各种布局,下面给出我用的盒模型样式(为了以后copy方便而已): /******* ...

  8. Linux命令之乐--curl

    参数: -I   获取头部信息 -s/--silent      Silent mode. Don't output anything 沉默模式 --connect-timeout <secon ...

  9. cocos2d-x常用工具

    这些工具平常也用到,不过没有像这样整理出来,这是我在网上看到的.就记录一下. 位图字体工具Bitmap Font Tools BMFont (Windows)FonteditorGlyph Desig ...

  10. JavaScript面向对象OOP思想Class系统

    JavaScript的Class模块,纯天然无依赖,只有2k大小,快速高效,让我们优雅的面向对象... | |目录 1源码:jClass.js 2源码:jClass.min.js 3构建一个类 4访问 ...