1 背景说明
部门要做所有系统的线上UI登陆巡检,采用的是Python+Robot Framework框架。这里做一下记录,只分享编写的脚本结构和思路,不涉及Robot Framework部署安装。
2 分析设计和方案选择
手动操作登陆过程主要是:
- 打开浏览器
- 输入用户名、密码
- 识别和输入验证码
- 点击登陆,判断登陆结果
- 退出浏览器
其中, 验证码类型为:
- 因为只实现登陆系统,可以直接在Test Cases区域中编写登陆步骤。
- 但为了脚本维护的方便,最好将Test Cases区域作为用例逻辑的组织区域,将登陆步骤分解后,在Keywords区域单独维护和处理。这样后续有步骤需要调整时,可以在相应内容中编辑即可,清晰明了。
- 这里采用以下的脚本结构
*** Settings ***
# 引入相应库文件
*** Variables ***
# 定义变量
*** Test Cases ***
# 将登陆过程组织起来,形成逻辑
*** Keywords ***
# 实现每一个单独的登陆步骤
- 识别验证码是难点,经过查找和比较,最后选用识别率相对较高的ddddocr,但是验证码的识别率依然不高,尤其是对于运算符号的识别。
为了提升验证码输入的准确性(有时候存在登陆次数限制),需要在输入验证码结果之前,先对验证码识别结果进行一次过滤,如果发现有错误,就点击更新验证码,并重新识别。(这层过滤体现在下文中的capcha_result.py文件中,并在Input Capcha中进行了判断)
3 具体实现
部门的框架目录
common中放我们自己写的一些方法或函数
monitor中为各个系统的登陆脚本
相应的robot文件
*** Settings ***
Documentation XX系统
Library Selenium2Library
# 引入自己写的验证码识别文件
Library ../common/capcha_result.py
*** Variables ***
${LOGIN URL} https://......./login
# chrome前台执行,headlesschrome后台静默执行
${BROWSER} headlesschrome
# 登录信息(字典)
&{USERINFO} username=XXX password=XXXX
*** Test Cases ***
Login Platform
[Documentation] 系统登陆
Open Browser To Login Page
Input Username ${USERINFO.username}
Input Password ${USERINFO.password}
# 输入验证码,尝试4次
FOR ${var} IN RANGE 4
Input Capcha
Submit Credentials
${result} run keyword and return status Input Information Is Correct
Exit For Loop If ${result}==True
Run KeyWord If ${var}==3 Close Browser
END
Home Page Should Be Open
[Teardown] Close Browser
*** Keywords ***
Open Browser To Login Page
# 打开网址
Open Browser ${LOGIN URL} ${BROWSER}
# 等待,直到捕获到页面元素,这里用系统名称
Wait Until Page Contains Element xpath=……
# 断言title
Title Should Be XXX平台
Input Username
# 输入账号
[Arguments] ${username}
Input Text xpath=…… ${username}
Input Password
# 输入密码
[Arguments] ${password}
Input Text xpath=…… ${password}
Input Capcha
FOR ${var} IN RANGE 100
# 点击更新验证码
click element xpath=………
sleep 1
# 验证码截屏
${filepath} Capture Element Screenshot xpath=……… 验证码.png
# 通过图片扫描出图片中的数字
${capcha} capcha_result ${filepath}
Exit For Loop If ${capcha} != False
END
# 输入验证码
Input Text xpath=……… ${capcha}
Input Information Is Correct
# 等待2秒,断言验证码消失,说明进入登陆页面
Sleep 2
Page Should Not Contain Image xpath=………
Submit Credentials
# 点击登录按钮
Click Button xpath=………
Home Page Should Be Open
Sleep 10
# 断言左上角的LOGO
PAGE SHOULD CONTAIN ELEMENT xpath=………
capcha_result.py文件内容
import ddddocr
def capcha_result(imgname):
ocr = ddddocr.DdddOcr()
with open(imgname, 'rb') as f:
img = f.read()
img_str = ocr.classification(img)
try:
if img_str[1] in ['+','-','*','/']:
result = eval(img_str[:3])
else:
result = False
except Exception:
result='验证码计算异常'
return result
- 因为运算符的识别率不高,因此先对识别结果是否包含’+‘,’-‘,’*‘,’/'等运算符进行判断,如果包含则返回计算结果,如果不包含则返回False,在Robot脚本判断识别结果为False,就点击更新验证码,重新识别和计算结果,这样可以提高验证码的识别率(应对登陆次数限制的一种方法)
4. 执行和调试
调试阶段,设置 ${BROWSER} chrome ,可在前台看执行过程,调试通过后,可以使用headlesschrome在后台静默执行(Linux下必须要静默执行)
执行脚本可以使用命令 robot 。
robot xxx.robot
执行完毕,会有报告生成,可以查看。robot命令还有很多其他选项,需要可自查。