最近总是有同学问我做页面自动化时,一些元素总是很难定位,这段时间脚本运行稳定,后面脚本运行越来越不行。我看了他们相关节点的定位,发现他们定位的节点方法过于死板,节点的xpath中含有不定项,后面版本页面改变了以后,原先的xpath就不可用了,导致脚本的不稳定。我经常强调,元素定位的原则就是不变,一定要围绕着一个不变的节点进行定位,xpath写出来一定要够短,越是短的xpath其中出现可变节点的概率越小,下面就介绍一下我在写定位元素中常用的三种定位方式。

获取弟节点-following-sibling::

如图所示:

这张图上是一个弹框,这种弹框是经常见到的,往往在一个页面中也会出现很多种,那么要点这个弹框中的确定按钮其实很简单,只要//span[text()="确定"]就可以了,但是随便一个弹框都可以这样定位,弹框里的内容变化了也无法及时发现。所以,我们定位的时候要把弹框内容加上,那么如果开发人员擅自更改了内容就会及时的被发现。

那么,如何定位这个按钮而且路径中要包含弹框的内容呢?这个地方就需要用到获取弟节点的方法:following-sibling::

    首先,我们要定位到这个弹框内容,即为://div[text()="加密内容不能为空!"]。然后我们再观察,我们要点击的节点在这个div节点的弟节点的孙节点内,那么我们就先定位到这个弟节点://div[text()="加密内容不能为空!"]/following-sibling::div。这样可以定位到这个节点的所有弟节点,然后再进行定位要点击的按钮,所以,最终的定位路径为//div[text()="加密内容不能为空!"]/following-sibling::div//span[text()="确定"]。

这样,两个关联起来后,有人更改任何一个的话,脚本均会报错。

获取兄节点:preceding-sibling::

如图所示:

这次要定位的一个节点是一个下拉框(图中标黄的节点),这个下拉框是一个可以点击的input节点,根据图片所示,在常规方法中会从上方寻找含有id的节点,那么就是那个form节点了,显而易见,如果这样定位下来,这个节点的xpath就应该写为://form[@id="saveform"]/div[3]/div[3]/span[2]/input[1]。不管这样对不对,这样写的弊端也是显而易见的,xpath很长,并且其中含有大量有角标的节点,由图所示,这个input节点在一个div下面,而这个div上方有很多一模一样的div,那么就是说有很多样子一样的控件挨在一起,这样后面版本中增加一个或者减少一个这样的控件也是很有可能的,一旦上面发生了变化,这个节点的定位就会失败。

这个问题是必须解决的,观察节点,发现离这个节点很近的一个input节点有一个name属性,而且这个name里的值一看就是唯一的,那么就应该围绕这个input节点来定位。

与弟节点的定位方法相同,首先定位这个有name的节点://input[@name="sne.sysLnNumAdmin.category2"]。然后在定位这个节点的兄节点,即最终节点的xpath为://input[@name="sne.sysLnNumAdmin.category2"]/preceding-sibling::input。

这样定位后,xpath的长度大幅度的缩短,并且里面不含有角标的节点,而且这两个节点离的非常近,如果删除必定会一起删除。

获取父节点以及混合应用:parent::

如图所示:

从上图可以看出,这次要定位的节点是一种常见的树状图的展开节点,就是那个省份前面的加号(图中标黄的节点)。

从节点上来看,这个也是很多初学者经常遇到的坑,这个span节点虽然看起来有一个id节点,从原则上来讲用id来定位即可,但是仔细观察的话就可以发现,这个节点后面的数字是随机生成的,也就是说有可能这次是这个id下次就不是了。

那么用传统的方法,会从上面有id的节点来找,也就是看起来靠谱的节点有一个ul节点,或者觉得不保险上面还有个含有id的div节点。但是会遇到子节点是动态的情况,导致xpath并不是很稳定。

那么,我们就需要寻找一个比较稳定的节点,可以看到这个节点下方紧挨着就有两个节点,他们有很明显的特征就是含有独特的标识,一个含有title=“山东省”,一个文字就是山东省。这两个节点均可以用来进行定位,这次我们选取下方的span节点。

决定了节点,那么观察得知需要定位的节点是这个span的父节点的兄节点,也就是他的大伯,那么就需要首先定位到他的父节点://span[text()="山东省"]/parent::a,然后再结合上面讲到的定位父节点的方法,那么最终的xpath就是://span[text()="山东省"]/parent::a/preceding-sibling::span。

这样写xpath的优点不言而喻,简洁、不含有可变节点,降低脚本出错的概率。

总结

这次介绍的三种xpath辅助定位方法和核心思想就是寻找要定位节点周围不变的节点,用其来进行定位需要的节点,缩短xpath的长度,避免可变节点的出现。

xpath中类似的辅助定位仍然有一些,比如/ancestor、/descendant等祖父、孙子节点,综合使用起来可以使得xpath的定位更加灵活、准确。

定位元素的父(parent::)、兄弟(following-sibling::、preceding-sibling::)节点相关推荐

  1. 在ios中fixed定位元素丢失,Date兼容NaN

    Aphorism Preface 差不多有半年没有更新blog了, 现在在新的公司适应了,最近喜得一千金,也慢慢适应了新的生活. 今天更新一篇关于最近遇到的 ios fixed定位元素丢失 bug i ...

  2. 相对定位android,appium相对位置定位元素----父节点/兄弟节点定位

    appium相对位置定位元素----父节点/兄弟节点定位 发布时间:2020-06-30 05:51:41 来源:51CTO 阅读:5620 作者:niedongri 讲一下定位手机app上元素时定位 ...

  3. jQuery中兄弟元素、子元素和父元素的获取

    我们这里主要总结jQuery中对某元素的兄弟元素.子元素和父元素的获取,原声的Javascript代码对这些元素的获取比较麻烦一些,而jQuery正好对这些方法进行封装,让我们更加方便的对这些元素进行 ...

  4. 怎么判断子元素距离父元素顶部位置_css子元素如何相对父元素定位?

    在css中,可以使用position属性,通过给父元素设置相对定位"position:relative;"样式,给子元素设置绝对定位"position:absolute; ...

  5. Vue中获取当前点击元素的父元素、子元素、兄弟元素

    Vue如何获取当前点击元素? 获取父元素.子元素.兄弟元素呢? 通过帮定点击事件: 例如: <button class="shanchu" @click="shan ...

  6. Vue.js如何获得兄弟元素,子元素,父元素(DOM操作)

    <button @click = "clickfun($event)">点击</button>methods: { clickfun(e) { // e.t ...

  7. Appium+python自动化(九)- 定位元素工具(义结金兰的两位异性兄弟)(超详解)...

    简介 环境搭建好了,其他方面的知识也准备的差不多了,那么我们就开始下一步元素定位,元素定位宏哥主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作. 此 ...

  8. 如何获取元素在父级div里的位置_关于元素的浮动你了解多少

    首先,在介绍什么是浮动之前我们先介绍一下html中元素的普通流布局方式.在普通流中,元素是按照它在 HTML 中的出现的先后顺序自上而下依次排列布局的,在排列过程中所有的行内元素水平排列,直到当行被占 ...

  9. Selenium使用xpath定位元素

    参考资料: [web自动化测试]xpath元素定位 核心用法 接下来是使用 xpath 必须掌握的核心知识点,只要掌握好这些知识点,基本上能定义到想要的元素. //input[@name='accou ...

最新文章

  1. Day19-File操作-创建 删除,文件过滤
  2. 05JavaScript中的流程控制
  3. 如何定义和建立架构?
  4. python动态绘图并保留之前绘图_[转]基于Python实现matplotlib中动态更新图片(交互式绘图)...
  5. Introduce Null Object(引入Null 对象)
  6. 5分钟搞定Loki告警多渠道接入
  7. 编译原理pl/0 c语言版 pl0.h文件
  8. 基于React的贪吃蛇游戏的设计与实现
  9. 美国AI公司宣称特制3D面具破解刷脸支付系统,支付宝、微信:能破解 我全赔...
  10. 网站性能测试指标:QPS、TPS、吞吐量、响应时间概述
  11. 高通-物理专线2.0新版资费计划
  12. linux如何拿到文件的返回值,linux 怎么判断文件挂载是否成功,根据什么样的返回值?...
  13. gulpsass安装配置
  14. Python渗透测试之流量分析:流量嗅探工具编程
  15. latex图像注释位置
  16. 数据血缘图谱升级方案设计与实现
  17. 文末福利|使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!
  18. Java必背基础词汇
  19. 一个计算机网络题目——给局域网分配合适的网络前缀。
  20. Spring Boot 2.0 配置图文教程

热门文章

  1. ffmpeg 音频混流--命令与代码说明
  2. IPhoneX网页布局
  3. 苹果企业账号申请记录
  4. CVPR2022《TransMix: Attend to Mix for Vision Transformers》
  5. 一键adb关闭系统更新 坚果手机_使用ADB工具彻底关闭爱国为系统更新
  6. c++ windows网络编程--udpSocket之recfrom()函数阻塞问题
  7. 机器学习_深度学习毕设题目汇总——MRI
  8. 秒建HTTP文件分享服务器方案,实现远程下载
  9. EasyRTC+EasyCVR相结合打造直播教学系统,在高等教育混合式教学中的应用
  10. 全网最硬核 Java 新内存模型解析与实验 - 1. 什么是 Java 内存模型