UI自动化测试-selenium元素定位

news2024/11/19 3:45:36

在使用Selenium和WebDriver进行UI自动化测试时,我们首先需要对元素定位,那么如何来定位元素呢?

HTML

在进行元素定位之前,我们要对html代码有所了解。

        <div class=s_form>
                    <div class=s_form_wrapper>
                        <div id=lg> 
							<img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129>
                        </div>
                        <form id=form name=f action=//www.baidu.com/s class=fm>
							<input type=hidden name=bdorz_come value=1> 
							<input type=hidden name=ie value=utf-8> 
							<input type=hidden name=f value=8>
                            <input type=hidden name=rsv_bp value=1> 
							<input type=hidden name=rsv_idx value=1> 
							<input
                                type=hidden name=tn value=baidu>
							<span class="bg s_ipt_wr">
							<input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus>
							</span>
							<span
                                class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn">
							</span> 
							<a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> 
						</form>
                    </div>
                </div>
              

如上为百度首页的一段html代码,html文档有如下结构

  1. 由标签对组成 如
  2. 标签有各种属性,如id,name,class,type,value 就像人有各种属性,如身份证(id),姓名(name),职业(class)等
  3. 标签对之间有文本 如新闻
  4. 标签有层级关系 如div内嵌套div,嵌套input标签

那么如果把页面元素看成人的话,如何找到一个人呢?

我们可以根据这个人的属性如身份证号-id,姓名-name等找到这个人,也可以根据这个人的位置找到这个人,也可以根据这个人的相关属性如先找到这个人的兄弟姐妹父母再根据他们找到这个人。理解了这些,就可以来进行元素定位了。

页面元素查看

利用F12开发者工具,可以帮助我们定位元素。

打开页面,按F12在元素页面,点击左侧查看元素按钮,再点击一个元素,可以看到跟这个元素有关的信息。

可以看到百度一下这个按钮属性为

input为这个元素的标签,type,value,id,class都是这个元素的属性。

中间的输入框属性为

八种元素定位方式

元素定位方式一共有8种,它们都是采用driver.find_element或者driver.find_elements为前缀,然后跟上自己独特的关键字。

其中前者用来定位唯一的元素,后者用来定位一组元素,返回的是一个列表。

在八种元素定位方式中,最常用,能解决100%问题的,是xpath的定位方式。

id定位

HTML文档规定,每个元素的id是唯一的,通过元素的id属性来定位元素。

 driver.find_element_by_id("kw")
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 通过元素的id属性来定位——id是唯一的
search=driver.find_element_by_id("kw")
search.send_keys("selenium")

name定位

通过元素的name属性来定位元素,name属性不是绝对唯一的(一个页面内可能存在多个元素的name属性是相同的)

如果name属性的值是唯一的,用find_element_by_name定位元素,返回值是一个值

driver.find_element_by_name("wd")

class定位

通过元素的class属性来定位元素,class属性不是绝对唯一的(一个页面内可能存在多个元素的class属性是相同的)

如果class属性的值s_ipt是唯一的,用find_element_by_class_name定位元素,返回值是一个值

driver.find_element_by_class_name("s_ipt")

如果class属性的值s_ipt不是唯一的,用find_elements_by_class_name定位元素,返回符合条件的多个值,保存在列表中,即返回的是列表

search=driver.find_elements_by_class_name("s_ipt")

对于返回一组元素时,我们可以采用下标如search[1]来定位,但是一般不推荐这种方式。

tag定位

通过元素的标签名tag来定位元素,如div,input, 标签名不是绝对唯一的(一个页面内可能存在多个相同的标签名)

如果标签名是唯一的,用find_element_by_tag_name定位元素,返回值是一个值

driver.find_element_by_tag_name("input")

如果标签名不是唯一的,用find_elements_by_tag_name定位元素,返回符合条件的多个值,保存在列表中,即返回的是列表

driver.find_elements_by_tag_name("input")

通过链接元素文本模糊匹配

对于有href属性的元素,我们可以根据元素的text(标签中间的文字)来匹配如:

 <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> 
 driver.find_element_by_partial_link_text("新闻")

对于这种方法,只需要匹配text的部分内容即可,因为partial的意思就是部分。

通过链接元素文本精准匹配

如果文本内容是唯一的,用find_element_by_link_text定位元素,这种方法匹配text的全部内容。

driver.find_element_by_link_text("新闻")

xpath定位

这种方式是最常用的方法,可以定位到页面的每一个元素,所以必须掌握。

XPath 是一门在 XML 文档中查找信息的语言,XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。我们只需要知道,可以用Xpath来定位元素就可以了。

方法为

 driver.find_element_by_xpath("xpath表达式")

F12元素页面选中一行,点击右键,复制xpath,即可把元素的xpath提取出来,如

//*[@id="kw"] 解释:不管标签是什么,找id为kw的元素

点击复制完整xpath,也可以生成xpath表达式。

/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input

完整xpath从html文档根节点开始查找,这种查找方式效率非常低,不建议使用。

复制的方式很简单,但是结果不是我们想要的。没事儿,我们有更方便的方法来自己写xpath表达式。

xpath路径表达式的写法

这个表格总结了xpath路径的写法,这样可能还是看不明白,接下来会进行介绍。

检验xpath写的对不对

在介绍xpath写法之前,我们先来看看如何检验xpath写的对不对。

在F12元素页面,按ctrl+F,输入xpath回车,可以定位到元素,右侧显示定位到的元素个数。

如果为0,说明xpath写的有问题,没有找到元素。

为1,说明xpath写对了,唯一定位到了元素。

为多个,说明定位到了多个元素,xpath表达式还需要优化。

标签+元素属性

我们可以采用标签加元素属性的方式来写xpath表达式

以百度搜索输入框为例

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

我们可以通过标签+元素属性方式来定位

//标签名[@属性名称=值]
//input[@id='kw'] 解释:以相对路径查找标签input中id为kw的元素

当我们以//开头时,表示相对路径,任何一个元素都可以以这种方式开头查找。input为这个元素的标签名,用中括号括起,并@id这个属性,id的值为kw,用字符串表示。

我们也可以用name属性来写。

//input[@name='wd']

用class来写

//input[@class='s_ipt']

元素的任何一个属性,只要是唯一的,都可以写,这种写法,能解决大多数定位问题。

组合属性

如果单属性定位不到,可以组合属性

组合属性定位://标签名[@属性名称=值 and @属性名称=值 and @属性名称=值]

//input[@id='kw' and @name='wd' ] 解释:相对路径查找input标签中id为kw同时name为wd的元素

text精准定位

还记得text吗?在标签之间的文字就是text,我们可以用text来进行模糊匹配。

<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>
//a[text()='新闻'] 解释:相对路径查找a标签中text为新闻的元素

这种方法需要写上全部text内容字符串。

contains方法模糊定位

//a[contains(text(),'新闻')] 解释:相对路径查找a标签中text包含新闻的元素

contains意思为包含,即写在这里的text可以是部分内容,只要text包含新闻这两个字的元素,都会被找出来。

contains也可以用于属性如

//input[contains(@name,'wd')] 解释:相对路径查找input标签中name属性包含wd的元素

只要这个属性的name包含wd,就会被匹配上。

contains方法特别适合于动态属性的定位,即某些元素的属性值动态变化的元素。

除了contains,还可以用另外两种

starts-with      例子: //input[starts-with(@id,'ctrl')]       解释:匹配以 ctrl开始的属性值

ends-with        例子://input[ends-with(@id,'userName')]     解释:匹配以 userName 结尾的属性值

xpath方法说了这么多,你掌握了吗?看起来很复杂,其实写多了就会了。

CSS定位

学会了xpath,这种定位方法可以不学,但为了显示出我们定位方式的全面,还是简单介绍一下吧。

这种方法使用CSS 选择器定位元素

 driver.find_element_by_css_selector('css表达式')

好了,具体CSS表达式怎么写,感兴趣的可以自己百度。

没有find_element_by_*?

当我学会了xpath,信心满满开始写代码,发现没有了find_element_by_*。

如下的代码提示里没有上面介绍的方法?我不会白学了吧?

其实Selenium 4.0已经不再支持find_elements_by_*方法,而是开始使用

driver.find_element()/driver.find_elements() 解释:前者定位一个元素,后者定位一组元素

道理是一样的,只是这种方法,我们需要导入一个By包

from selenium.webdriver.common.by import By

继续输入,可以发现,还是我们介绍的那些定位方式,只不过写法稍微变了,需要给这个方法传入两个参数。

driver.find_element(By.ID,'kw')
driver.find_element(By.XPATH,"//input[contains(@name,'wd')]")

看来还是没有白学。

总结

好了,本文介绍了html文档的结构,元素定位的八种方式,如何在F12开发者工具查看元素,校验xpath。相信学习了这些方法,你一定可以定位到任何想要定位的元素了!

欢迎交流,拜拜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

菜鸟程序员,被无良HR欺骗,因祸得福,竟“意外”拿下美团offer

前因后果 先讲述一下自己这次被无良HR欺骗坑惨的经历吧&#xff0c;面试的是一家上海某电商公司&#xff0c;给的薪资是不错。面试的时候&#xff0c;找我要了工资流水&#xff0c;然后给了我口头offer&#xff0c;就让我回去等了邮件了。回去之后就觉得offer没啥问题&#xff…

tomcat工作任务训练

文章目录1.安装jdk1.8 tomcat9.0 发布java项目部署java环境部署tomcat启动tomcat&#xff0c;测试访问上传项目安装数据库&#xff0c;建库建户web页面配置jpress测试写文章&#xff0c;上传附件2.tomcat多实例安装 比如 8080 8081 8082 发布3个论坛项目 war包也给你了tomcat多…

(memcpy memmove memcmp memset)内存操作函数详解

目录 &#x1f355;注意&#xff1a;内存操作函数隶属于头文件&#xff0c;因此在使用任何内存操作函数之前都必须引用 &#x1f95e;memcpy函数 &#x1f35e;memcpy函数的初步认识及使用 &#x1f373;样例示范&#xff1a; &#x1f9c8;代码呈现&#xff1a; &#x1f9c…

浏览器原理二三事

目录 1. 如何理解 JavaScript 是单线程的 2. 进程与线程 2.1 在浏览器中&#xff0c;如何理解进程和线程的关系&#xff1f; 2.2 浏览器的五种进程 2.2.1 浏览器主进程&#xff08;Browser 进程&#xff09; 2.2.2 浏览器渲染进程&#xff08;Renderer 进程&#xff09; …

论文投稿指南——中文核心期刊推荐(航空、航天2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Linux——【磁盘管理和LVM卷组管理】

前言&#xff1a; Linux 磁盘管理好坏直接关系到整个系统的性能问题&#xff0c;目前市场上的磁盘分类有&#xff1a;IDE磁盘&#xff08;多用于PC机&#xff09;、SATA磁盘、SAS磁盘、SSD磁盘等这么几种分类&#xff0c;企业中服务器大多为后面的两种&#xff0c;SATA磁盘多用…

二叉树11:完全二叉树的节点个数

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;222. 完全二叉树的节点个数 题目&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数…

24行代码简单实现qq空间自动点赞

什么是Auto.js&#xff1f; Auto.js是基于JavaScript语言运行在Android平台上的工具。它依赖于无障碍服务。 它可以做什么&#xff1f; 解放双手&#xff0c;让手机自动打游戏、自动签到、自动领红包等等等等 它有什么优点&#xff1f; 不需要root权限&#xff08;Android…

Python pandas有几千个库函数,你用过几个?(3)

上一篇链接&#xff1a; Python pandas有好几百个库函数&#xff0c;你都用过吗&#xff08;2&#xff09;_Hann Yang的博客-CSDN博客 R(read_)&#xff1a; Function26~45 Types[Function][25:45] [read_clipboard, read_csv, read_excel, read_feather, read_fwf, read_gb…

目标检测算法——mmdetection下面的deformable-detr运行

1、环境 包版本mmcv-full1.4.2mmdet2.19.1torch1.10.0cu113torchvision0.11.1cu1132、文档 mmet官方文档 mmcv官方文档 源码下载 3、数据集 自定义数据集 4、修改代码 4.1、生成文件 打开mmdetection-master/tools下面执行train.py文件 其中配置文件--config在 mmdetec…

STM32中断使用NVIC

抢占优先级和响应优先级 值越小优先级越高&#xff0c;抢占优先级高就可以的打断抢占优先级低的&#xff1b;但同一个抢占优先级&#xff0c;高响应优先级并不能打断低响应优先级&#xff1b;当然中断同时发生的响应优先级高的先执行。简单理解为&#xff1a;抢占优先级能控制…

RV1126笔记十七:吸烟行为检测及部署<五>

若该文为原创文章,转载请注明原文出处。 ubuntu16.04上搭建转化成RKNN环境并把onnx转成RKNN模型(ubuntu16.04) onnx模型转rknn模型需要用到py3.8,所以搭建环境在转换,下面全部操作都是虚拟机下进行。 注意:转模型用py3.6, 训练用py3.8 一、miniconda安装 1、下载地址…

论文投稿指南——中文核心期刊推荐(自然科学总论)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

基于python的AD-census立体匹配算法实现

文章目录前言一、AD-census是什么&#xff1f;1.代价计算2.代价聚合3.视差优化4.视差后处理二、基于python的AD-census立体匹配算法实现前言 AD-Census算法来自于中国学者Xing Mei等在ICCV2011发表的论文《On Building an Accurate Stereo Matching System on Graphics Hardwar…

多类型随机图形生成方法及应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Linux-5 基础命令

Linux-5 基础命令 查看类命令 此类命令仅能查看文件中的内容 ls是用来查看目录中的内容cat是用来查看文件中的内容 查看文件 cat 选项 -n&#xff1a;显示文件内容的行数-A&#xff1a;显示文件中的特殊字符&#xff08;如果从Windows拷贝配置文件到Linux&#xff0c;很容易出…

化学试剂Biotin-PEG-COOH,Biotin-PEG-acid,生物素-聚乙二醇-羧基

英文名称&#xff1a;Biotin-PEG-COOH&#xff0c;Biotin-PEG-acid 中文名称&#xff1a;生物素-聚乙二醇-羧基 生物素-PEG-COOH是一种含有生物素和羧酸的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能以高特异性和亲和力与亲和素和链霉亲…

C++:STL:常用容器(上):string

1&#xff1a;string容器 1.1 string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质是一个类 string和char* 区别 1&#xff1a;char* 是一个指针 2&#xff1a;string是一个类&#xff0c;类内部封装了 char* 管理这个字符串&#xff0c;是一个 …

5G无线技术基础自学系列 | 5G网络接入问题分析

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G网络的接入失败或者接入时延过大都会…

实现安卓LED设备驱动:不写一行代码

文章目录一、前言二、准备工作2.1 内核版本2.2 内核文档&#xff1a;bindings->leds2.3 文档解析&#xff1a; leds-gpio.txt三、编写DTS3.1 查原理图&#xff0c;挑选GPIO3.2 编写DTS文件四、编译测试4.1 编译dt.img4.2 烧录dt.img五、基于fs的测试5.1 测试命令5.2 **点灯效…