一、走进自动化测试

想写一些技术文章,一是记录自己的成长过程,二是如果文章能够为初学者带去一点帮助,也是倍感欣慰的。下面开始我们的第一个课题:自动化测试技术其中的一个大模块:UI自动化测试。

什么是UI自动化测试,所谓UI自动化测试,是将一些重复的功能测试的步骤,使用工具或者代码的方式实现,实现无人值守,自动执行我们重复的测试用例,提高测试效率。

UI自动化测试,常常被用来回归测试,或者一些页面元素变动不大的项目中进行应用。

当然,在正式开始前,要说明的是,自动化测试虽然能给我们的工作带来便捷,提升效率,缩短测试周期,但是它绝不能代替手工测试,大部分的BUG依旧是手工测试发现的。而且搭建一套完善的自动化框架,前期投入成本是比较高的,维护成本也比较高。

所以,在这里,我们对UI自动化测试技术进行学习和研究,绝不是为了学习自动化而学习,我们要思考一下,自动化测试技术到底能否带来便捷提高效率。如果不能,那么就得不偿失了,也是不被提倡的。

二、八大定位方式

俗话说:工欲善其事,必先利其器。所以我们需要先学习元素的定位方式,因为这是入门自动化的必经之路。
我们常说的八大定位方式:包含ID、NAME、CLASSNAME、Tag_Name、link_text 、xpath、CSS选择器、partial_link_text。而我们常用的就是XPATH、ID、NAME。其中XPATH可以称为万能的定位方式。

总结:八大定位方式=6种基本定位+xpath+css

ID定位

1、ID定位是通过元素的id属性来定位元素,html规定ID属性在整个html文档中必须是唯一的。基于元素属性中的id的值来进行定位,id是一个标签的唯一属性值,可以通过id属性来唯一定位一个元素,是首选的元素定位方式,动态ID不做考虑。

<!--代码片段-->
<input type="text" placeholder="书名、作者、关键字" class="s_int" name="searchKey" id="searchKey">
#由于selenium版本不同,所以表达式也不同,最新版selenium一般是第2种表达式。
el =driver.find_element_by_id('id')
el =driver.find_element(By.ID, 'id')
# 通过id进行元素定位搜索框,下面的代码中,网页中的为id="btnSearch"
el =driver.find_element_by_id('searchKey')
el = driver.find_element(By.ID, "searchKey")

NAME定位

基于元素属性中的name的值来进行定位,但name并不是唯一的,很
可能会出现重名。

<!--代码片段-->
<input id="search-input" name="wd" type="text" placeholder="其实搜索很简单^_^ !" value="" autocomplete="off">
#通过name定位搜索框
el =driver.find_element_by_name('name')
el =driver.find_element(By.NAME,'name')
el = driver.find_element(By.NAME, "wd")
el = driver.find_element(By.NAME, "wd")

class_name定位

基于元素class样式来定位,非常容易遇到重复的,这个方法的参数只
能是一个class值,列如:class属性有空格隔开两个class的值时,只能选
取其中一个进行定位。

<!--代码片段-->
<input type="text" placeholder="书名、作者、关键字" class="s_int" name="searchKey" id="searchKey">
#通过class_name定位
el =driver.find_element_by_class_name('class_name')
el =driver.find_element(By.CLASS_NAME,'class_name')
el =driver.find_element_by_class_name('s_int')
el = driver.find_element(By.CLASS_NAME, "s_int")

tag_name定位

通过元素的标签名来定位元素,如:input标签、span标签;标签名
来进行定位元素,重复度最高,只有在需要定位后进行二次筛选的情况下
使用。

<!--代码片段-->
<input type="text" placeholder="书名、作者、关键字" class="s_int" name="searchKey" id="searchKey">
el =driver.find_element_by_tag_name('tag_name')
el =driver.find_element(By.TAG_NAME, 'tag_name')
el =driver.find_element_by_tag_name('input')
el = driver.find_element(By.TAG_NAME, "input")

link_text定位

主要用于超链接进行定位,全部匹配文本值,使用在链接位置处,例
如:a标签

<!--代码片段-->
<a href="/book/TESTBOOK01.html">苏东坡传</a>
el =driver.find_element_by_link_text('link_text')
el =driver.find_element(By.LINK_TEXT, 'link_text')
el =driver.find_element_by_link_text('苏东坡传')
el = driver.find_element(By.LINK_TEXT, "苏东坡传")

partial_link_text定位

基于链接的部分文字来定位,link text模糊匹配,模糊查询匹配到多
个符合调节的元素,选取第一个,同样也只使用在链接位置处,例如:a标签。

<!--代码片段-->
<a href="/book/TESTBOOK01.html">苏东坡传</a>
el =driver.find_element_by_partial_link_text('partial_link_text')
el =driver.find_element(By.PARTIAL_LINK_TEXT,'partial_link_text')
el =driver.find_element_by_partial_link_text('苏东坡')
el = driver.find_element(By.PARTIAL_LINK_TEXT, "苏东坡")

CSS_Selector定位

CSS可以通过元素的id、class、属性、子元素、后代元素、index、兄
弟元素等多种方式进行元素定位。

CSS常见语法一览表

通过ID定位,如:input id=“searchKey”

driver.find_element_by_css_selector('input#searchKey')
driver.find_element(By.CSS_SELECTOR, 'input#searchKey')

通过class定位,如:input class=“is_put”

driver.find_element_by_css_selector('input.is_put')
driver.find_element(By.CSS_SELECTOR, 'input.is_put')

通过属性定位,如:input name=“kw”

driver.find_element_by_css_selector('input[name=kw]')
driver.find_element(By.CSS_SELECTOR, 'input[name=kw]')

通过子元素定位

与xpath不同,css中用">“右箭头代表子元素,而xpath中用的”/"单斜杠表示。

driver.find_element_by_css_selector('div#s_form_wrapper>form>span>input')
driver.find_element(By.CSS_SELECTOR, 'div#s_form_wrapper>form>span>input')

通过后代元素定位

driver.find_element_by_css_selector('div#s_form_wrapper div')
driver.find_element(By.CSS_SELECTOR, 'div#s_form_wrapper div')

通过元素的index值定位元素

div:nth-child(1) 【表示所有同属层级下的第1个且为div标签的元素】

driver.find_element_by_css_selector('div#kw>a:nth‐child(1)')
driver.find_element(By.CSS_SELECTOR, 'div#kw>a:nth‐child(1)')

通过元素兄弟元素定位元素

css的定位到的是兄弟元素下面的兄弟元素,而且只是下面的第1个元
素(如:span元素id为"kw"有很多input兄弟元素,它只定位到它下面的
第1个兄弟元素);而xpath不同的是可以定位到所有兄弟元素。

driver.find_element_by_css_selector('div.header>div+div')
el = driver.find_element(By.CSS_SELECTOR, "div.header>div+div")

XPATH定位

XPATH是一门在XML文档中查找信息的语言。XPATH可用来在XML文档
中对元素和属性进行遍历。由于html的层次结构与XML的层次结构天然一
致,所以使用XPATH也能够进行html元素的定位。XPATH的功能非常强
大,通过XPATH的各种方式组合,能够解决Selenium自动化测试中界面元
素定位的绝大部分问题。
xpath常见语法一览表

xpath通过绝对路径定位元素

将 Xpath 表达式从 html 的最外层节点,逐层填写,最后定位到操作
元素,这种方法,一旦路径有变化会导致定位失败,所以不推荐使用该方
式。

# 绝对路径,企业中,千万不要用!!!
driver.find_element_by_xpath('/html/body/div[4]/div[1]/a')
driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/a')

xpath通过相对路径定位元素

绝对路径与相对路径的差别与文件系统中的绝对和相对路径类似,相
对路径是只给出元素路径的部分信息,在html的任意层次中寻找符合条件
的元素,语句以//开始。

driver.find_element_by_xpath('//form/span')
driver.find_element(By.XPATH, '//form/span')

xpath通过元素属性定位元素

单属性定位://input[@name=‘pwd’]表示name属性为pwd的input

driver.find_element_by_xpath("//input[@name='pwd']")
driver.find_element(By.XPATH, "//input[@name='pwd']")

xpath通过属性值模糊匹配定位元素

1、xpath模糊匹配的函数有两种:starts-with和contains
2、starts-with://label[starts-with(@class,‘btn’)],class属性值以btn
开头的label元素

driver.find_element_by_xpath("//label[starts‐with(@class,'btn')]")
driver.find_element(By.XPATH, "//label[starts‐with(@class,'btn')]")

contains://label[contains(@class,‘btn’)],通过属性值包含btn的
label元素

driver.find_element_by_xpath("//label[contains(@class,'btn')]")
driver.find_element(By.XPATH, "//label[contains(@class,'btn')]")

xpath通过文本定位元素

文本内容的定位是利用html的text字段进行定位的方
法,//span[text()=‘下一步’],由于 “下一步” 这几个字是浏览器界面就
可以看到的, “所见即所得”,这种特征改的可能性非常小,优先推荐使
用。与属性值类似,文本内容也支持starts-with和contains模糊匹配。

driver.find_element_by_xpath("//span[text()='下一步']")
driver.find_element(By.XPATH, "//span[text()='下一步']")
driver.find_element(By.XPATH, "//span[starts‐with(text(),'下一步')]")
driver.find_element(By.XPATH, "//span[contains(text(),'下一步')]")

XPATH 和 CSS 基本语法对比

XPATH 和 CSS 基本语法对比

总结

当然,学会了以上八大定位给方式,肯定不等于大功告成,就定位来说,还有动态元素的处理,异常情况的排查,总之我们学习测试,就要学会自己去排查和解决问题,学习力对我们是十分重要的。
但是,至此,我们已经完成了学习UI自动化测试的前期准备工作,下一篇文章我们就来具体讲一讲,如何编写UI自动化测试的线性脚本。
最后一句,学习任何一种技术,不是一蹴而就的,我们要多思考、多练习才好。OK,我们下一篇文章,再见!
感谢你们的陪伴和阅读!

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐