利用Selenium在做前端UI自动化的时候,在元素定位方面主要使用了XPATH和jQuery两种方法。XPATH作为主要定位手段,jQuery作为补充定位手段。因为在通过XPATH进行定位的时候,Selenium是通过游览器原生的API进行操作,更接近模拟用户的操作;而通过jQuery作为定位的时候,实质是向游览器发送一段JavaScript代码,虽然可以达到目的,但模拟效果不如前者。

以下列举了一些常用的定位写法。

  • 通过id定位元素
<div class="input-outer" data-render="true">
<input type="text" name="templateName2" id="tempdata" size="20" maxlength="20" class="input tuiRequired tuiUpper tuiTrim myRule" value="">
</div>

jQuery写法: $("input#tempdata")

XPATH写法: //input[@id="tempdata"]

  • 通过class定位元素
<span class="icon sm icon-cross hover"></span>

jQuery写法: $("span.icon.sm.icon-cross.hover")

XPATH写法: //span[@class="icon sm icon-cross hover"]

  • 通过文本内容定位元素
<span class="name">CA模板管理</span>

jQuery写法: $("span:contains('CA模板管理')")

XPATH写法: //span[contains(text(),"CA模板管理")]

  • 多属性组合定位元素
<div class="tab-title">模板规则列表</div>

定位思路:通过class和文本内容定位元素

jQuery写法: $("div.tab-title:contains('模板规则列表')")

XPATH写法: //div[@class="tab-title" and contains(text(),"模板规则列表")]

  • 匹配子元素
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
<div class="x-ctrl x-close">
<span class="icon sm icon-cross hover">A</span>
</div>

定位第二个A的思路:两个A的父元素不同,通过父元素定位子元素

写法1:

jQuery写法: $("div.x-ctrl.x-close > span.icon.sm.icon-cross.hover")

XPATH写法: //div[@class="x-ctrl x-close"]/span[@class="icon sm icon-cross hover"]

写法2:

jQuery写法: $("div.x-ctrl.x-close").children("span.icon.sm.icon-cross.hover")

XPATH写法: //div[@class="x-ctrl x-close"]/child::span[@class="icon sm icon-cross hover"]

  • 匹配到的元素的第一个
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
<div class="x-ctrl x-close">
<span class="icon sm icon-cross hover">A</span>
</div>

定位第一个A

jQuery写法一: $("span.icon.sm.icon-cross.hover").first()

jQuery写法二: $("span.icon.sm.icon-cross.hover").eq(0)

XPATH写法: (//span[@class="icon sm icon-cross hover"])[1]

  • 匹配到的元素的最后一个
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
<div class="x-ctrl x-close">
<span class="icon sm icon-cross hover">A</span>
</div>

定位最后一个A

jQuery写法一: $("span.icon.sm.icon-cross.hover").last()

jQuery写法二: $("span.icon.sm.icon-cross.hover").eq(-1)

XPATH写法: (//span[@class="icon sm icon-cross hover"])[last()]

  • 匹配到的元素的倒数第二个
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
<div class="x-ctrl x-close">
<span class="icon sm icon-cross hover">A</span>
</div>
<div class="y-ctrl y-close">
<span class="icon sm icon-cross hover">A</span>
</div>

定位倒数第二个A

jQuery写法: $("span.icon.sm.icon-cross.hover").eq(-2)

XPATH写法: (//span[@class="icon sm icon-cross hover"])[last()-1]

  • 匹配当前元素的后代元素(子、孙等)
<div class="x-window">
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
</div>
<div class="y-window">
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
</div>
<div class="z-window">
<div class="h-ctrl h-close">
<span class="icon sm icon-cross hover">A</span>
</div>
</div>

定位中间的A

jQuery写法: $("div.y-window").find("span.icon.sm.icon-cross.hover")

XPATH写法: //div[@class="y-window"]/descendant::span[@class="icon sm icon-cross hover"]

  • 通过同级元素进行匹配
<div class="x-ctrl x-close">
<span class="icon sm icon-cross hover">B</span>
<div class="h-focus">
<span class="icon sm icon-cross hover">A</span>
</div>
</div>
<div class="x-ctrl x-close">
<span class="icon sm icon-cross hover">C</span>
<div class="h-focus">
<span class="icon sm icon-cross hover">A</span>
</div>
</div>

定位第二个A

jQuery写法: $("span:contains('C')").siblings("div.h-focus").children("span:contains('A')")

XPATH写法: //span[contains(text(),"C")]/following-sibling::div[@class="h-focus"]/span[contains(text(),"A")]

  • 稍微复杂一点的定位
<div class="x-window">
<td class="rule">
<span>A</span>
</td>
<td class="rule">
<div class="button">"控制按钮"</div>
</td>
</td>
<div class="x-window">
<td class="rule">
<span>B</span>
</td>
<td class="rule">
<div class="button">"控制按钮"</div>
</td>
</td>

举个例子,比如说页面上的A和B元素是动态的,但是有一个规律,A或者B的父元素的同级元素一定有一个"控制按钮"的子元素。

定位 "控制按钮"

jQuery写法: $("span:contains('B')").parent("td.rule").siblings("td").children("div:contains('控制按钮')")

XPATH写法: //span[contains(text(),"B")]/parent::td[@class="rule"]/preceding-sibling::td/child::div[contains(text(),"控制按钮")]

注:以上只是在工作时遇到比较典型的元素定位进行的举例,定位方式不是唯一,可能有多重定位方式。更多的定位方式请参考jQuery语法和XPath语法。

利用Xpath和jQuery进行元素定位示例的更多相关文章

  1. jquery 未来元素事件示例 on() delegate() live()

    jquery 1.7版后建议使用on() $(document).on("click","#green",function(){$(this).after('& ...

  2. 【WEB自动化】【第一节】【Xpath和CSS元素定位】

    目前自动化测试开始投入WEB测试,使用RF及其selenium库,模拟对WEB页面进行操作,此过程中首先面对的问题就是对WEB页面元素的定位,几乎所有的关键字都需要传入特定的WEB页面元素,因此掌握常 ...

  3. Selenium2学习-009-WebUI自动化实战实例-007-Selenium 8种元素定位实战实例源代码(百度首页搜索录入框及登录链接)

    此 文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,通过 ID.name.xpath.cssSelector.linkText.className.partialLinkTe ...

  4. Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」

    1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...

  5. selenium+python自动化之元素定位

    自动化按步骤拆分的话,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇接下来讲基本的八种元素定位方法.说的通俗一点,就是教大家找对象. ...

  6. 4、通过uiautomatorviewer实现appium元素定位

    熟悉selenium自动化的小伙伴应该知道WebDriver 提供了八种元素定位方法: idnameclass nametag namelink textpartial link textxpathc ...

  7. Selenium2学习-002-Selenium2 Web 元素定位及 XPath 编写演示示例

    此文主要对 Selenium2 的 Web 元素定位及 XPath 编写示例,敬请各位亲们参阅,共同探讨.若有不足之处,敬请各位大神指正,不胜感激! 通过 Firefox(火狐)浏览器的插件 Fire ...

  8. Robot Framework与Web界面自动化测试学习笔记:利用xpath定位元素

    在rf中,利用selinum2的关键字进行用例编写时,很多关键字的参数是html元素的定位标识. 最简单的方式,是通过id 或name来描述元素定位信息,如 click  button    id=l ...

  9. jquery的相对父元素和相对文档定位示例代码

    在开发jquery时候经常需要用到定位,有相对父元素定位和相对文档定位,本文为此总结下,有需要的朋友可以参考下 在开发jquery时候经常需要用到定位,这里概括两种定位: 1.相对父元素定位: $(& ...

随机推荐

  1. propagation属性的7个传播行为

    关于propagation属性的7个传播行为 REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务.这是默认值.即有事务 ...

  2. grails一对多双向关联

    前面分享了一些学习grails的心得,可是grails的知识还远不止这些,这次整理了一点有关grails一对多双向关联关系的知识.我认为这样的关联用的地方太多了,这次准备的样例是城市和区域的相关样例. ...

  3. [Java]LeetCode57 Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  4. storm 并行度

    1个worker进程运行的是1个topology的子集(注:不会出现1个worker为多个topology服务).1个worker进程会启动1个或多个executor线程来运行1个topology的c ...

  5. bzoj2503 相框——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 思路题: 首先,这种问题应该注意到答案只跟度数有关,跟其他什么连接方法之类的完全无关: ...

  6. Section %post does not end with %end

    Section %post does not end with %end Exception AttributeError: "NoneType" object no attrib ...

  7. Win7的虚拟Wi-Fi

    前几天无意中发现,Win7的硬件驱动里有个叫Microsoft Virtual WiFi Miniport Adapter的东东,从网上查了一下,可以用来组建临时网络,共享Internet.一块无线网 ...

  8. java反射机制学习小结

    之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...

  9. MAC软连接

    在mac上不设置环境变量有的时候也可以直接就访问到了某些文件.这个是为什么呢?答案是用了软连接. 1 查看加载文件 可以使用cat命令查看paths文件 cat etc/paths /usr/loca ...

  10. pinpoint 磁盘不足的坑

    观察 pinpoint hbase 数据存储目录default中各个表的大小 TraceV2 15G ApplicationTraceIndex 15G major_compact的操作目的 合并文件 ...