🎉 🎂 🍰 TesterHome 创立 6 周年纪念日 🍰 🎂 🎉

Selenium Python + flask+ selenium 自动化测试用例管理、执行平台

jerrylizilong · 2018年08月12日 · 最后由 jerrylizilong 回复于 2018年09月12日 · 3686 次阅读

前言

之前使用 Python + flask 开发的 selenium 自动化测试用例管理、执行平台,终于克服懒癌把业务相关的信息剥离掉,代码放到了GitHub 上面:

github地址: https://github.com/jerrylizilong/autotest_platform (越整理越发现自己代码写得烂,如有不足请轻拍)

效果介绍原帖地址: https://testerhome.com/topics/11183

执行效果:
执行单条用例:

执行用例集:

autotest_platform(懒得想名字,先这么叫着)

基于python+selenium的自动化测试管理、执行平台。

版本要求:

python 3.4 以上

1. 管理平台:

基于flask进行开发,进行用例、用例集、步骤等的增删改查等功能。

2. 启动core服务:

python app/core/coreservice.py
  • 基于selenium进行封装,从数据库中读取需要执行的测试用例,并转化、执行、记录测试结果及截图。
  • 需结合selenium grid 或 selenium docker 作为节点进行具体执行载体。

安装步骤:

  • clone 或下载代码包到本地解压:

    git clone https://github.com/jerrylizilong/autotest_platform.git
  • 按requirements.txt 安装依赖:

    cd autotest_platform
    pip3 install -r requirements.txt
  • 数据库配置: 创建数据库,并执行 init.sql 建表并初始化配置数据。

  • 配置: 修改 app/config.py 中关于数据库部分的配置: host、port、database、user、password。

启动:

1.启动 flask:

python run.py 

此时可通过访问 localhost:5000 访问登录界面。
初始用户及密码: admin/0

2. 启动 core service(selenium 的执行服务):

python app/core/coreservice.py

3. selenium 接入(我目前是用docker 上面跑的selenium hub/node)

可以按以下两种方式进行接入:

3.1 selenium server接入:

  • 服务端启动: python app/core/service.py, 将通过9998 端口监听节点启动、关闭状态
  • selenium grid 节点启动: 将app/client 目录复制到已安装selenium driver 的服务器/PC 中,修改client.py文件中host 为服务端对应地址,并启动: python client.py

服务启动后,会启动 selenium server,并注册到服务器中。

3.2 其他方式(原有selenium server、selenium docker等)

使用说明:

1. 新建用例:

用例步骤说明:

  • 每个用例步骤中通过逗号进行分隔。
  • 单个步骤的格式: 步骤名称+分隔符(|)+参数列表(参数间按@@进行分隔)。如:填写|id@@kw@@selenium, 表示步骤为“填写”,参数列表为“id、kw、selenium”。
  • 默认的参数含义:1:通过什么属性定位目标元素(可使用id、name、class、text、xpath、css等多种定位方式进行定位) 2:目标元素对应的属性值(如id = kw) 3:其他。
  • 例如:填写|id@@kw@@selenium: 代表通过 id = kw 查找到输入框,并输入 selenium 。

具体步骤说明请查看菜单:自动化测试-步骤说明。

用例说明:

例子:在百度中输入selenium,并验证查询结果是否正确。

Chrome,前往|http://www.baidu.com,|id@@kw@@selenium,点击|id@@su,验证|Web填写 Browser Automation,截图

步骤解析:

  • Chrome: 调用 Chrome driver 进行测试。
  • 前往|http://www.baidu.com : 前往目标页。
  • 填写|id@@kw@@selenium : 在 id 为 kw 的元素中输入 selenium。
  • 点击|id@@su : 点击 id 为 su 的元素。
  • 验证|Web Browser Automation : 验证页面中是否出现 ‘Web Browser Automation’ 的文字。
  • 截图: 对当前页面进行截图并保存。

2.公共用例

某些公共的步骤,可以封装为公共方法进行调用:

  • 公共方法添加:新建用例,选择用例类型为 公共用例, 所属模块为public。
  • 公共方法调用:步骤: 公共方法|公共方法名, 如 公共方法|登录;公共方法|查询订单。

3.用例管理:

还可对用例进行如下管理:

  • 用例查询
  • 用例复制:新建用例时可考虑复制一条步骤类似的用例,再修改对应步骤。
  • 用例删除:逻辑删除,可在数据库对应表中恢复。
  • 用例执行:执行单条用例。可查看对应执行记录、截图、或重跑用例。

4.用例集管理:

  • 用例集(test suite)对应一个测试范围,可关联多个不同的用例。
  • 执行用例集时会根据设置的并发数进行并发执行,提高测试效率。
  • 用例集中的用例是从测试用例中复制而来,因此每个用例可以在多个不同的测试用例集中关联。
  • 用例集可重跑全部用例、重跑失败用例、重跑单条用例。 注意:重跑用例时,会自动从对应测试用例中加载最新的步骤。

5.节点管理:

  • 节点:可加载多个selenium grid节点,系统根据当前可用节点的数量,分配用例进行执行。

6.步骤管理:

  • 步骤:现已对大部分常见步骤进行了封装。
  • 扩展封装:可根据需要进行扩展封装。
  • - 可直接封装selenium的方法,请参考 刷新、前往、悬浮点击 等方法。
  • - 可对selenium提供的方法进行二次封装,请参考 点击、填写、选择等方法。对应扩展代码可在 app/core/extend.py 文件中进行管理。

update : 2018-08-24

新增android 设备使用 ATX 进行测试:

修改:

1. app/config.py 文件新增 ATXHost 配置,需要将 atx server 的地址配置到该项中

前提: 已安装 atx server进行设备管理

关于 ATX server:

请查看这篇文章的介绍:
https://testerhome.com/topics/11738

android 用例组织:

样例:
Android|com.your.packagename,点击|id@@com.your.packagename:id/btn_login,等待|2,点击|name@@GuestLogin,等待|5,截图,

已封装步骤:

相关的步骤已封装在 app/core/atx_step.py 中,具体包括:

Android : 打开指定已安装的app (通过包名)
填写: type_text
点击: click (by id/name/description/class)
截图: take_screenshot

由于我测试的 app 功能较为简单,目前只封装了这几个方法,如果需要可增加封装对应的方法。

update : 2018-08-28

新增测试用例编辑器功能

这个功能有助于提高用例的输入效率。 如下图示是如何添加一条《在百度搜索 testerhome 并截图》的例子:

效果如下:

update : 2018-09-19

新增在用例集执行完成后发送邮件进行通知的功能

需要在 app/config.py 文件中打开开关并配置对应的 smtp 账号、密码等信息

共收到 49 条回复 时间 点赞

这个可以有,支持另外开发者上传代码吗

mads 回复

欢迎提交到分支,合适的话我会抽空合并到主干

学习了,后期可以将macaca appium atx等兼容进来

mer163 回复

我这边已经集成了appium 和 atx (之前集成的 macaca ,因为感觉不稳定,替换成了 appium 和 atx),不过这次整理的代码里没包括这块

想问下,存储在数据库中的关键字和对应的值是如何转化为可执行的测试用例的,例如appium所能执行的,看了下源码没太懂,代码能力较菜😂

FengYeLoveCode 回复

读取关键字对应值:

调用:
keywords.keywords().getPara(keyword)

方法:
def getPara(self, keyword):
result = 0
log.log().logger.info(keyword)
sql = string.Template(
"select paraCount, template, elementTemplate from `test_keyword` where `keyword`= '$index' limit 1;")
sql = sql.substitute(index=keyword)
result = useDB.useDB().search(sql)
if len(result):
return result[0][0], result[0][1],result[0][2]
else:
return '','',''

转换为可执行语句:

调用:
conmod, element = self.convertToComend(template,paraCount,steps,elementTemplate)

通过对应的模板,传入对应参数后,转换为可执行命令。
转换有两种:

  1. 转换为直接可执行的 selenium 命令,如 填写方法, 对应的模板为: driver.find_element_by_$para1("$para2").send_keys("$para3")

当步骤中描述:
填写|id@@input_box@@ghw
转换为命令:
driver.find_element_by_id("input_box").send_keys("ghw")

  1. 对selenium 命令,封装成一些通用的方法。 如 选择方法,封装如下:

def select(self,driver,para_list):
method, value, option_method, option_value = para_list[0],para_list[1],para_list[2],para_list[3]
from selenium.webdriver.support.select import Select
if option_method =='index':
comd = 'Select(driver.find_element_by_%s("%s")).select_by_%s(%s)' %(method,value,option_method,option_value)
else:
if option_method == 'text_part':
self.select_by_visible_text(driver.find_element(by=method,value=value),option_value)
else:
if option_method == 'text':
option_method = 'visible_text'
comd = 'Select(driver.find_element_by_%s("%s")).select_by_%s("%s")' % (
method, value, option_method, option_value)
log.log().logger.info(comd)
exec(comd)
time.sleep(2)

模板:
extend.extend().select(driver,["$para1","$para2","$para3","$para4"])

步骤中描述:
选择|id@@selectBox@@index@@1
extend.extend().select(driver,["id","selectBox","index","1"])

jerrylizilong 回复

感谢,回复的如此详细,大概明白了

jerrylizilong 回复

什么时候开放集成appium和atx哈,期待。

问下哈,这边在本地部署好了,添加了测试用例,但是点击执行后就弹出提示,然后显示待执行是什么情况

  1. 是否已接入了可执行的 selenium 节点? 可以看下 自动化测试》节点管理 页面是否已有可用的节点。
  2. 是否已启动 app/core/coreservice.py 文件? 这是执行用例的核心服务,没有启动的话用例是不会执行的。
jerrylizilong 回复

好吧,这个是直接运行这个文件就好吧,自己添加了判断移动端的Appium框架的一些代码,目前看可以运行了,感谢哈😆

12楼 已删除

update : 2018-08-24

新增android 设备使用 ATX 进行测试:

修改:

1. app/config.py 文件新增 ATXHost 配置,需要将 atx server 的地址配置到该项中

前提: 已安装 atx server进行设备管理

关于 ATX server:

请查看这篇文章的介绍:
https://testerhome.com/topics/11738

android 用例组织:

样例:
Android|com.your.packagename,点击|id@@com.your.packagename:id/btn_login,等待|2,点击|name@@GuestLogin,等待|5,截图,

已封装步骤:

相关的步骤已封装在 app/core/atx_step.py 中,具体包括:

Android : 打开指定已安装的app (通过包名)
填写: type_text
点击: click (by id/name/description/class)
截图: take_screenshot

由于我测试的 app 功能较为简单,目前只封装了这几个方法,如果需要可增加封装对应的方法。

已经很不错了,想知道下,执行任务那块是怎么做的呢,多线程吗??

思路不错,有时间研究下重构下

meilisong 回复

多线程读取数据库里的用例并执行

jerrylizilong 回复

嗯,谢谢。做得很好了😁

update : 2018-08-28

新增测试用例编辑器功能

效果如下:

jerrylizilong UI 自动化测试用例整理举例-百度首页 中提及了此贴 08月28日 19:56

请问下,已经运行了run.py&coreserver.py两个文件,但是运行的时候直接弹层提示了success,但是显示3-无法执行,请问这个是什么情况呢?
还有就是请问下,因为用的是docker里的selenium&Chrome,请问下添加节点里的ip和端口是填写selenium的还是Chrome的ip呢

已经在节点管理中添加了ip和端口,但是运行用例之后会提示这个-ERROR: no hubs is availabe!

fly_shuke 回复

no hubs is availabe 就是没有可用的节点
你看下是否已经启动了对应的 selenium server , 并添加到 节点管理里面。

jerrylizilong 回复

已经在docker中启动了selenium-hub还有Chrome,而且把节点添加到了节点管理中,但是每次启动都是这个一样的报错😂

fly_shuke 回复

看下 自动化测试》节点管理 页面的节点是否是打开状态:

fly_shuke 回复

需要填写的是 selenium 的ip 和端口, 实际上就是通过类似的 selenium server 地址进行测试: http://XXX.XXX.XXX.XX:4444/grid/console

另外需要留意下docker 里的selenium 能否被你的脚本访问

jerrylizilong 回复


添加了这个节点而且状态也是开启的,但是不知道为什么出来了两个,而且运行用例后,一个节点的状态自动变成了关闭

fly_shuke 回复

http://xxx.xxx.xxx.xx:4444/grid/console 看下你配的节点在部署的服务器上能否正常访问。 如果访问不了,服务器会认为这个节点已经关闭了,从而更新为已关闭。
如果是docker的, 看下如何开启docker 容器的网络权限到外网访问。

jerrylizilong 回复

单独运行这个程序,也是可以调用起docker里的Chrome 进行截图,但是用平台执行用例就会报错

fly_shuke 回复

看下你本地的 app/core/buildCase.py 文件第 29 行是否有修改过? 你的代码和我GitHub 上的不一致:

github 上的代码:

你截图的代码:

jerrylizilong 回复


😂 代码重新更新了 一下,还是这个报错

fly_shuke 回复

麻烦截一下完整的错误日志和你的用例

fly_shuke 回复

而且当这个报错后,selenium grid console中的Chrome浏览器好像被置灰不可用了

fly_shuke 回复

这是因为这个进程已经被占用掉了。
建议启动docker 的时候把最大进程设置为10, 这样可以并发执行,提高使用率:
sudo docker run -e NODE_MAX_INSTANCES=10 -e NODE_MAX_SESSION=10 -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-firefox-debug

jerrylizilong 回复



这个是报错的截图和用例,感谢您的回复

fly_shuke 回复

检查下你的用例哦,少了步骤名称 “填写”
日志里也都有提示的:

jerrylizilong 回复

😂 终于找到原因了,感谢您;

现在我去找找怎么设置最大进程数应该就可以解决了

萌新请教一下,为啥我启动selenium服务的时候,会报错。。

xiashunb 回复

你是在 ide 里运行吗?
这应该是python 的模块没有识别到,可以这样做:
方法1: 直接在 ide(如 pycharm) 里运行, 它会自动把当前目录加入到pythonpath 里面进行识别
方法2: 在 app 同级,新增一个 py 文件:

from app.core import coreservice

coreservice.coreservice()

然后直接运行这个文件,应该就没有这个问题

xiashunb 回复

我已经在github上传了core.py 这个文件,用来启动coreservice.py服务

jerrylizilong 回复


为啥显示的执行结果是3-无法执行。。。

jerrylizilong · #42 · 2018年09月12日 作者
仅楼主可见
jerrylizilong 回复

大神。。最新的回复没权限看不见。。

xiashunb 回复

看日志,没有可执行的节点,也就是没有可以用的selenium Server
不小心勾了仅楼主可见

jerrylizilong 回复

请教一下。。那我在服务端启动时,如何配置呢?

xiashunb 回复

服务端? 服务器吗?

如果是 linux就写个 sh , Windows 就写个 bat 启动脚本就好

jerrylizilong 回复

额。就是启动server.py的时候。。提示没有可执行节点。。

xiashunb 回复

看下这段,需要另外启动 selenium server,并且添加到节点管理里面。


大神,报这个错是啥意思?

xiashunb 回复

截图看得不是很清晰,最好拿具体的错误信息去搜一下。
看起来应该是你的 selenium server 版本不兼容。

jerrylizilong 回复

是指和我的jdk版本不兼容吗??

xiashunb 回复

selenium server 版本
你的selenium 节点是怎么启动的? java -jar selenium.xxx.jar 这种方式吗? 看下这个jar 包是什么版本的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册