Web UI自动化测试之元素定位

本文首发于:行者AI

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

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

因此,在; @ @ b ? /实际项目的自动化测试中,通 w - + L U常采用以接口自动` 1 3化为主、系统稳定后通过UI自动化对重点业务流程进行覆盖的方案。而UI自动化的基础,就是元素定位。只有完成了元素定位,才可以操作定位到的元素,模拟A T T y S YQ B h ! 2 o ?工测试进行一系列的页面交互,比如点击、输入等。

1. 常用的元素定位方式

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

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

在实际的项目中,更推荐使用xpath和css定位方式,这两p % a F种可以定位到页G j ^ O z %面中的所有元素,使9 . 3用限制较小。如果对css没有了解的话,推荐使用xpath的方式,上手更快;如果对cs% e | r H i ]s有一定基础的朋友,更推荐使d O l g用css进行元素P c t D K J T d 4定位。

接下来S C g,以百度首页为例,在实际使用中对各种定位; ( a h { 0 ` | 1方式进行详细介绍。

2. 元素定位的实际应用

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

Web UI自动化测试之元素定位

2.1 id2 Y P ) ` . [ A e定位

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

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

2.2 name定位

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

# 通过input, P N 2 ) l {标签的name属性进行定位
find_element_by_name(9 G ? P ; A *'wd')- R M L j

2.3 class_name定位

通过clasd $ 9 ^s属性对百度首页的& + u ~ t 8 - 1 h输入框进行定位。

# 通D x 7 w s 8过input标签的class属性进行定位
find_element_by_class_name('s_ipt')

2.4 tag_name定位

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

# 通过input标签名进行定位
find_element_by_tag_name(3 ~ | ! }'input') 

接下来4 2 { 6 # Y,以页面底部的“意见反馈”为例,介绍linR 2 W f U +kText和partialL3 ` Y d ? T q = `inkText两种定位方式。

Web UI自动化测试之元素定位

2.5 linkText定位

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

# 通过a标签的文本信息进行定位
fi^ # g s : }nd_element_by_link_texV ( Z 3 F t('意见反馈')

2.6 partialLinu * 8 W . ~ n pkText定位

通过对a标签的部分文本信息模糊= @ * b r T C - q匹配进行定位。

# 通过对a标签的部分文本信息模糊匹配进行定位
find_el; 9 T | ) ! 9 Zement_by_partial_link_text('反馈')

2.7 xpath定位

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

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

Web UI自动化测试之元素定位

(1) xpath绝对路径定位

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

find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/formV v j K/span[1 D : =]/input'O ~ + Y a ; e b y)

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

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

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

接下来,依然以百_ 6 ( e L m ~ E度首页的页面元素为例,对xpath定位的_ ! A x方式举例说明。

# 通过元素属性定位百度首页的搜索框
find_element_by_xpath(@ 5 Y T"//input[@id='su']")
find_element_by_xpath("//input[@name='wd']")
find_element_by_xpath("//input[@class='s_ipt']")
find_element_by_xpath("//input[@autocomplete='oZ l U +ff']")
# 通过文本信息定位(和text_link方法不同,不局限于a标签)
find_element_by_xpath("//( 9 & z I x Qa[text()='意见反馈']")
fiF [ 3 A L o ynd_element_by_xpath("//span[text()='设置']")
# 通过父级定位子级元素,举例m M 1  7 8 S _百度首页搜索按钮5 c _ (
find_elR [ d s 6 a %ement_U { x : J Y J t Yby_xpath("//span[@class='bg s_btn_wr']/input")
# 通过子级定位父级元素,举例百度1 I r ` w首页百w ! + w = C c 0度热榜的换一换
find_element_by_xpath("//span[text()='换一换$ D G  j f U { -']/..")
# 通过contains8 - x方法模糊匹配定位,举例百度首页搜索按钮
find_element_by_xpath("//6 | r 9 % 7 % f Zinput[coX b = Untains(@class,'s_btn')]")
find_element_by_xpath("//a[contains(text()N Y : u ;,'反馈')]")

(3) 浏览器复制xpath

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

Web UI自动化测试之元素定位

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

2.8 css_selector定位

(1) css定位简介

css_selectQ D x | 3 + s a aor定位(下文简称css定位),它的定位方式,利用选择器进行的。在CSS 中,选择器是一种模式,用J 5 I z % o - . l于选择需要添加样式的对象。通过css进行元素定位,理论上也是可以定位到页面中的所有元素的。

和xpath相比,css的语法更简洁、定位速度更快,但是cD K n F g [ `ss的语法比xpath较为复杂一些,相对难记。

(2) css定位实例

下面,仍以C f I , = ( F a b百度首页搜索框为例,对css定位方式举例说明。

# 通过id定位,id名前加#
find_element_by_css_selector("#kw")
# 通过class定位,class名前加.
find_element_by_css_se{ w qlector(".s_ipt")
# 通过标签定位
findI L | ; o c 2 h_ele| c !ment_by_css_selector("input")
# 通过其它属性定位
find_element_by_csso g A s z (_selo [ * ! % 6 jector("[name='wd']")
# 标签和属性组合定位
find_element_by_css_selector("input#kw")
find_element_by_css_selector("input.s_ipt")
find_element_by_css_selector("input[name='Z S b I M [ ZwdT b F ~ ?']")
find_eli Y & A V 3 Mement_by_cssf  1 g M ~_selector("[name='wd'][4 T ] [ r zautocomplete= O 1'off']")
# 通过父级定位子级元素
find_element_by_css_selector("from#form>span[@class='bg s_ipt_wr']>inpu2 o 2 V $t")

3. 小结

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

虽然UI自动化测试没有接口自动化测试使用广泛,但也是自动化测试H , w =中不可获取的一部分,希望本文能对学习UI自动化的小伙伴产生一定的5 a A T & F帮助。v 6 J h e