7年阿里测试经验之谈 —— 用UI自动化测试实现元素定位

2023-09-18 14:18:06

随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI 自动化测试程序。旨在提供接口,集成到蜗牛自动化测试框架,方便用例的设计。

目前,在自动化测试的实际应用中,接口自动化测试被广泛使用,但UI自动化测试也并不会被替代。让我们看看二者的对比:

  • 接口自动化测试是跳过前端界面直接对服务端的测试,执行效率和覆盖率更高,维护成本更低,整体而言投出产出比更高,因此在项目上的使用更广泛。
  • 而UI自动化测试则是模拟用户在前端页面中的操作行为进行测试,虽然在执行过程中易收到其他因素的影响(如电脑卡顿,浏览器卡顿,网速等)而导致用例执行失败,且后期维护成本较高,但是UI自动化测试更贴近用户使用时的真实情况,也能够发现一些接口自动化无法发现的bug。

因此,在实际项目的自动化测试中,通常采用以接口自动化为主、系统稳定后通过UI自动化对重点业务流程进行覆盖的方案。而UI自动化的基础,就是元素定位。只有完成了元素定位,才可以操作定位到的元素,模拟手工测试进行一系列的页面交互,比如点击、输入等。

一、常用的元素定位方式

对于web端的UI自动化测试,元素定位通常使用selenium提供的以下8种定位方式:

  1. id:根据id定位,是最常用的定位方式,因为id具有唯一性,定位准确快捷。
  2. name:通过元素的【name】属性定位,会存在不唯一的情况。
  3. class_name:通过class 属性名称进行定位。
  4. tag_name:通过标签名定位,一般不建议使用。
  5. link_text:专用于定位超链接元素(即a标签),需要完全匹配超链接的内容。
  6. partial_link_text:同样用于定位超链接元素,但可以模糊匹配超链接的内容。
  7. xpath:根据元素路径进行定位,分为绝对路径和相对路径,可以定位到所有目标元素。
  8. css_selector:selenium官方推荐的元素定位方式,比xpath效率更高,但需要掌握一些css基础。

在实际的项目中,更推荐使用xpath和css定位方式,这两种可以定位到页面中的所有元素,使用限制较小。如果对css没有了解的话,推荐使用xpath的方式,上手更快;如果对css有一定基础的朋友,更推荐使用css进行元素定位。

接下来,以百度首页为例,在实际使用中对各种定位方式进行详细介绍。

二、元素定位的实际应用

以百度首页的搜索框为例,介绍id、name、class、tag_name四种元素定位方式。

1.id定位

通过id属性对百度首页的的输入框进行定位。

# 通过input标签的id属性进行定位 find_element_by_id('su')

2.name定位

通过name属性对百度首页的输入框进行定位。

# 通过input标签的name属性进行定位 find_element_by_name('wd')

3.class_name定位

通过class属性对百度首页的输入框进行定位。

# 通过input标签的class属性进行定位 ind_element_by_class_name('s_ipt')

4.tag_name定位

通过标签名称来定位,这种方式很少会使用,因为页面中的同一个标签通常都会重复。

# 通过input标签名进行定位 find_element_by_tag_name('input')

接下来,以页面底部的“意见反馈”为例,介绍linkText和partialLinkText两种定位方式。

5.linkText定位

通过a标签的文本信息进行定位,仅用于定位超链接a标签。

# 通过a标签的文本信息进行定位 find_element_by_link_text('意见反馈')

6.partialLinkText定位

​通过对a标签的部分文本信息模糊匹配进行定位。

# 通过对a标签的部分文本信息模糊匹配进行定位 find_element_by_partial_link_text('反馈')

7.xpath定位

xpath定位方式是通过页面元素的属性和路径进行元素定位,理论上可以对页面中所有的元素精选定位。下面介绍xpath的几种定位方式。

首先,介绍一下xpath的路径节点表达式,如图:

(1) xpath绝对路径定位

仍已百度首页的搜索框为例进行介绍。

find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input')

通常情况下,不会选择使用xpath绝对路径进行元素定位,原因有二:一是绝对路径繁琐冗长,影响运行速度;二是涉及的层级较多,任何一个层级发生变化都会导致定位失败,需要重新进行修改,不利于后期维护。

(2) xpath相对路径和元素属性结合定位

若目标元素的某个属性具有唯一性,则可直接对目标元素进行定位;否则,需要在目标元素附近寻找一个具有唯一性的元素,然后通过二者的层级关系进行定位。

接下来,依然以百度首页的页面元素为例,对xpath定位的方式举例说明。

# 通过元素属性定位百度首页的搜索框
find_element_by_xpath("//input[@id='su']")
find_element_by_xpath("//input[@name='wd']")
find_element_by_xpath("//input[@class='s_ipt']")
find_element_by_xpath("//input[@autocomplete='off']")

# 通过文本信息定位(和text_link方法不同,不局限于a标签)
find_element_by_xpath("//a[text()='意见反馈']")
find_element_by_xpath("//span[text()='设置']")

# 通过父级定位子级元素,举例百度首页搜索按钮
find_element_by_xpath("//span[@class='bg s_btn_wr']/input")

# 通过子级定位父级元素,举例百度首页百度热榜的换一换
find_element_by_xpath("//span[text()='换一换']/..")

# 通过contains方法模糊匹配定位,举例百度首页搜索按钮
find_element_by_xpath("//input[contains(@class,'s_btn')]")
find_element_by_xpath("//a[contains(text(),'反馈')]")

(3) 浏览器复制xpath

除了上述两个方法之外,还有一个简单的方法,就是在浏览器的F12开发者工具中找到目标元素,鼠标右键进行复制即可,如下图。

但复制的xpath路径可能会很冗长,还是推荐大家根据需求自己写目标元素的xpath路径。

8.css_selector定位

(1) css定位简介

css_selector定位(下文简称css定位),它的定位方式,利用选择器进行的。在CSS 中,选择器是一种模式,用于选择需要添加样式的对象。通过css进行元素定位,理论上也是可以定位到页面中的所有元素的。

和xpath相比,css的语法更简洁、定位速度更快,但是css的语法比xpath较为复杂一些,相对难记。

(2) css定位实例

下面,仍以百度首页搜索框为例,对css定位方式举例说明。

# 通过id定位,id名前加# 
find_element_by_css_selector("#kw")

# 通过class定位,class名前加. 
find_element_by_css_selector(".s_ipt")

# 通过标签定位
find_element_by_css_selector("input")

# 通过其它属性定位 
find_element_by_css_selector("[name='wd']")

# 标签和属性组合定位 
find_element_by_css_selector("input#kw")
find_element_by_css_selector("input.s_ipt")
find_element_by_css_selector("input[name='wd']")
find_element_by_css_selector("[name='wd'][autocomplete='off']")

# 通过父级定位子级元素 
find_element_by_css_selector("from#form>span[@class='bg s_ipt_wr']>input")

三、小结

以上,就是selenium的各种元素定位方法的简单介绍。项目的实际使用中,在定位方法的选择上,比较推荐大家采用“id > name > xpath/css > 其它”的顺序进行选择。

虽然UI自动化测试没有接口自动化测试使用广泛,但也是自动化测试中不可获取的一部分,希望本文能对学习UI自动化的小伙伴产生一定的帮助。

今天的分享就到此结束了,大家还有什么不懂的可以评论区下提问哈,如果我的文章对你有所帮助的话,可以点赞三联支持一下哈

更多推荐

华为HCIA(四)

链路聚合可以负载分担,增加带宽,提高可靠性Eth-trunk的传输速率和成员端口数量喝带宽有关路由器分割广播域,交换机分割冲突域指定端口:DP;根端口:RP;阻塞端口:AP如果目的MAC不在交换机MAC中,就会进行泛洪处理VAP可以根据不同用户,提供不同的网络服务华为企业级AP支持的工作模式有CloudFATFITVl

8、DVWA——XSS(Reflected)

文章目录一、XSS概述二、Low2.1源码审计2.2通关思路三、Medium3.1源码分析3.2通关思路四、High4.1源码分析4.2通关思路一、XSS概述跨站点脚本(XSS)攻击是一种注入攻击,恶意脚本会被注入到可信的网站中。当攻击者使用web应用程序将恶意代码(通常以浏览器端脚本的形式)发送给其他最终用户时,就会

3dsmax模型烘焙光照贴图并导入unity流程详解

目录前言软件环境前置知识储备一、模型场景搭建二、模型材质处理三、vray渲染准备四、烘焙至贴图五、unity场景准备六、贴图与材质前言该流程针对某些固定场景(模型发布、无法使用实时渲染引擎等)情况下的展示,本文记录烘焙流程与导入unity后赋予材质、材质随时间渐变(模拟天气系统)的流程。软件环境win103dsmax2

【多线程学习】线程池、简单的银行取款模拟

学习代码如下,教程来自:http://www.seestudy.cn/?list_9/42.html#include<iostream>#include<thread>#include<string>#include<mutex>#include<condition_variable>#include<queue>#i

Redis从入门到精通(三:常用指令)

前边我们介绍了redis存储的四种基本数据类型,并纵向介绍了这四种数据类型的各种指令操作,现在我们这个章节从横向来总结一下关于key的常用指令和数据库常用指令key常用指令删除指定keydelkey获取key是否存在existskey获取key的类型typekey排序sort改名renamekeynewkeyrenam

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测

时序预测|MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测目录时序预测|MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料预测效果基本介绍MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时

CAN一致性测试

目录CAN一致性测试概述物理层一致性测试数据链路层一致性测试应用层一致性测试CAN一致性测试概述什么是一致性测试?一致性测试是用来检验一个半导体、零部件(ECU)以及软件是否符合规范的测试流程。通过执行“一致性测试”,可以验证被测件是否符合通讯协议规范,从而排除不同工程师的理解差异。为什么要进行一致性测试?为了保证产品

面试题四:请解释一下watch,computed和filter之间的区别

watch与computed、filter:watch:监控已有属性,一旦属性发生了改变就去自动调用对应的方法computed:监控已有的属性,一旦属性的依赖发生了改变,就去自动调用对应的方法.computed有详细的介绍,移步computed的使用filter:js中为我们提供的一个方法,用来帮助我们对数据进行筛选,

容器内也能运行图形化应用?Distrobox 为容器注入生命 | 开源日报 No.35

JetBrains/compose-multiplatformStars:13.3kLicense:Apache-2.0ComposeMultiplatform是一个使用Kotlin在多个平台上共享UI的声明性框架。它基于JetpackCompose,由JetBrains和开源贡献者开发。您可以选择使用ComposeM

django和celery的项目,nginx和uwsgi协议,在通过api端口进行deeplearning任务的训练和排队

问题汇总redis安装django和celery的安装nginx和uwsgi的安装一.Django的项目,有个runserver直接起了一个webserver,为什么还要Nginx包一层,起一个webserver呢?Nginx的性能比Django自带的Webserver的性能要好,python写的程序,deeplab想

怎样提高redis的命中率

要提高Redis缓存命中率,可以考虑以下几个方面:合理设置缓存过期时间:根据业务需求和数据更新频率,设置适当的缓存过期时间。过长的过期时间可能导致数据不及时更新,而过短的过期时间则可能导致频繁的缓存失效。选择合适的数据结构:根据具体业务场景选择合适的Redis数据结构。例如,使用Hash类型来存储对象,使用Sorted

热文推荐