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

Jerry li · August 12, 2018 · Last by Jerry li replied at April 17, 2019 · 9998 hits

写在开篇

这个项目放到论坛之后,有很多热心的小伙伴试用,并且在github上面也点赞和 fork。 感谢各位的支持!
不过可能大家使用习惯的问题, 遇到有什么问题,或者看到我在下面的回帖里回复了 qq 号, 就直接加了qq 进行咨询。由于工作等方面的原因,不可能实时在 qq 上进行回复,并且不少问题都是帖子和回复贴里有的,所以感觉沟通效率不高。

关于问题反馈

因此,现在暂时屏蔽 qq 号,如果对于该项目有任何使用上的疑问,欢迎通过下面的方式进行反馈:

  • 请先参考github 上的说明和以下参考资料的信息。
  • 如果是发现代码相关报错等信息,请在 github 上提 issue, 或者修复之后直接提 pull request 。 欢迎小伙伴们一起维护这个项目。(目前项目有80多个start 和30多个 folk, 但是issue 只有1个,这样下去估计会被认为是造假的项目了)
  • 除了提 issue外,也可以在帖子上留言提问, 在工作日会尽量回复。
  • 如果需要实时协助,可考虑私信提供qq 号进行私聊联系

github地址: https://github.com/jerrylizilong/autotest_platform \ https://jerrylizilong.github.io/autotest_platform/

参考帖子:

前言

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

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

执行用例集:

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

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

版本要求:

python 3.4 以上
selenium : 建议使用 3.0 以上版本
mysql : 建议 5.5 以上

1. 管理平台:

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

python run.py

2. 启动core服务:

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

3. 启动atx core服务:

python atx_core.py
  • 基于atx 进行封装,从数据库中读取需要执行的测试用例,并转化、执行、记录测试结果及截图。
  • 需安装atxserver(https://github.com/openatx/atx-server),并修改 app/config.py 文件的以下内容:
# atx 配置
isUseATX=True # True 代表使用 atx
ATXHost = 'http://172.16.100.168:8002' # 对应的 atxserver 地址

安装步骤:

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

git clone https://github.com/jerrylizilong/autotest_platform.git

2. 按requirements.txt 安装依赖:

cd autotest_platform
pip3 install -r requirements.txt

3. 数据库配置:

3.1 创建数据库,并执行 init.sql 建表并初始化配置数据。

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

db_host='localhost'
db_port='3306'
db_user='root'
db_password='yourpassword'
database='test_auto_new'

4. 邮件配置:修改 app/config.py 中关于邮件部分的配置(如不需要发送邮件,请忽略)。

# smtp 发送邮件相关配置:
is_email_enable = False #发送邮件开关
flask_host = 'http://localhost:5000' # 邮件中的报告链接会使用
smtp_server_host = 'smtp.163.com' # 如使用其他的smtp 服务,请修改对应host 和端口
smtp_server_port = '25'
smtp_from_email = 'youraccount@163.com' # 发送邮件的邮箱账号
smtp_default_to_email = 'youraccount@163.com' # 默认接收邮件的邮箱账号
smtp_server_user = smtp_from_email
smtp_server_password = 'yourpassword' # 发送邮件的邮箱密码

5 修改 app/config.py 中关于 atx server 配置(如不需要使用 atx 测试android 设备 ,请忽略):

# atx 配置
isUseATX=True
ATXHost = 'http://localhost:8000'

启动:

1.启动 flask:

python run.py 

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

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

python core.py

2.2 启动atx core服务:

python atx_core.py
  • 基于atx 进行封装,从数据库中读取需要执行的测试用例,并转化、执行、记录测试结果及截图。
  • 需安装atxserver(https://github.com/openatx/atx-server),并修改 app/config.py 文件的以下内容:
# atx 配置
isUseATX=True # True 代表使用 atx
ATXHost = 'http://172.16.100.168:8002' # 对应的 atxserver 地址

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

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

3.1 selenium server接入:

  • 服务端启动:

    python run_service.py

    将通过9998 端口监听节点启动、关闭状态

  • selenium grid 节点启动: 将app/client 目录复制到已安装selenium driver 的服务器/PC 中,修改client.py文件中host 为服务端对应地址,并启动:

    python client.py

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

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

附: docker 搭建selenium 镜像命令:

拉取相关镜像:

docker pull selenium/hub
docker pull selenium/node-chrome
docker pull selenium/node-firefox

启动 hub :

docker network create grid
docker run -d -p 4444:4444 --net grid --name selenium-hub selenium/hu

启动节点:

# 建议 NODE_MAX_INSTANCESNODE_MAX_SESSION 两个参数都设置为 10,便于并发执行
docker run -e NODE_MAX_INSTANCES=10 -e NODE_MAX_SESSION=10 -d --net grid -e HUB_HOST=selenium-hub selenium/node-firefox
docker run -e NODE_MAX_INSTANCES=10 -e NODE_MAX_SESSION=10 -d --net grid -e HUB_HOST=selenium-hub selenium/node-chrome

使用说明:

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 账号、密码等信息

常见问题:

1:没有可用的节点

  • Q: 运行用例之后会提示这个-ERROR: no hubs is availabe!
  • A: 说明没有可以使用的selenium节点执行测试。请检查是否已启动对应的 selenium server,并已配置到节点管理中,而且服务器可以正常访问该节点。 ### 2:selenium 的浏览器被占用
  • Q:使用docker启动的selenium 镜像服务,如果用例执行报错, selenium grid console中的Chrome浏览器好像被置灰不可用了
  • A:这是因为如果执行报错时,没有正常退出 driver,导致对应的selenium线程持续被占用,需要等待一段时间才能释放。建议启动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

3:selenium 相关报错

  • Q:selenium相关报错
  • A:可能对应的 selenium server版本不支持目前使用的一些功能,建议更新到较新版本的 selenium server
共收到 156 条回复 时间 点赞

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

回复

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

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

peter 回复

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

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

枫叶 回复

读取关键字对应值:

调用:
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"])

Jerry li 回复

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

Jerry li 回复

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

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

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

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

12Floor has been deleted
Jerry li #13 · August 15, 2018 作者
枫叶 回复

👍

Jerry li #14 · August 24, 2018 作者

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 功能较为简单,目前只封装了这几个方法,如果需要可增加封装对应的方法。

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

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

Aaron 回复

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

Jerry li 回复

嗯,谢谢。做得很好了😁

update : 2018-08-28

新增测试用例编辑器功能

效果如下: