随着互联网技术的发展,现在的软件系统需要处理的业务越来越复杂,而客户对于软件的需求变化也越来越快,这就要求我们软件从业人员快速响应客户需求。在互联网企业,微服务下的敏捷开发体系、自动化测试、智能运维体系都发展得如火如荼。在前几年也许传统软件行业的还在观望着,但是在devops火热的今天,不少的传统企业也都开始向互联网企业学习,引入devops、敏捷开发中的各种技术,以提高他们的开发效率。
上周六,芒果在上海航空工业(集团)有限公司进行了一次自动化测试培训。这次的培训,主要是针对于web ui自动化测试框架的学习。我和参加学习的测试人员主要针对以下几部分内容进行了深入学习:
01
web页面元素定位
也许一提到元素定位,你肯定会说不就是id、name、class name、link text、xpath、css这八种么。那你知道如何选择最快速有效的定位方式么?
在课堂上,我表达了一些我自己的看法,对于拥有id或者name属性的元素,我们尽可能选择id或者name进行定位。没有这些属性,我们可以考虑css定位。可能有人会更加喜欢xpath定位,但是css定位是Selenium官网的Document里极力推荐的定位方式,而不是xpath来定位元素,原因是css比xpath速度快,特别是在IE下面(IE没有自己的xpath解析器(Parser))。它比xpath更高效更准确更易编写,只是美中不足是根据页面文字时略有缺陷没有xpath直接。并且因为前端开发人员就是用css定位设置页面上每一个元素的样式,无论那个元素的位置有多复杂,他们能定位到,那我们使用css定位肯定也能非常精准的定位到页面元素。
当然因为现在前端架构的复杂性,或者是不规范性,我们总会发现元素定位会是困扰我们高效完成自动化测试代码的一大难点,所以元素定位不是那么简单就可以搞定的事。所以我在课堂上跟大家强调了一个定位元素的原则:我们想要定位某个或者某组元素,我们就上要找到一个合适的字符串,能够唯一的描述它。然后就是注意是否需要元素等待,窗口切换,iframe切换,弹窗等问题的处理了。
02
web页面元素操作
一旦定位元素正确,元素操作不再变成什么难事,因为现在的前端架构,我们的需要操作页面元素类型都是一定的,只要我们熟悉像输入框、富文本框、按钮、单选框、复选框、下拉列表等这些常用控件的操作就可以完成大部分web页面元素的操作。
而有一些页面元素,它是隐藏的,或者是有只读等属性的,我们可能没办法用一般的方式处理它,这个时候我们可以执行js代码来完成我们想要的操作。
比如12306的日期控件:
我们可以看到日期控件input标签由于readonly 属性,所以日期控件是不允许输入的,那么我们主要通过js来删除或者readonly制成否,这样可以直接允许输入。
代码语言:javascript复制#通过js操作,首先定位到input日期标签,然后再次删除readonly属性
js = r'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
#使用id定位input日期控件,并输入日期
input_datetime =driver.find_element_by_id('train_date ')
input_datetime.clear()
input_datetime.send_keys("2019-01-15")
03
PO模式
“前端手一抖,自动化测试忙一宿”的故事相信大家都不陌生,由于前端代码的变化,导致UI自动化测试脚本变动大,维护变得困难也是有一些人鄙视UI自动化测试的原因。其实在芒果看来,软件系统的界面才是客户接触最多的,做好界面的功能测试是必须的;而大部分功能测试人员所做的重复性非常高的工作也是界面的,所以完成主要功能UI自动化是非常有必要的。
而对于页面的变动,我们可以采用PO模型(Page Object页面对象模型),来维护一组web页面元素对象库是一个非常好的方法。在PO下,每一个web页面都有对应的Page类,这些类帮我们维护好这个web页面的元素集和方法。这样能帮我们把业务流程跟页面元素进行分离,使得测试代码变得清晰而容易维护;也可以让我们更好的复用页面对象;当然更有效的命名方式,可以让我们知道所有能够操作页面元素的方法。
04
其他
当然当天的内容并不只有那么些,我们还一起讨论了接口测试,接口自动化,讨论了想要做好UI自动化我们对于前端的了解跟认识,甚至还吐槽了一下需要大大优化的前端代码。