By.Xpath快速定位页面元素常用方法
先看一看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快速定位页面元素常用方法的更多相关文章
- web自动化测试---xpath方式定位页面元素
在实际应用中,如果存在多个相同元素,包括属性相同时,一般会选用这种方式,当然如果定位属性唯一的话,也是可以使用的,不过这种方式没有像id,tag,name等容易理解,下面讲下xpath定位元素的方法 ...
- 定位页面元素之xpath详解以及定位不到测试元素的常见问题
一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是 ...
- 使用CSS选择器定位页面元素
摘录:http://blog.csdn.net/defectfinder/article/details/51734690 CSS选择器也是一个非常好用的定位元素的方法,甚至比Xpath强大.在自动化 ...
- Selenium 定位页面元素 以及总结页面常见的元素 以及总结用户常见的操作
1. Selenium常见的定位页面元素 2.页面常见的元素 3. 用户常见的操作 1. Selenium常见的定位页面元素 driver.findElement(By.id());driver.fi ...
- selenium第三课(selenium八种定位页面元素方法)
selenium webdriver进行元素定位时,通过seleniumAPI官方介绍,获取页面元素的方式一共有以下八种方式,现按照常用→不常用的顺序分别介绍一下. 官方api地址:https://s ...
- selenium webdriver学习(四)------------定位页面元素(转)
selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...
- Python+Selenium自动化-定位页面元素的八种方法
Python+Selenium自动化-定位页面元素的八种方法 本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...
- selenium定位页面元素的一件趣事
PS:本博客selenium分类不会记载selenium打开浏览器,定位元素,操作页面元素,切换到iframe,处理alter.confirm和prompt对话框这些在网上随处可见的信息:本博客此分类 ...
- FireFox浏览器-xpath快速定位插件:Xpath Checker
FireFox浏览器-xpath快速定位插件:Xpath Checker 插件截图:
随机推荐
- LodRunner实现大负载测试的四部曲(配置系统参数、配置LR、修改脚本、设置组策略)
见 http://www.51testing.com/?uid-97659-action-viewspace-itemid-210924 LoadRunner以下简称(LR)是目前业界最流行的压力测试 ...
- Angular ContentChild
contentchild // 使用方法 git clone https://git.oschina.net/mumu-osc/learn-component.git cd learn-compone ...
- XAML 中使用空格键(空白字符)
默认情况下,XAML折叠所有空白,这意味着包含空格.tab 键以及回车的长字符串将被转换为单个空格.而且,如果在一个元素内容之前或之后添加空白,这个空格将被完全忽略. 有时这并不是所期望的结果.例如, ...
- iOS开发之--FMDB的使用
在很多时候,我们会用到数据库,我们移动端使用的数据库,一般都是嵌入型数据库,是一种较轻型的数据库, 一般很多时候,大牛封装的FMDB的第三方,已经足够满足我们的需求了! 现在分享一下自己的学习心得,希 ...
- Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程
Erstudio8.0使用教程 打开ERstudio,点击新建出现如图对话框: 选择第一个,表示创建一个新的关系型 数据库模型 这里提一点数据库模型分为relational(关系)和dimension ...
- PMP 质量管理新7张图
亲和图.关联图.系统图.矩阵图.网络图.pdpc.矩阵数据分析法
- centos-iptables-scripts
author:headsen chen date:2018-06-04 11:20:38 notice:This article is created by headsen chen himsel ...
- C语言实现链表中结构体嵌套
1.首先,定义两个结构体,一个用于定义链表,一个用于定义数据 // 定义数据相关的结构体 typedef struct Student{ int stu_id; ]; }Stu; // 定义链表相关的 ...
- mysql状态分析之show global status
这里整理下mysql global status的相关命令,在计算监控数据的时候需要用到 一.慢查询 show variables like '%slow%'; +------------------ ...
- Exchange Port
Get-POPSettings-110 Get-IMAPSettings-143 Exchange Network Port References Exchange Server 2000 http: ...