利用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. hdu_1037_Keep on Truckin'_201311021600

    Keep on Truckin' Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. RPC服务框架探索之Thrift

    前言架构服务化后,需要实现一套方便调用各服务的框架,现在开源如日中天,优先会寻找开源实现,如果没有合适自家公司业务的,才会考虑从零开发,尤其是一切以KPI为准绳的公司,谁会跟钱过不去?N个月之前,公司 ...

  3. 网易杭研后台技术中心的博客 -MYSQL :OOM

    http://backend.blog.163.com/blog/#m=0&t=3&c=mysql

  4. jquery 的ajax无刷新上传文件之后,页面还是会莫名的刷新-----解决办法

    文件上传用到全局数组: $_FILES 只需要把下面的 <button onclick="post()">提交</button> 改为 <input ...

  5. 【POJ 1201】 Intervals(差分约束系统)

    [POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: ...

  6. [SDOI 2013] 直径

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3124 [算法] 树的直径 [代码] #include<bits/stdc++. ...

  7. hash哈希

    我复习的时候,突然发现没写过hash算法,惊讶!!!赶紧补一下. 把字符串看成base进制的数.Hash值比较就是为了判断是否有相同的字符串.(base是自己定义的大于26的质数,个人认为大一点比较好 ...

  8. org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.demo.pojo.IdCard

    转自:https://blog.csdn.net/zheng0518/article/details/11029733 TestStudent.testSchemaExporttestSchemaEx ...

  9. SpringMVC之DispatcherServlet详解

    SpringMVC是一种基于请求启动的WEB框架,并且使用了前端控制器的设计模式,所有满足[WEB-INF/web.xml]文件中的[url-pattern]的匹配条件的请求,这些满足的请求都会交给这 ...

  10. bzoj3436: 小K的农场(差分约束)

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1575  Solved: 690[Submit][Status][Discus ...