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

2023-10-27

在使用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。相信学习了这些方法,你一定可以定位到任何想要定位的元素了!

欢迎交流,拜拜。

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

UI自动化测试-selenium元素定位 的相关文章

  • 【C++】类的默认成员函数(上)

    文章目录 类的默认成员函数 1构造函数 1 1构造函数特征 1 2编译器自动生成的构造函数 1 3编译器默认的构造函数 1 4C 11特征 2析构函数 2 1特征 2 2编译器默认的析构函数 3拷贝构造函数 3 1特征 3 2编译器默认生成

随机推荐

  • ssh渗透与hydra爆破(简明不啰嗦)

    适合新手上路 MSF与hydra两种方式渗透22端口 后进行远程连接 如有不足请各位见谅 此次实验仅供参考 切勿做违法犯罪 出事一切与本人无关后果自负 希望大家早日成为白帽子 渗透机 kali 靶机 192 168 75 128 1 扫描局
  • vim配置全攻略(2)——vim的简单配置

    这篇文章主要讲的是vim的简单配置 相对于vim内置的一些快捷键和功能 vim的客制化才是vim的灵魂 也是vim存活31年仍被热衷的原因 如果你还不了解vim的基本操作和体系 我建议你看一下我上一篇文章 vim配置全攻略 1 vim的基本
  • 【ARM】rk3399挂载nfs报错

    挂载nfs报错mount mnt bad option for several filesystems e g nfs cifs you might need a sbi 实验1 无效 sudo apt get install cifs u
  • 基于Spring Cloud实现日志管理模块

    简介 无论在什么系统中 日志管理模块都属于十分重要的部分 接下来会通过注解 AOP MQ的方式实现一个简易的日志管理系统 思路 注解 标记需要记录日志的方法 AOP 通过AOP增强代码 利用后置 异常通知的方式获取相关日志信息 最后使用MQ
  • Python+Django+Nginx+Uwsgi(史上最全步骤)

    步骤 Python安装 第一步安装Python 很多购买的服务器linux系统中自带python2和python3 我是直接使用自带的python3 5版本的 如果系统中没有 则自己安装 如下 1 下载 wget https www pyt
  • 手写一个解析器

    作者 jolamjiang 腾讯 WXG 前端开发工程师 前言 最近工作中有一些同学在做一些效能工具的时候遇到需要写一门领域相关语言 DSL 及其解析器的场景 笔者恰好有相关的经验向大家指一下北 首先请问一下大家有没有想过这个功能怎么做 点
  • MNIST2_LGB_XGB训练预测

    针对MNIST数据集进行XGB LGB模型训练和预测 部分脚本如下 完整脚本见笔者github lgb param boosting gbdt num iterations 145 num threads 8 verbosity 0 lea
  • 如何实现区块链技术安全?

    随着人们对区块链技术的研究与应用 区块链系统除了其所属信息系统会面临病毒 木马等恶意程序威胁及大规模DDoS攻击外 还将由于其特性而面临独有的安全挑战 区块链可能是安全的 但所有与之交互的软件都是如此 在许多情况下 没有 那么区块链究竟如何
  • 选择排序分析动图演示

    选择排序 思路总结 1 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 2 再从剩余未排序元素中继续寻找最小 大 元素 然后放到已排序序列的末尾 3 重复第二步 直到所有元素均排序完毕 动图演示 代码示例 public st
  • SpringMvc项目配置根据环境自动读取不同的配置文件

    将原有的配置文件拷贝一份 分别放在不同的文件夹内 2 application context xml中读取配置文件的地方 引入变量
  • 小程序实现弹出输入框

    1 微信自带组件 样式 wxml
  • (Chrome42)Lodop页面总提示“未安装”或“请升级”的可能原因和解决办法

    Chrome42之后版本 支持NP插件默认处于关闭状态 要手工打开 方法如下 在谷歌浏览器地址栏输入 chrome flags enable npapi 然后找到 启用NPAPI 地方看到处于启用状态 另外64位Chome不支持js方式访问
  • C语言典型例题八——阶乘

    用递归方法求n 解题思路 求n 可以用递推方法 即从1开始 乘2 再乘3 一直乘到n 这种方法容易理解 也容易实现 递推法的特点是从一个已知的事实 如1 1 出发 按一定规律推出下一个事实 如2 1 2 再从这个新的已知的事实出发 再向下推
  • Acwing 895. 最长上升子序列

    f i 表示所有以第i个数结尾的上升子序列中的最大个数 f i max f j 1 j 0 1 2 i 1 include
  • Openwrt开发笔记(1)—— 开发环境

    OpenWrt简介 OpenWrt 是一个嵌入式设备的 Linux 发行版 以 GPL 许可协议发行 其主要特点有如下几个 代码里不含第三方开源包 只包含开源包地址链接 在编译的时候下载 编译时自动下载源代码 打补丁来满足指定平台要求 并编
  • Oracle生成不重复字符串 sys_guid()

    在oracle8i以后提供了一个生成不重复的数据的一个函数sys guid 一共32位 生成的依据主要是时间和机器码 具有世界唯一性 类似于java中的UUID 都是世界唯一的 其优点就是生成的字符串是唯一的 但其和UUID有同样的弊端 生
  • 论文笔记:FILLING THE G AP S: MULTIVARIATE TIME SERIES IMPUTATION BY GRAPH NEURAL NETWORKS

    0 abstract introduction 之前的补全方法并不能很好地捕获 利用 不同sensor之间的非线性时间 空间依赖关系 高效的时间序列补全方法 不仅应该考虑过去 或者未来 的数值 还应该同时考虑空间上邻近的点的测量值 这里的空
  • 抖音超火的网页表白代码大全(浪漫的html表白源代码)

    精彩专栏推荐 作者主页 进入主页 获取更多源码 web前端期末大作业 HTML5网页期末作业 1000套 程序员有趣的告白方式 HTML七夕情人节表白网页制作 125套 七夕来袭 是时候展现专属于程序员的浪漫了 你打算怎么给心爱的人表达爱意
  • 姿态分析开源工具箱MMPose使用示例:人体姿势估计

    MMPose的介绍及安装参考 https blog csdn net fengbingchun article details 126676309 这里给出人体姿势估计的测试代码 论文 Deep high resolution repres
  • UI自动化测试-selenium元素定位

    在使用Selenium和WebDriver进行UI自动化测试时 我们首先需要对元素定位 那么如何来定位元素呢 HTML 在进行元素定位之前 我们要对html代码有所了解 div class s form div class s form w