之前已经完成了登录、新增和修改的操作流程,这一节主要说明删除操作流程以及自动化的过程中出现的问题,算是对这个项目自动化的一个总结。
删除操作流程
对于系统账号管理中删除功能,删除的测试点主要如图所示
而账号管理的页面显示如图
在管理页面中可以看出,删除操作物理删除且没有批量操作功能。但是这里有一点需要主要,每个新注册的账号会默认监管所属机构下所有的用户,所以这里为了用例的健壮性,我们删除正常的用例的具体操作步骤如下
- 新增一个账号信息
- 取消新增账号的监管用户
- 定位到该新增账号页面中的删除按钮,点击删除操作
- 根据删除提示确认删除操作
- 断言页面中账号不存在
说明
- 这里必须先把账号的监管用户取消,否则无法进行删除操作
根据步骤信息,之前已经封装好了新增账号的关键字,这里主要是取消监管用户操作步骤和关键字的封装。
取消监管用户操作步骤
- 取得新增账号id并打开取消监管用户的url地址
- 在打开的取消监管用户中取消所有的监管用户
- 鼠标滚动到浏览器底端,点击保存完成操作
操作步骤已然了解,接下来就是步骤的关键字封装
第一步:得到id,获取url代码如下
封装账号新增id分配监管用户的url
${gradeU.value} Get Element Attribute xpath = .//*[@id='tb_guardian']/tbody/tr[1]/td[1]/input@value
log ${gradeU.value}
${AccountAllotModify} Catenate SEPARATOR= ${toEditGuardianUser} ${gradeU.value}
[Return] ${AccountAllotModify}
取消监管用户关键字封装如图所示
第二步:打开分配监管用户,取消全部监管用户
全部取消按钮的定位代码如下
点击账号监管用户的全部取消
click element deselAll
第三步:鼠标滚动到底端,点击保存操作
封装的关键字代码如下
点击账号监管用户的保存按钮
click element xpath = html/body/div[1]/div/div/div/div[2]/div[3]/div/button[1]
这样关键字封装完成之后,我们只需要根据操作步骤,编写操作用例即可完成删除的正常用例,具体代码如下所示
账号管理删除确认
[Documentation] 用例目的:删除一个没有监管用户的账号信息
... 操作步骤
... 1.新增一个账号信息
... 2.取消新建账号的所有监管用户
... 3.删除新建的账号
... 4.确认提示中选择“确认删除”
... 断言
... 1.当前页面是否是 http://192.168.1.6/guardian/query
... 2.当前页面中的是否包含新建的账号信息
... 存在的问题:
... Location Should Be ${GuardianQuery}
... 断言当前页面无法通过,需要查看问题
[Tags] doubtfula
[Setup] login
账号新增封装
${AccountTestName} 账号名称检查
#首先取消所有监管用户
${AccountAllotModify} 封装账号新增id分配监管用户的url
打开页面 ${AccountAllotModify}
#跳转到新打开的窗口,否则会停留在新增之后的窗口,元素无法定位 #说明跳转这里使用的是第二次,无法成功,具体原因待查
goto ${AccountAllotModify}
Take Screenshot guardian
点击账号监管用户的全部取消
sleep 5
Take Screenshot guardian
Execute Javascript window.scrollTo(0, document.body.scrollHeight) #滚动到底部
点击账号监管用户的保存按钮
sleep 5
Take Screenshot guardian
确认保存
log hello1
#首先取消所有监管用户
打开页面 ${GuardianQuery}
#页面跳转
goto ${GuardianQuery}
Take Screenshot guardian
sleep 5
log hello2
点击账号删除按钮
sleep 3
log hello3
确认保存
Take Screenshot guardian
#断言当前页面的url
log hello4
Comment Location Should Be ${GuardianQuery}
page should not contain ${AccountTestName}
[Teardown] close
删除用例rf格式显示如图
到这里,删除操作正常用例已经完成,接下来就是运行测试~(≧▽≦)/~。
而到此,针对测试中常用的增删改查已经基本上完成了,这样参考账号管理的用例编写方法,其他模块的用例完成rf的用例编写,自动化已经部署完成,这样下次我们进行回归测试的之后,直接使用jenkins只要鼠标轻轻一点就可以运行具体模块或所有模块的测试用例,下次再也不会为项目着急上线所有模块没有回归测试而感到惶惶了,这样就可以轻松滴等着开发改着bug坐等项目上线了呢,瞬间觉得很happy(^o^)/~......
总结
项目自动化到这里就基本完成了,这里主要是用例rf中的分层思想,这样就算开发修改了代码元素的位置,我们也只需要修改元素的具体定位方法就好了。rf自动化从刚刚接触到现在把一个项目所有操作流程的用例都建立起来,中间遇到了不少问题,非常感谢强大的互联网,才能把一个项目完成的自动化流程建立起来。这里总结一下自动化中遇到的坑吧,也算给前一个阶段的总结。
问题1:
自动化中尽可能减少用例之间的关联,能使用url的地方最好使用url;所以对于许多的新增、修改和其他操作我们尽可能的使用一个相对固定的url访问打开此页面进行元素的定位和输入,如图所示
此页面账号管理页面中,对于新增或修改操作,我们需要先打开账号管理这个页面,然后再次点击新增或修改按钮打开新增或修改页面;但是如果系统中账号管理的树形结构更换或新增、修改按钮的位置变换那么我们就需要重新定位变换的元素的位置。实际上我们可以不用这么麻烦,我们首先找到账号管理的页面url,查看该页面是否是固定的url,在图中显示的/guardian/query
我们把浏览器的地址192.168.1.6
拼接起来,打开了账号管理主页面的地址,如图
问题2:
robotframework运行测试用例时提示gckodriver相关信息,如图所示
提示代码如下
Starting test: Open.Suit.open
20170802 08:42:08.000 : INFO : Opening browser 'FireFox' to base url 'http://www.baidu.com'
20170802 08:42:08.015 : FAIL : No browser is open
20170802 08:42:08.016 : WARN : Keyword 'Capture Page Screenshot' could not be run on failure: No browser is open
20170802 08:42:08.017 : FAIL :
WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
Ending test: Open.Suit.open
提示说明需要在路径path中添加geckodriver,当然解决办法就是,下载一个geckodriver.exe并将存放的路径添加在path中,简单点就直接放python的根目录下即可,下载地址 https://github.com/mozilla/geckodriver/releases,另外需要注意下,geckodriver分32及64位的版本,版本需与浏览器对应。
问题3:
问题背景:利用robotframework在写自动化脚本的时候, 有些场景下需要新建一个浏览器窗口,但是又需要共享原窗口的session,这时候只需要在浏览中新打开一个tab页就可以。比如以上面的新增账号为例,我打开登录页面,登录成功之后,需要再次打开新增账号页面,而新增账号页面和登录成功的页面是共用session的,这个如何实现的呢?脚本如下:
Execute JavaScript window.open('addGuardian');
或者可以使用robotframework中的关键字goto实现,代码如图
goto ${AccountAllotModify}
goto的用法可以在robotframework中查看该关键字如何使用,如图
问题4:
robotframework运行用例时,只第一次运行用例的时候有日志显示,之后不会显示该日志信息,日志信息显示如图
解决方法:这里使用的是火狐浏览器,每次第一次运行测试用例的时候电脑中会启动一个进行geckodriver.exe,所以在每次运行完用例后,在最后的teardown中增加一个关闭进程的操作即可,代码如图
close
Close Browser
Comment ${Runoutput} OperatingSystem.Run taskkill /f /im geckodriver.exe
OperatingSystem.Run taskkill /f /im geckodriver.exe
这样修改之后,每次运行都可以看到日志信息了。
问题5:
随机选择下拉框选项:
背景:如账号添加的时候我们需要选择账号所属机构,如果想选择每次添加的账号是随机的,那么该如何操作呢?可以看一下之前的robotframework随机选择下拉框
问题6:
新增或修改用例中用户名、姓名、身份证号、手机号等这些字段中,有唯一性验证,所以为了测试的严谨性,我们需要每次添加或修改的信息是唯一的,该如何实现呢?
解决方法:这里使用了QTLibrary的一个关键字,安装和使用参考 https://github.com/qitaos/Robotframework-QTLibrary
这样安装完成之后,直接加入Library即可使用该关键字信息
随机姓名代码如下
${username}= gen chars 10
输入用户名 ${username}
其他随机英文或数字或身份证以及生日使用请参考QTLibrary的使用关键字。
而这里的随机手机号使用的是robotframework中强大的关键字Evaluate来实现操作的,代码如下
${phone} Evaluate random.choice(['139','188','185','136','158','151'])+"".join(random.choice("0123456789") for i in range(8)) random
手机号码 ${phone}
robotframework中如图所示
问题7:
在项目自动化用例编写完成之后,我们每次运行用例如果一个个点击运行的话会非常繁琐,而jenkins给自动化构建提供了一种解决办法。在使用jenkins运行测试用例的时候,无法打开浏览器如图所示
主要原因是jenkins安装的时候注册成windos的服务了,所以这里如果是tomcat启动或直接使用命令启动的jenkins则不会出现这个问题滴!那么如果不想重新安装jenkins该如何操作呢?
解决办法:
- 打开windows服务窗口(win+r 输入‘services.msc’)
- 找到Jenkins服务
a). 停止此服务
b). 将启动类型由自动->手动 - 找到Jenkins安装目录里的jenkins.war,在cmd窗口运行 java -jar x:/youfilepath/jenkins.war
问题8:
在使用jenkins运行测试用例之后,我们可以打开运行的测试报告或log查看具体的日志信息,可是在这个最后即将胜利的时刻,竟然无法查看日志信息,瞬间感觉整个世界都不好了,(⊙_⊙?)
解决办法:使用命令java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar D:\Jenkins\jenkins.war
,在命令启动jenkins中增加-Dhudson.model.DirectoryBrowserSupport.CSP=
再次重新打开jenkins重新运行用例,这下日志终于可以看到......
这样重新打开jenkins,再次运行robotframework的用例就可以浏览器能够正确打开~(≧▽≦)/~
这些就是目前项目自动化构建过程中遇到的那些坑,这里记录一下,为自己前段时间的自动化做一个小小的总结,当然如果能为一些童鞋提供一点灵感也是︿( ̄︶ ̄)︿好的......