selenium webdriver 页面css和xpath定位

2023-05-16

对于html来说,不管用什么浏览器打开,他的架构是不变的,所以对于编写自动化测试程序来说,基于什么浏览器开发,差异不大,所以这里推荐使用chrome 65或以后版本浏览器,之所以推荐这个浏览器,是因为它可以不用安装任何插件,就可以很方便的提供定位相关的功能。

chrome浏览器可以用F12调出调试窗口,用ctrl + F可以调出选择器和xpath搜索输入框,在搜索时可以显示搜索到结果的个数,如果搜索的结果个数比较多,说明对应的选择器或者xpath有问题,因为结果不唯一,除非希望保存的结果是一个集合。

一、CSS选择器定位

1.使用标签名查找元素

这个比较简单,但是基本上不会用。也就是说如果一个页面中该类型的标签只有一个,那么只要定位该标签就好了。比如一个页面中只有一个input标签,那么只要将这个个input用于定位就行了

2. 使用ID选择器查找元素

缺点:

a. 如果页面的ID不是惟一的,或者会动态变化,不太适合使用这个选择器

b. 如果ID是惟一的,但是对应元素的其他属性是变化的,比如name,text等会变化,也不太适合使用多条件判断

需要注意的是,在元素定位过程中,如果定位的元素不是惟一的,都是会出错的,除非查找的是多个元素组成的list

语法:  tag[attribute='value']

tag就是html中的标签,可以是input,p, a等等

attribute标识属性,对应css选择器来说,它的属性是id或者class

value就是属性的值,一般用单引号包含

  <div id="bdSug_1521883224738" class="bdSug_wpr" style="display: none;"></div>

比如需要定位这一行,可以使用:

#bdSug_1521883224738

div[id='bdSug_1521883224738']

div#bdSug_1521883224738

一般来说,一个DOM的ID都是惟一的,但是如果多个不同的标签使用了相同的ID,那么可以在定位的时候也指定标签,以保持定位惟一,这里需要注意的是,虽然在匹配id的时候可以不用完全匹配,但是在写代码的时候尽量完整

3. 使用类选择器查找元素

ID用点标识,class用#标识

(1)完全匹配

<div id="myCarousel" class="slide" data-ride="carousel">

#myCarousel 或 div[id='myCarousel'] 或 div#myCarousel

.slide 或 div[class='slide'] 或 div.slide

<div class="carousel-item csdn-tracking-statistics" data-mod="popu_465" data-dsm="post">

div[class='carousel-item csdn-tracking-statistics']

这里需要注意的是,class这种写法并不支持部分匹配,如果上式写成div[class='carousel-item']将会定位失败,即使少个尾部空格也不行。

这种写法要求写出标签中的所有class完整值

(2)部分匹配

那如果一个位置上包含多个class属性的时候应该怎么定位呢?可以使用追加属性的方法。

.carousel-item.csdn-tracking-statistics

这表示满足第一个class的同时满足第二个class属性的值。如果这还不能惟一定位,那就只好找相对定位的方法了

这种写法要求写出标签中的部分class完整值

(3)通配

上面两种匹配方式都要求用户在匹配class的时候使用完整的class属性值,但是通配可以做到更灵活的匹配

^表示文本开头

$表示文本结尾

*表示任意文本

语法: tag[attribute<wildcard>='value']   其中wildcard表示通配符

<div class="carousel-inner" role="listbox">
<div class="carousel-item csdn-tracking-statistics" data-mod="popu_465" data-dsm="post">
<div class="carousel-item  carousel-inner csdn-tracking-statistics" data-mod="popu_465" data-dsm="post">

如果要匹配这三行可以用  div[class^='carousel']

如果要匹配后面两行用 div[class$='statistics']

如果要匹配其中包含inner的行,用 div[class*='inner']


上面介绍了使用id和class进行定位,其实这并不是最厉害的,厉害的是这两个属性的定位方法可以拓展到其他属性上,比如:

<link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.imooc.com/">

可以使用 link[rel^='alt'] 进行定位

<meta name="mobile-agent" content="format=xhtml" ;="" url="https://m.imooc.com/">

使用 mata[name$='agent'] 定位

<a href="/" target="_self" title="首页"><img title="慕课网" src="/static/img/index/logo.png"></a>

使用 a[title='首页'] 定位

里面的img使用 img[title='慕课网'] 定位

4. 用CSS定位子节点

father>son[attribute='value']>grandson[attribute='value']

		<div class="carousel-item csdn-tracking-statistics  next left" data-mod="popu_465" data-dsm="post">
			<a href="http://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/79643977" target="_blank">
				<img src="//csdnimg.cn/feed/20180321/6c98086f1d03ee4f653afaab114f163e.jpg">
			</a>
			<a href="http://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/79643977" target="_blank">
				<div class="carousel-caption">
					机器学习大神迈克尔 · 乔丹:我讨厌将机器学习称为AI				</div>
			</a>
			<a href="http://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/79643977" target="_blank" style="display:block;">
				<div class="cover"></div>
			</a>
		</div>

定位子节点也可以叫相对定位,也就是说在用CSS定位时,有些元素不能通过一次性直接完成定位,需要通过定位其惟一的父节点,然后再相对定位到子节点上。其中比较常见的有table,list以及一些并列的元素。

比如对于上面这些<a>标签是并列的,如果要定位第二个<a>标签可以用 div > a > .carousel-caption

二、XPATH定位

一般来说上面的定位方法不够用的时候,就会拿出终极武器xpath进行定位了,因为xpath定位并不需要它的属性是惟一的,或者是固定不变的,不管在哪里,它总能找到它。

1. 基本语法

语法: //tag[@attribute='vale']  有没有发现,xpath定位的时候,属性的前面多一个@

xpath的语法就不介绍了,可以网上查查,这里主要说明几个:

/ 表示父节点的下一个节点

// 表示父节点的下面某个节点

* 用于通配标签名,切记不要用来通配节点路径

div > p > li > a > span

         p > li

         h > a

比如有这样一个html层级嵌套结构,div下面有三个p标签, 如果父节点是 div,那么 div/ 后面接的只能是 p或者h标签, div// 后面接的可以是除div意外的任意一个标签。以下这些写法是对的:

//div/p/li

//div/h/a

//div//li//span

这种写法是错的: //div/a   //div/p/span

2. 用text和contains构建xpath

语法: 完全匹配  //tag[text()='value']

           部分匹配 //tag[contains(attribute, 'value')]

<ul class="nav-item">
            <li class="set-btn visible-xs-block js-header-avator"><a href="/u/1372187" target="_self"><img width="40" height="40" src="//img4.mukewang.com/5333a2320001acdd02000200-100-100.jpg"></a></li>
                        
            <li>
                <a href="/course/list" target="_self">免费课程</a>
            </li>           
            <li><a href="//class.imooc.com" class="program-nav " target="_self">职业路径<i class="icn-new"></i></a></li>
            <li>
                <a href="//coding.imooc.com" target="_self">实战</a>
            </li>
            <li><a href="/wenda" target="_self">猿问</a></li>
            <li><a href="/article" target="_self">发现</a></li>
            <li class="visible-xs-block"><a href="/user/setprofile" target="_self">我的设置</a></li>
            <li class="visible-xs-block"><a href="/passport/user/logout?referer=//www.imooc.com" target="_self">退出</a></li>
</ul>

比如要定位text为“发现”这个标签,可以用 //ul//a[text()='发现'] 进行定位, 但是text的内容必须完整的写过来

当然也可以使用部分匹配: //a[contains(text(), '免费')]   用于匹配在a标签种text带有‘免费’的位置

也可以判断其他属性的值是否包含关键字:

//a[contains(@class, 'program')]    //a[contains(@href, 'article')]

不仅如此,它还支持多条件合并:

<a href="/wenda/detail/383123" target="_blank" class="wenda-tit">【有奖问答】与大咖交流前端JS与框架开发,免费赢取前端图书(11.28-12.4)</a>
它可以用多个条件进行定位: //a[contains(@href, 'detail') and contains(@class, 'tit') and contains(text(), '大咖')]

3. 用starts-with构建xpath

语法: //tag[starts-with(attribute, 'value')]   查找属性值以value开头的位置

<a href="/wenda/detail/383123" target="_blank" class="wenda-tit">【有奖问答】与大咖交流前端JS与框架开发,免费赢取前端图书(11.28-12.4)</a>

//a[starts-with(text(), '【有奖问答】')]

//a[starts-with(@class, 'wenda')]

//a[starts-with(@href, '/wenda')]

4. 查找父节点、前面平级节点、后面平级节点

父节点 = //parent::<tag> 

前面平级节点 = //preceding-sibling::<tag>   

后面平级节点 = //following-sibling::<tag>

<ul class="nav-item">
            <li class="set-btn visible-xs-block js-header-avator"><a href="/u/1372187" target="_self"><img width="40" height="40" src="//img4.mukewang.com/5333a2320001acdd02000200-100-100.jpg"></a></li>
                        
            <li>
                <a href="/course/list" target="_self">免费课程</a>
            </li>           
            <li><a href="//class.imooc.com" class="program-nav " target="_self">职业路径<i class="icn-new"></i></a></li>
            <li>
                <a href="//coding.imooc.com" target="_self">实战</a>
            </li>
            <li><a href="/wenda" target="_self">猿问</a></li>
            <li><a href="/article" target="_self">发现</a></li>
            <li class="visible-xs-block"><a href="/user/setprofile" target="_self">我的设置</a></li>
            <li class="visible-xs-block"><a href="/passport/user/logout?referer=//www.imooc.com" target="_self">退出</a></li>
</ul>

父节点:

ul_xpath = "//a[text()= '职业路径']//parent::li//parent::ul"

父节点应该会比较好理解,但是前平级节点和后平级节点可能会不好理解,它的意思就是,基于当前节点,往前的平级节点,或者往后的平级节点。

前面平级节点:

第一个和第二个<li>标签  = "//a[text()= '职业路径']//parent::li//preceding-sibling::li"

第一个<li>标签 = "//a[text()= '职业路径']//parent::li//preceding-sibling::li[1]"

第二个<li>标签 = "//a[text()= '职业路径']//parent::li//preceding-sibling::li[2]"

后面平级节点:

第一个和第二个<li>标签  = "//a[text()= '职业路径']//parent::li//following-sibling::li"

第四个<li>标签 = "//a[text()= '职业路径']//parent::li//following-sibling::li[1]"

第五个<li>标签 = "//a[text()= '职业路径']//parent::li//following-sibling::li[2]"


关于定位的,到这里基本上就够了,这里总结一下吧,在定位的时候:

如果id是惟一的,用id定位最快;

如果name或其他属性是惟一的,则用其他属性;

如果上面不行,则用CSS的组合选择器定位;

最终没招了,用xpath吧!!

但是,这也不是绝对的,具体问题具体分析吧!在我看来,只要哪些定位方式受html变动影响比较小的,或者即使变了也不会影响定位的,这种定位方式是优先选择的,对于自动化测试,并不要求代码能执行多快,应该多保证这些代码怎么能够提高通用性、拓展性以及项目间的可移植性。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium webdriver 页面css和xpath定位 的相关文章

  • 编辑类名中带有空格的元素的 css 样式

    我正在创建一个 tumblr 我必须编写一个外部 CSS 文件 但我在编辑 post 元素的 css 样式时遇到问题 这是它的结构 li class post quote other code li 问题是类名中有空格 我如何创建一个 CS
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • 在其他不可滚动的 div 上滚动时如何滚动可滚动的 div?

    我知道这个问题听起来很令人困惑 但这就是我想要做的 在下面的代码片段中 如果用户在绿色 div 上滚动 我希望黄色 div 相应地滚动 就像滚动黄色 div 一样 请注意 黄色 div 有overflow auto 但绿色的则不然 docu
  • 如何将大于整个页面 100% 的元素居中对齐?

    我有一个宽度为 100 的 div 并且隐藏了一个宽度为 3000px 的 div 我希望3000px的div左右均匀地被切断 我会使用背景位置 中心 然而 事情比这更复杂 3000px div 包含 30 100px div 我尝试过在
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • 在按钮之间添加空间?

    嗨 我这里有一个代码 除了一件事之外 一切都很完美 代码中每个按钮之间没有空格 我尝试过 margin 但不幸的是它是一个无序列表 所以我有点困惑 我将添加或替换什么以在两个按钮之间留出空间 帮助
  • 如何防止弹性项目高度因其内容而溢出[重复]

    这个问题在这里已经有答案了 我刚刚开始学习 Flex 到目前为止我印象深刻 但是 我对包含页眉 页脚和三列的全页应用程序遇到了问题 第一列包含一个项目列表 由于我无法为其父级设置固定高度 因此每次列表增长时 它都会将页脚向下推 这是一个带有
  • 没有类的 CSS 选择器

    我正在使用选择器来选择不具有一个类的所有元素 list th not foo some rules 我怎样才能将其应用到多个班级 list th not foo list th not bar some rules 上面的 CSS 当然不会
  • CSS - div 与父 div 底部对齐(内联块)

    我知道这个 html 很草率 有一些不必要的额外 div 但无论如何 我无法理解为什么 ID 为 info box right 的 div 与父 div 的底部对齐 您可以看到 文本 与下面的 jsfiddle 示例的底部 有什么想法可以让
  • 在 Bootstrap 中使用 CakePHP 时如何修改包装器 div 错误类

    我在用着Bootstrap 3 0RC1 with CakePHP 2 3 6 尝试利用那些漂亮的课程 例如has error and has warning for 验证状态 http getbootstrap com css forms
  • 如何在文本区域中使用除“文本插入符号”之外的透明字体?

    我有一个简单的文本区域 我需要制作透明字母 同时允许文本插入符可见 当我应用以下规则时 我会得到隐形插入符 textarea background transparent opacity 0 当我键入不可见文本时 我需要看到文本插入符移动
  • div 边框上的内边距

    我想在 css 边框上添加填充 将其拉入 div 内 远离边缘 使用 css 可以吗 css3 很好 webkit 这是设计 我通过将一个 div 放在一个 div 中 然后给内部 div 一个边框来做到这一点 我想让标记尽可能精简 所以如
  • 使用 Selenium webdriver 和 Python 获取完全渲染的 HTML

    我正在尝试使用 Selenium webdriver 在 Python 中构建一个网络抓取工具 但是当我从 webdriver 检索网站源代码时 我无法访问所需的信息 我认为问题在于 一旦页面最初从服务器下载 内容就会通过 JavaScri
  • Selenium c#:如何在特定版本中启动 Internet Explorer 驱动程序(例如 IE8)

    在 java 中 可以通过传递所需的功能来设置 Internet Explorer 驱动程序的 IE 版本 这在 C 中不起作用 我希望它看起来像这样 DesiredCapabilities ieCapabilities null ieCa
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 如何更改 Bootstrap 3 div 列顺序

    正在做我的第一个响应式设计 在 Bootstrap 3 中可能会出现类似的情况 在 lg 上更改此设置 a b c sm 上的这个 a c b 您可以使用两个 div 一个用于第一类型的布置 另一个用于第二类型的布置 第一个仅在 lg 中显
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 显示覆盖以覆盖整个页面

    我有一个正在加载的网络应用程序iframe 我需要显示一个覆盖 div 来覆盖整个页面 问题是叠加层当前仅显示在iframe区域而不覆盖整个页面 我们的应用程序 子应用程序 是加载的一组应用程序的一部分iframe 你可以做这样的事情 di
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显

随机推荐

  • #最详细# Github Page 个人博客绑定二级域名

    文章目录 1 必要条件 xff1a 2 操作步骤 xff1a 3 操作3 1 在阿里云控制台添加子域名解析记录3 2 在 Github 中修改配置 1 必要条件 xff1a 已申请个人域名已配置好Github Page 2 操作步骤 xff
  • springboot日志输出到文件

    今天来谈一谈日志 xff0c 主要是说一说springboot的日志 xff0c 因为最近在学习springboot 首先在写代码的时候 xff0c 要养成记日志的习惯 xff0c 这点真的很重要 xff0c 因为之前吃了很多亏 过去我对日
  • Spring--开源的轻量级的Java开发框架

    目录 xff1a 一 Spring 简介1 什么是Spring2 Spring 框架的优点3 Spring 体系结构 二 Spring 容器1 什么是Spring容器2 Spring 容器的实例化3 Spring 容器的使用 三 Sprin
  • viewBinding的搭建,通过反射获取绑定

    再使用viewBinding 的时候报出下面这个异常 java lang NoSuchMethodError No interface method getTypeName Ljava lang Str 代码是这样 Type types 6
  • Java怎么去除字符串中的所有数字?

    String string span class token operator 61 span span class token string 34 abc123zxc56qwer89ws5 34 span span class token
  • Android系统10 RK3399 init进程启动(三十一) SeAndroid实战之定义策略

    配套系列教学视频链接 xff1a 安卓系列教程之ROM系统开发 百问100ask 说明 系统 xff1a Android10 0 设备 xff1a FireFly RK3399 xff08 ROC RK3399 PC PLUS xff09
  • Codewars 刷题笔记(Python)6.Multiples of 3 or 5

    题目 If we list all the natural numbers below 10 that are multiples of 3 or 5 we get 3 5 6 and 9 The sum of these multiple
  • Java多种方式解决生产者消费者问题(十分详细)

    一 问题描述 生产者消费者问题 xff08 Producer consumer problem xff09 xff0c 也称有限缓冲问题 xff08 Bounded buffer problem xff09 xff0c 是一个多线程同步问题
  • Centos6 yum安装VNC-server

    一 环境 Linux操作系统 xff1a centos6 9 二 安装步骤 1 检查是否已经安装了vnc server root 64 VM 0 11 centos rpm q tigervnc tigervnc server packag
  • Docker部署rabbitmq遇到的两个问题

    当使用docker部署rabbitmq时遇到两个问题 xff0c 访问交换机时报错 xff0c 另一种是访问channel时报错 xff0c 本文给大家分享解决方案 xff0c 感兴趣的朋友跟随小编一起看看吧 1 背景 Docker部署ra
  • Python pip源配置修改

    由于某些不可抗因素 xff0c Python官方的包在国内有时无法访问或出现网络不稳定现象 为了解决这个问题就需要将Pip中自带的源地址修改为镜像地址 目前收集的比较好的镜像地址有 xff1a http pypi v2ex com simp
  • 使用k-近邻算法识别手写数字。

    在之前的文章中介绍了k 近邻算法的原理知识并且用Python实现了一个分类器 xff0c 而且完成了一个简单的优化约会网站配对效果的实例 在 机器学习实战 中有关kNN的后一部分内容就是一个手写识别系统 xff0c 可以识别手写的0 9的数
  • Unable to add window -- token android.os.BinderProxy

    The problem is that the dialog need to have the 34 base 34 context of your activity not necessarily the one you 39 re la
  • HTML复选框--checkbox

    在公司实际开发中 xff0c 会经常遇到复选框全选 多选 统计选中个数的情况 xff0c 所以总结研究了一些大神的帖子 xff0c 汇总学习一下 xff01 1 统计被选中复选框的个数 2 点击复选框 xff0c 执行对应函数 3 获取复选
  • 在Ubuntu14.04不能添加PPA源到apt源的问题解决方法

    在Ubuntu14 04使用apt get 更新Git 时 xff0c 需要更新apt源 xff0c 添加一个带有最新Git的源 xff0c 如下命令 xff1a sudo add apt repository ppa git core p
  • android 12 framework开发第53节-Activity的reLaunch及onConfigurationChanged android源码分析

    hi xff0c 同学们大家好 xff01 1 Configuration应用开发背景 今天要给大家分享内容就是我们应用开发时候经常会遇到问题 xff0c 那就是如果系统一些属性变化了 xff0c 比如语言 xff0c 横竖屏幕 xff0c
  • QT 线程,实现生产者-消费者模式

    一 两种启动线程方式 xff1a 1 QThread 2 QObject moveToThread 函数 可以让 调用者的 槽中的代码 xff0c 在单独的线程执行 注 xff1a 如果该对象有 父对象 xff0c 那么它无法被移动 二 线
  • 【easyui学习笔记】3.easyui布局之边框布局

    学习参考 xff1a EasyUI 为网页创建边框布局 建设稍微实用点的界面都离不开布局 xff08 layout xff09 xff0c 我们先来了解最简单的一种布局 xff1a 边框布局 xff08 border layout xff0
  • Android的四种启动模式以及onNewIntent方法

    前言 想起来写这个是因为之前在开发过程中遇到在onStart 方法中使用getIntent 方法无法获取到启动activity时传入的数据 xff0c 也是纳闷了很久 xff0c 然后就决定好好看一下这个地方 xff0c 本文章会结合简单的
  • selenium webdriver 页面css和xpath定位

    对于html来说 xff0c 不管用什么浏览器打开 xff0c 他的架构是不变的 xff0c 所以对于编写自动化测试程序来说 xff0c 基于什么浏览器开发 xff0c 差异不大 xff0c 所以这里推荐使用chrome 65或以后版本浏览