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

Jerry li · August 12, 2018 · Last by yona replied at September 10, 2024 · 45194 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_INSTANCES、NODE_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 账号、密码等信息

update:2019-05-22

脑图集成部分代码已提交:
https://github.com/jerrylizilong/autotest_platform

更新说明:

  1. 更新源码
  2. 数据库中执行以下命令新增表: https://github.com/jerrylizilong/autotest_platform/blob/master/init.sql 的 test_minder 表:

使用说明:

  1. 脑图管理

  2. 编辑脑图

常见问题:

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
共收到 317 条回复 时间 点赞

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

对 恺 回复

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

学习了,后期可以将 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 Author
  1. 是否已接入了可执行的 selenium 节点? 可以看下 自动化测试》节点管理 页面是否已有可用的节点。
  2. 是否已启动 app/core/coreservice.py 文件? 这是执行用例的核心服务,没有启动的话用例是不会执行的。
对 Jerry li 回复

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

12Floor has deleted
Jerry li #13 · August 15, 2018 Author
对 枫叶 回复

👍

Jerry li #14 · August 24, 2018 Author

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

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

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

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

对 Jerry li 回复

嗯,谢谢。做得很好了😁

update : 2018-08-28

新增测试用例编辑器功能

效果如下:

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

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

对 舒克 回复

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

对 Jerry li 回复

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

对 舒克 回复

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

对 舒克 回复

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

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

对 Jerry li 回复


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

对 舒克 回复

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

对 Jerry li 回复

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

对 舒克 回复

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

github 上的代码:

你截图的代码:

对 Jerry li 回复


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

对 舒克 回复

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

对 舒克 回复

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

对 舒克 回复

这是因为这个进程已经被占用掉了。
建议启动 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

对 Jerry li 回复



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

对 舒克 回复

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

对 Jerry li 回复

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

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

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

对 夏顺斌 回复

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

from app.core import coreservice

coreservice.coreservice()

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

对 夏顺斌 回复

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

对 Jerry li 回复


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

Jerry li · #42 · September 12, 2018 Author
Author only
对 Jerry li 回复

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

对 夏顺斌 回复

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

对 Jerry li 回复

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

对 夏顺斌 回复

服务端? 服务器吗?

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

对 Jerry li 回复

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

对 夏顺斌 回复

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


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

对 夏顺斌 回复

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

对 Jerry li 回复

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

对 夏顺斌 回复

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

为什么执行用例的时候,只提示 sucess,然后并没有启动浏览器执行用例?

对 Z 回复

1、 core service 是否已启动
2、 是否已启动可用的 selenium 节点

1、启动 core service 的时候提示 Process finished with exit code -1073741819 (0xC0000005) 不知道什么问题;
2、启动了这三个文件 run.py 、service.py 、client.py,算不算启动了可用的 selenium 节点?

对 Z 回复

把你的 core service 报错截图来看看?
另外说明一下几个文件的启动顺序:

  1. run.py : 这是启动 flask 的,也就是管理后台。
  2. core.py : 这是启动 core service 服务的,要执行用例一定要启动这个。
  3. service.py : 这是监听 client 服务的。
  4. client.py : 这是启动 selenium server 服务的。 如果已启动 client, service 里会监听到并生成对应的节点。
Z · #58 · October 23, 2018
Author only
59Floor has deleted

python client.py 提示错误: other system is not supported yet !

对 Halo 回复

你的是啥系统? 我好像暂时只写了支持 Windows

大佬,这个问题咋整~

对 威少 回复

win 10 下的 selenium 环境问题吧,没遇到过,建议搜一下

对 Jerry li 回复

已经解决了,谢谢楼主!ChromeDriver 没有被检测到
修改 coredriver.py 的
driver = webdriver.remote.webdriver.WebDriver(command_executor=server_url,desired_capabilities=desired_caps_web) 为 driver = webdriver.Chrome()

我一直想做一个这平台,但一想到做,就觉得 HTML,js,css 基础不好,搞不定

其实用 flask 和 bootstrap,基本不用涉及 CSS,html 和 js 也不难

作者您好。请问运行命令 python run.py 后登陆页面会提示请求出错是什么原因?

对 威 回复

对 威 回复

上次提交漏了提交配置文件,可以更新一下 autotest_platform/app/config.py 文件:

对 威 回复

原因是配置自动名字没同步,所以没连上数据库。 修改一下就好

后面再努力去实践一下,谢谢

对 Jerry li 回复

谢谢您😄

对 Jerry li 回复

请问调用公共用例怎么不能执行?单独运行是可以的

对 威 回复

看下你的公共用例名称是否正确

对 Jerry li 回复

公共用例名称是正确的。

对 威 回复

你的公共方法里是不是漏了 chrome 这一步?

对 Jerry li 回复

找到原因了,是因为我没把
Chrome 删掉。。。

对 威 回复

👌 👌

android 用例执行失败:


感谢大神,空闲时间帮忙指导一下。

对 RW_KING 回复

应该是之前的 bug ,前几天做了优化没来得及提交。
麻烦更新以下几个文件试试看:

对 Jerry li 回复

感谢楼主,android 的关键字方法,什么时候能与 web 的通用啊。

对 RW_KING 回复

应该是通用的格式啊,不过 android 我用的不多,所以对应的关键字封装的目前只有 点击、填写、截图、等待 等几个

对 Jerry li 回复

等待,提示元素没有定义

怎么同时跑多个设备呢

对 RW_KING 回复

出错的是 点击文字 , 这个方法我在 android 下是没封装的,可以用 点击 |name@@XXX 来替代;

同时跑多个设备,需要先新建 测试用例集, 然后关联用例时选择需要执行的 设备列表, 然后再点击关联

对 Jerry li 回复


等待,执行失败

对 RW_KING 回复

格式错啦, 是 等待 |5

对 Jerry li 回复

感谢😀 ;参数错位了

对 Jerry li 回复



楼主,打扰了。有 2 个问题想咨询下:
1、用例执行完,没有生成测试报告,也不可能发送邮件了,邮件配置如图
2、多个用例如何执行?是并发执行,还是按顺序执行呢?比如多个用例,前置操作都是登录,调用公共方法就 OK 吗

  1. 只有测试用例集(自动化测试》test suite )执行完才会生成对应报告和发邮件, 否则每条用例执行都发一次邮件通知就太频繁了。
  2. 多个用例是并发执行的,每个都是独立执行。 即使调用同一个公共方法,也是分别独立调用的。

to 1. 只有测试用例集(自动化测试》test suite )执行完才会生成对应报告和发邮件, 否则每条用例执行都发一次邮件通知就太频繁了。

  1. 多个用例是并发执行的,每个都是独立执行。 即使调用同一个公共方法,也是分别独立调用的。
对 RW_KING 回复

看上面的回复

收到,感谢楼主。

1、在尝试进行公司管理后台的用例编写,但是很多点击方法都没有成功,最后采用 “前往” 才进入 ‘用户管理’ 页面。
2、列表信息中,操作菜单内的功能按钮,关键字方法中,没找到具体定位方法

对 RW_KING 回复

我们的菜单也是类似这样的结构,我对应的解决方法是:

  1. 菜单: 新增一个自定义方法,用菜单文字 + 菜单特有的 class 属性进行定位。
  2. 右侧菜单栏: 类似的方法,文字 + 特有的 class 属性定位。

以上方案实在不行的话,可以考虑用 xpath 的相对路径定位。

对 Jerry li 回复

感谢解答,我去尝试下。

哈,巧合了。我是使用 Java + springboot + Appium / Selenium,实现了一套类似功能的 UI 自动化测试平台。正在准备抽离业务代码做下开源分享,刚巧看到你的这篇帖子,学习一下。😀

2018-11-16 更新:

  1. 独立出 atxcore 任务,与 web ui 的 core 相互独立执行
  2. 优化 atx 步骤的封装

请问一下,点击登录之后
,报错误

数据表不存在,看下 init.sql 的数据是否已经导入到你的数据库里面

数据表不存在,看下 init.sql 的数据是否已经导入到你的数据库里面。

对 Jerry li 回复

对对,下午的时候没仔细看,直接来问,后来解决了忘记回来删除,麻烦麻烦!!!

simple 在 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 13 Dec 14:44

图片上传和弹出浮层的选择框用什么方法,我试了一下,好像都不能用

对 stefan 回复

图片上传如果是 input 类型,可以试下 填写文件 方法
弹框的选择看是什么类型,如果是 select 也可以用 选择 方法

Jerry li 在 专栏文章:一个测试平台的构思、搭建到完善 中提及了此贴 27 Dec 11:02

大神我想问一下,我想在您的平台里实现,读取页面中指定元素的文字并写入到一个文本框里,可以实现么,我试了试改步骤,总是不行

对 Rladmsrl 回复

刚刚做了一个简单的实现,添加了一个复制方法:
复制: 将某个元素的内容(value、text、innertext)复制填写到另一个元素中。
刚刚已经提交到最新代码里了,可以更新下来看看。

  1. 更新 app/core/extend.py 文件
  2. 更新 init.sql, 执行最后新增的 sql
  3. 使用: 分别定位两个元素,获取后一个元素的值,并填入到前一个元素中。 如:复制 |id@@kw@@id@@su: 定位 id = su 的元素,获取元素的文字, 并写入到 id=kw 的元素中。 insert into `test_keyword` ( `keyword`, `paraCount`, `template`, `elementTemplate`, `example`, `description`, `status`) values('复制','4','extend.extend().copy_from_another_element(driver,[\"$para1\",\"$para2\"],[\"$para3\",\"$para4\"])','driver.element_by_$para1(\"$para2\")','复制|id@@kw@@id@@su','将后一个元素的内容复制填入到前一个元素中','1');
对 Jerry li 回复

更新后之前的用例为啥都不见了 而且跑 case 的时候提示 failed to change window state to normal, current state is maximized

对 Jerry li 回复

还有一个问题我想问一下,怎么才能把平台里设计的用例备份或者导出一下,省的我一不小心弄错东西用例又白做了,谢谢您了

对 Rladmsrl 回复

你是重新初始化了数据库吗? 或者看下 app/config.py 文件是否覆盖了,导致没连上数据库

对 Rladmsrl 回复

备份可以直接在数据库里做

对 Jerry li 回复

搞定了大神,我把 mysql 重启了一下然后重新执行了一下 init.sql 就好了,但是我又发现一个问题,执行 init.sql 会覆盖 case 和节点数据吗?那我下次在更新的时候要怎么操作才能在不丢失数据的情况下升级,谢谢啦

对 Rladmsrl 回复

init sql 是在初始化的时候才要做的,如果你已经初始化过,就不要轻易去执行了,否则可能把你原来的数据给清掉
可以对比下你的版本和最新的版本,看新增了什么 sql 语句需要执行的

对 Jerry li 回复

好的谢谢您了

楼主是怎么实现 web 端通过关键字编辑用例,然后在手机真机上运行的?卡在这里很久了,因为之前我是 C/S 结构

对 乱斗东 回复

你用的什么框架来测试手机端? appium 吗?
其实原理一样,把关键字转换成对应框架的命令就可以了

对 Jerry li 回复

对,用的是 appium 框架,就是 web 端怎么和 Android 设备通信是目前遇到的一个问题

对 乱斗东 回复

我是用的 atx server,通过 wifi 无线连接手机进行测试。
appnium 的话可以搜一下论坛里的帖子,之前看到有人分享过怎么进行管理

对 Jerry li 回复

好的,谢谢!


我发现使用填写文件的时候,会自动把\去掉。这个怎么解决。去掉了\导致了路径不正确

对 stefan 回复

试下两个\

请问能同时运行多个任务么? 如果有不同的环境需要同时跑自动化,那么这些任务是怎么组织和分发?

Jerry li #123 · January 02, 2019 Author

所有的任务都是转换为单条测试用例进行管理的。
例如分别有 A、B、C 三个任务,分别有 100 条用例,那么定时任务就会查到有 300 条用例待执行,自动按设定的并发数(默认为 6 )并发执行。

124Floor has deleted
Author only
Jerry li #126 · January 02, 2019 Author

每个任务生成独立的报告

对 Jerry li 回复

知道了,谢谢

对 Jerry li 回复

两个//也不行

Jerry li #129 · January 03, 2019 Author
对 stefan 回复

两个 \ 还是 / ?

对 Jerry li 回复

两个\

Jerry li #131 · January 04, 2019 Author
对 stefan 回复

新提交了一个修改,应该可以兼容 \ 了。 这是 python 的转译符,默认保存的时候会转换掉

init.sql 无法执行怎么办,好像是版本不支持

Jerry li #133 · January 05, 2019 Author
对 初学者 回复

试下把这行注释掉,然后手动建库 test_auto_new,再执行 init

对 Jerry li 回复

谢谢楼主大大

这个上传文件的还是搞不定啊。同样的一句上传文件。我单独放在一个 Python 文件里面就能执行成功,但是在你这个里面。文件就上传不了。不知道什么原因。 driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/div[1]/div[2]/form/div[3]/div[2]/div/span/span/div[1]/span/input").send_keys("I:\3333.jpg")
就是这一句

Jerry li #137 · January 07, 2019 Author
对 stefan 回复

试下用 填写文件 方法,不要用 填写 1

Jerry li #138 · January 07, 2019 Author
对 stefan 回复

另外你的这个 xpath 很长,可以的话建议用其他定位方式来替代,比如 id 、class 等

对 Jerry li 回复

都试了。都不行。换成短的也试了。也不行。

Jerry li #140 · January 07, 2019 Author
对 stefan 回复

我这边是没问题的,如果你本地用 selenium 可以执行,可以检查一下:

  1. 是否同一台设备?
  2. 图片在平台运行的服务器或者 PC 上是否存在?
  3. 文件路径是否完全一致?
  4. 本地的 selenium 和平台调用的 selenium 是否同一个版本?

填写 方法就是按 driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/div[1]/div[2]/form/div[3]/div[2]/div/span/span/div[1]/span/input").send_keys("I:\3333.jpg") 这种格式进行封装的,所以如果 selenium 直接运行 ok ,理论上这样调用也没问题

对 Jerry li 回复

嗯嗯,谢谢楼主。我自己再调试看看。谢谢

对 Jerry li 回复

终于成功了。路径前面要加个 r 如果不加,就会被转义掉。
只能暂时这么特殊处理了


老哥,请教个问题
这个是你 test_case 的编辑,你可以通过用例 id 直接查找,然后跳转到 edit_test_cases2,而且有着数据
但是我自己也写了一个编辑,用着新的数据库,我也可以进行跳转,但是没有数据是什么原因?

Jerry li #144 · January 08, 2019 Author
对 luomomimi 回复

从后台获取用例的完整信息,是在 js 里实现的

html 里的调用:

<script>window.onload =function(){document.getElementById('btn_reset').click();}</script>

对应的 js :
/static/scripts/core/test_case.js

// 编辑表单
function get_edit_info(active_id)
  {
    if(!active_id)
    {
      alert('Error!');
      return false;
    }

    $.ajax(
        {
          url: "/test_case.json",
          data:{"id":active_id,"type":"test_case"},
          type: "get",
          dataType:"json",
          beforeSend:function()
          {
            return true;
          },
          success:function(data)
          {
            if(data)
            {
              // 解析json数据
              var data = data;
              var data_obj = data.rows

              // 赋值
              $("#id").val(active_id);
              $("#name").val(data_obj.name);
              $("#steps").val(data_obj.steps);
              $("#description").val(data_obj.description);
              $("#type").val(data_obj.isPublic);
              var isPublic = data_obj.isPublic;
              if(isPublic == 1)
              {
                $("#type").val('公共用例');
                setModule('公共用例');
              }else{
                $("#type").val('普通用例');
                setModule('普通用例');
              }
              $("#module").val(data_obj.module);
            }

            else
            {
              $("#tip").html("<span style='color:red'>失败,请重试</span>");
             // alert('操作失败');
            }
          },
          error:function()
          {
            alert('请求出错');
          },
          complete:function()
          {
            // $('#tips').hide();
          }
        });

    return false;
  }

对 Jerry li 回复

还是不行,真的很奇怪!

Author only
Jerry li #147 · January 09, 2019 Author
对 luomomimi 回复

看下你的 js 是不是成功调用了
具体可以参考下我原来的 html 写法

刚开始就是模仿你的,js 文件里面就是将 test_case 换成了 test_app ,然后新建了一个新的数据库,其他没改动过,这应该调用成功了吧

Jerry li #149 · January 09, 2019 Author
对 luomomimi 回复

F12 跟踪一下看下请求有没发送,还有参数是否正确

对 Jerry li 回复

改成 test_app,解决了,真的难受。。谷歌浏览器的缓存好坑,但是编辑里面的赋值还是没有解决,我只能找到 id,然后。。。然后就没有软后了

Jerry li #151 · January 09, 2019 Author
对 luomomimi 回复
  1. 你的查询接口有返回这些对应数据吗?
  2. js 里有把这些返回值赋值给对应的参数吗?
  3. 另外我原来的 html 里有个 script,是要页面加载时自动点击一下 reset 按钮,调用 get edit info 接口来查数据,你看下新的页面里有没加这个。
对 Jerry li 回复

全部是用你的,我就是改了名字而已(里面的方法名也都改了),但就是不显示;我也查看了你 test_case 的搜索方法,但和你一样呀,你也只查询了 id 而已,但网页最后有数据。
js 里面的赋值应该没多大关系,我都是默认的,但用例名称也不显示
htm 的 reset 按钮有的,网页也和你一样,但是也没有数据,只有 id

Jerry li #153 · January 09, 2019 Author
对 luomomimi 回复

一步步排查吧:

  1. js 方法有没触发。 可以在 js 里打印 log 来跟踪。
  2. 接口有没调用成功。 看 F12 - 网络下的请求记录和返回值。
  3. 2.1 如果有返回值,就看 js 处理是否成功,有没成功赋值、返回值格式是否正确;
  4. 2.2 如果没有返回值,看 view 里的对应方法处理是否正确
对 Jerry li 回复

JS 打印日志过了,触发了
接口调用成功,debug 模式有 id 传进来
但问题就是只传了 id,我用了你原来的文件,讲道理 modle 和名称起码应该可以和 id 一起传进来,但现在都没有。
老哥,现在有空么,能帮我查看下么

Jerry li #155 · January 09, 2019 Author
对 luomomimi 回复

可以加我 QQ 896745696

楼主,各种弹框,页面,ifame 的切换,你这里怎么设计的?

Jerry li #157 · January 09, 2019 Author

都是封装 selenium 的方法处理,例如:

def switchIframe(self,driver,para_list):
    method, value = para_list[0], para_list[1]
    # 切换 iframe
    if method=='css':
        method = By.CSS_SELECTOR
    driver.switch_to_frame(driver.find_element(by = method,value=value))
    time.sleep(2)

def switchWindow(self,driver):
    for name in driver.window_handles:
        if name != driver.current_window_handle:
            driver.switch_to.window(name)
    time.sleep(2)

对 Jerry li 回复

最近我也在做这方面内容,和你差不多也是这样维护的,发现用例维护进来的错误率太高了,最后本地搞了个简单的测试脚本...

大神,想问下 这里面接口这部分是怎么操作的呢?

指的接口测试部分吗? 现在接口测试没有放在这个平台上面

对 Jerry li 回复

有放在这个平台的意向吗?

内部使用有集成的,不过效果不是很好,后来改成单独的接口测试项目进行管理了

你好,想问一下单条测试用例可以运行,但是关联到测试集里就一直处于等待执行不知道是什么原因

请问答主用例的编写是没有采用 POM 模式吗?我看百度搜索的例子元素定位是直接写死在测试步骤中的,那如果我有 50 个案例均用到了同一个元素,后面元素定位信息改变了,那我是需要修改 50 个案例吗?

Jerry li #165 · April 17, 2019 Author
对 Alex 回复

我还没有采用 POM 的模式,其实也可以做个增强,增加一个自定义对象的功能,把这种使用很多次的元素作为对象管理起来。

另一方面,如果你某些步骤是被多个用例使用到的,就有必要抽出来作为公共方法。

感谢楼主分享,前面都很顺利,selenium 节点也自动加载了但是却发现调不起 chromedrive,最后参考 64 楼的方法成功调用了

Jerry li #167 · April 23, 2019 Author
对 RH 回复

64 楼这种方式是把调用 selenium server 的驱动改为本地驱动了。
如果你是在本地执行用例的,可以使用这种修改方式; 如果你是想用 selenium server(即通过 jar 包启动的方式), 就要看下面这部分了:

麻烦问一下楼主如果我想去数据库断言数据正确性怎么处理的

Jerry li #169 · April 26, 2019 Author
对 tangcheng1 回复

我现在没有做这种处理。
思路应该是封装一个从数据库读取数据的方法,然后把获取到的数据和页面上需要的数据进行断言对比就可以了。

那我应该封装到那个文件里面,app/core/extend.py 这个?

老哥,我测试用例集跑完后没有生成测试报告,然后邮件发送成功,但是收不到。这是因为没有报告的原因吗?

Jerry li #172 · April 27, 2019 Author
对 yangdashuaige 回复

看下你的邮件相关配置是否正确? 账号密码,SMTP 服务器地址,端口等等

“” 执行类型为 Chrome 时,不能关联 android 模块的用例, “” 否则无法执行!,我有些安卓用例需要在运营后台配置,这个限制在哪取消掉

Jerry li #174 · April 28, 2019 Author
对 tangcheng1 回复

这里的执行类似是指属于 web 的用例,还是属于 android 的用例。 因为对应具体的用例类型是不一样的(内部应用的驱动不一样,一个是 selenium ,一个是 uiautomator2 ),所以限制了不能混在同一个用例集里执行。

建议可以分开两个用例集,一个是 web 相关的用例,一个是 android 相关的用例。

楼主,我想问下。当用例集点击执行后,我观察代码是向数据库中 update 了一条数据。那么具体执行是从哪边,就是调用 selenium 执行的过程从哪边看到?小白一枚,希望楼主不吝赐教。

将数据库中的数据转成可执行的语句是哪边?谢谢楼主!

Jerry li #177 · April 29, 2019 Author
对 yangdashuaige 回复

你看下 coreservice.py 文件的代码,其实是一个轮询,如果发现有待执行状态的用例或者用例集,就会开始执行;而界面上操作的 update,就是把用例集更新为待执行的状态。

Jerry li #178 · April 29, 2019 Author
对 yangdashuaige 回复

具体执行 selenium 的方法,可以从 coreservice 方法开始跟踪,最后是由 process.py 里的 main 方法执行单条用例的

好的,谢啦老哥!

楼主,你好。我试了下这个测试平台觉得挺好的。但有两个问题想请教你一下。
1.添加用例集时提示请求出错,但用例集又添加了。请求是什么原因呢?
2.在用例集列表上直接点执行不会跑关联的用例。
下面是截图


Jerry li #181 · May 05, 2019 Author
对 zcwgd163 回复

这两个应该是 bug ,我有空的时候修复一下

楼主,你好。目前这个框架的用例好像没有部分执行功能也无法指定执行该用例的节点。请问是这样吗?如果是的话,请问方便加一下这两个功能吗?
1.在执行用例前可指定某些步骤不执行。
2.指定用例在某个特定的节点上执行,如果没有指定则随机选取一个可用的执行。

Jerry li #183 · May 07, 2019 Author
对 zcwgd163 回复

这种不是常规的需求吧,例如前几个步骤不执行,那流程还可以正常执行吗?
如果要这么做,把用例编辑一下,删掉不执行的步骤就可以了(效果和注释掉对应的代码一样)
至于指定节点,这个平台也是没有这个需求的,我的设计就是只要有可执行的节点就能执行。如果需要的话,要改对应查找节点的逻辑。

楼主你好,我想问下,那个接口管理是怎么使用的?我填了 url 进去一直是错误。

Jerry li #185 · May 10, 2019 Author
对 yangdashuaige 回复

报错是因为你的接口里没有参数,也就是 ? 后面的参数列表

请参考 github 上对应的说明:

非常感谢楼主!另外,我想发红包感谢下,楼主能留个微信号吗?

Jerry li #187 · May 12, 2019 Author
对 yangdashuaige 回复

有心了,感谢
很高兴得到你的认可,红包就不必了😀

楼主,这边进行安卓端自动化执行用例时报这个错,麻烦看下啥问题

189Floor has deleted
对 枫叶 回复

这里的 ip 为啥为 none,有影响吗

Jerry li #191 · May 13, 2019 Author
对 枫叶 回复

你的设备都连到 atx server 了吗? 看下 自动化测试- 节点管理 - 查看 android 设备列表页面里是否有可用的设备:

对 Jerry li 回复

列表中有设备

Jerry li #193 · May 13, 2019 Author
对 枫叶 回复

你安装的是 atx 2 吗? 我还没来得及看,不知道是否还兼容 我之前是基于 atx 开发的

对 Jerry li 回复

是的,安装的是 atx2

对 Jerry li 回复

atxserver2 的/api/v1/devices 没有 ip 的信息,需要用/api/v1/user/devices/${UDID}这个接口获取 atxAgentAddress 的地址信息 并且接口请求需要带上 token

Jerry li #197 · May 13, 2019 Author
对 linpengcheng 回复

那旧版本的使用没办法兼容了吗?

对 linpengcheng 回复

所以这边应该怎样改呢,看了下你那个 ATX-test 框架,你那个 uid 是写死的?

对 枫叶 回复

method = SERVER2 就能获取到所有的有效设备了
/api/v1/devices 返回中只能拿到设备的 UDID 然后根据 UIDID 请求/api/v1/user/devices/${UDID} 拿到 atxAgentAddress 就能链接到设备了

对 Jerry li 回复

我是直接写了 2 套 atxserver 和 atxserver2 分开来处理的

Jerry li #201 · May 13, 2019 Author
对 linpengcheng 回复

好的,有空再研究一下如何集成 atx2

老哥,我把项目部署到了服务器上,但是本地的 selenium 无法执行。我修改了本地的 client.py 中的地址,其他还有什么地方要修改的吗?

另外,那个分布式执行应该是怎么进行的?

Jerry li #204 · May 22, 2019 Author

update:2019-05-22
脑图集成部分代码已提交:
https://github.com/jerrylizilong/autotest_platform

Jerry li #205 · May 22, 2019 Author
对 yangdashuaige 回复

无法执行,具体的代码和报错、日志可以截图看看吗?

Jerry li #206 · May 22, 2019 Author
对 yangdashuaige 回复

分布式是由 selenium server 的 hub 和 node 方式实现的,只要把 selenium hub 配到 节点管理 里面,剩下的事情 selenium server 会自动完成:


就是我在这边配置了,但是本地运行 python client,py 的时候

客户端的 client.py 的地址需要修改吗?

Jerry li #209 · May 24, 2019 Author
对 yangdashuaige 回复

你服务端的 service.py 启动了吗? 看报错是找不到 host


老哥,这个 ip 填的是自己本地电脑的 ip 地址吗?
我把服务都启动了,但是还是显示

Jerry li #211 · May 25, 2019 Author
对 yangdashuaige 回复

你的 service.py 在哪台机运行,就填那台机的 IP
如果都是本地,填 127.0.0.1


老哥,这边客户端的 client.py 文件中的这里填的是本机的 ip 还是服务器的 ip?

另外,4444 端口和 9998 端口分别是干啥的?为啥要先 isOpen() 本地的 4444 端口。
客户端和服务器端建立 TCP 连接时在 9998 端口上吗?

Jerry li #214 · May 27, 2019 Author

4444 端口是 selenium Server 是默认端口,client 和 service 是通过 9998 端口进行通信


老哥,那个 socket 通信终于连接了,但是还是有个坑,就是执行的问题。
我是把这个项目放到了服务器上,然后准备在页面上操作可以实现在本地客户端进行测试,但是我点击测试的时候,报了这个错误。为啥会不能进行测试呢?

Jerry li #216 · May 28, 2019 Author
对 yangdashuaige 回复

看你截图最上面两行,你的 client down 了,所以不可用

Author only


本地还是启动不起来,报的是这个错误

Jerry li #219 · May 28, 2019 Author
对 yangdashuaige 回复

你的 client.py 是怎么启动的啊,没有启动 selenium server 就自动退出了。
这个 client 要做的事情是:

  1. 检查本地 4444 端口是否已启用。
  2. 将 4444 端口上报到 service 服务中进行登记。
  3. 启动本地的 selenium server 服务,即 selenium 的 jar 包。 此时就可以执行测试了。

你现在的情况,是第三步没起来,你看下是不是改了代码配置还是说没下载 client 目录对应的 jar 包。

xpath 定位格式应该怎么写呢,还有验证我写的第二个页面的文字,但是一直验证失败

Jerry li #221 · May 31, 2019 Author
对 362928259 回复

xpath : 点击 |xpath@@value

验证: 第二个页面是什么意思?打开另外一个窗口吗? 是的话,要先 切换窗口

对 Jerry li 回复

就是登陆成功之后页面的文字,图片或者按钮的文字验证不成功,文本的文字可以验证成功了;如果验证页面数据是不是和数据库数据一致该怎么验证呢?

Author only
224Floor has deleted
225Floor has deleted

接口的模块是没有请求方式么 post 和 get

227Floor has deleted
Jerry li #228 · June 05, 2019 Author
对 362928259 回复

验证失败会自动截图,你可以看下截图的内容是不是正常的

Jerry li #229 · June 05, 2019 Author
对 521anran 回复

默认是 post,需要的话自己看下如何修改吧

近期工作很忙,没时间维护这个项目,所以不推荐用接口测试这个模块,或者自己做二次开发吧

你好,我这边脑图有点问题,有空可以帮忙看一下?

Jerry li #231 · June 05, 2019 Author
对 黑白灰 回复

可能是少提交了一些文件。
你看下从 kityminder 的 git 上能不能下载对应文件吧

对 Jerry li 回复

好的大佬

对 黑白灰 回复

是缺少了文件,哈哈 ,在 static/minder 里面

能不能讲下单元测试怎么操作的呢,感谢

对 521anran 回复

嗯嗯,已解决

忍不住问下,Blueprint 这个有注册么,我想尝试着增加新的模块,但是一直提示 page not found!

Jerry li #237 · June 06, 2019 Author
对 521anran 回复

app /_ init.py 文件里面注册

Jerry li #238 · June 06, 2019 Author
对 521anran 回复

就是一个 unittest 的执行而已

239Floor has deleted
Author only
Jerry li #241 · June 13, 2019 Author
对 362928259 回复

验证不通过的话可以抓页面看下具体的值是多少,或者是否切换到了不同的 iframe

楼主你好 如何把你这套搭建到服务器上?一直提示无法执行
还有
这一步不知道怎么搞

Jerry li #243 · June 18, 2019 Author
对 shensen1214 回复

服务器上同样的方式源码启动即可

提个问题,xpath 无法使用类似//a[contains(@href,'地址')] 模糊搜索定位,这样会被逗号进行切割,导致定位失败!

Jerry li #245 · June 21, 2019 Author
对 墨然 回复

你可以在源码里加个转义

您好,想请教下,为啥我这边跑用例的时候,chrome 只闪现了一下就关闭了?

Jerry li #247 · June 23, 2019 Author
对 Lysa9409 回复

感觉是你的 chrome driver 版本太低了

在 pycharm 跑其他用例,用的是同一个 chromedriver,用例可以跑通,应该不是 chromedriver 版本的问题

Jerry li #249 · June 24, 2019 Author
对 Lysa9409 回复

你确认一下看看,提示的版本是 2.20,可能和我代码里提供的 selenium Server(3.11)版本不一致

selenium server 3.11 这个版本对应多少版本的 chromedriver 呢?

Jerry li #251 · June 24, 2019 Author
对 Lysa9409 回复

自己百度搜一下吧

你好 想问下这个使用 flask 传参给 selenium selenium 可以实现持久化吗

Jerry li #253 · July 05, 2019 Author
对 liwenbest 回复

持久化是什么意思?

对 Jerry li 回复

实现 selenium 的持久化,即浏览器一直不关闭并且能接收 flask 传入的命令

楼主 请教一下 BootStrap-table 控件 默认不展示
某个字段 怎没实现

Jerry li #256 · July 10, 2019 Author
对 1353644643 回复

这是定制开发的内容,你需要的话二次开发就好了

Jerry li #257 · July 10, 2019 Author
对 liwenbest 回复

不知道你这么做的需求是什么

上面那个问题解决了 感谢回复,,这几天一直在试用这个 还有个问题想请教下 楼主 有没有尝试过 把这个发布出来 部署在 iis 上 去使用呢,我尝试部署 在 iis 上不成功 期待回复

对 1353644643 回复

我理解这是 Python 的服务,Windows 下直接启动就可以了,应该不需要使用到 IIS 吧?

您好,我登录后报这个错,不知道咋回事

执行 “UI 自动化测试用例整理举例 - 百度首页” 的几个用例之后,只会进百度首页 然后什么都不干 过会就关掉了 显示执行失败 截图全是百度首页
用命令行在 envs 环境内启动了 run.py 和 core.py 然后 java -jar 启动的 app/client 里面的 selenium service,自己下的新版本 3.141.59 chromedriver 也是去官网刚下的和版本对应的版本。。。

楼主 步骤生成器 有时就加载不出来关键字了 😀

Jerry li #263 · July 18, 2019 Author
对 1353644643 回复

F12 看下报什么错


解决了 报类型错误 因为改代码时用了 中文的标点符号 还有个问题 脑图 不能 上传本地图片 想请教一下 脑图的源码 好像也不能上传本地图片

265Floor has deleted
Jerry li #266 · July 19, 2019 Author

没用过上传图片的功能,你可以找 KittyMinder 的源码看一下,我只是把它集成到 flask 而已

Jerry li #267 · July 19, 2019 Author
对 brahmslee 回复

报错信息截图看一下?

Jerry li #268 · July 19, 2019 Author
对 sany-soft 回复

没遇到过这个报错,可以搜一下看看

上面上传不了图片 不影响其他的 上传不了 应该是要配置个 文件上传的路径 还不知道 往哪配 楼主有空 可以帮忙看看

Jerry li #270 · July 19, 2019 Author
对 1353644643 回复

最近换了公司,目前没有在维护这套了。
你可以试下根据他的说明加上

对 Jerry li 回复


这个是 core 里的

这个是 node 里的

Jerry li #272 · July 22, 2019 Author
对 brahmslee 回复

实现把 填写 改成 填写 1

Author only
Jerry li #274 · July 29, 2019 Author
对 1353644643 回复

有什么问题在这里问吧,我 QQ 号现在不用了
另外我刚换了工作,新公司没有用这个框架,所以我尽量回复你,但是没办法帮你调试或者开发新功能了

请问个问题,docker 下执行用例时,经常会有用例出现 WebDriverException: Message: Session [750685c9031b369275b84fd4f5569b9e] was terminated due to BROWSER_TIMEOUT 这种报错,有什么办法解决吗?

Jerry li #276 · August 14, 2019 Author
对 毛毛虫 回复

我好像没遇到过这个问题

楼主,遇到弹窗,如何定位当前页面弹出窗口上的确认按钮,步骤加入切换后还需不需要填入参数了,我看你是有"$para1","$para2"] 两个参数要求,可是我填了定位的参数,每次到切换就出错了,就是无法点击到弹窗上的确认按钮

Jerry li #278 · August 24, 2019 Author
对 ruaruaeat 回复

记得 selenium 有处理弹窗的方法,可以自行封装一下

大佬你的框架哪里可以接入三方 api 的,公司项目现在登录有图形验证码校验的问题,我用百度 AIP ORC 识别的方法来通过验证。。现在想改下框架

对 ruaruaeat 回复

建议你可以试下这么改:把识别的过程封装为一个关键字,然后在需要的时候调用这个方法进行识别。
具体怎么封装新的关键字,可以看下上面正文里的说明

对 Jerry li 回复

识别过程需要调用百度 aip 的三方接口,三方接口允许调用吗?在哪里调用?

对 ruaruaeat 回复

你直接在代码里调用第三方就可以了,然后把这部分封装为一个关键字

对 Jerry li 回复

楼主楼主,我点测试用例集页,用例集上那个执行,但是只发送了邮件,但是并没有执行测试用例,是本身就没功能吗? 如果把执行详情的重跑全部用例那个接口接到外面的执行上面,前端要改哪个文件,不是很懂前端😟

对 ruaruaeat 回复

应该是没有重跑所有用例。
如果要改,你就把这个 执行 按钮绑定的方法,改成和详情页 重跑全部用例 按钮绑定的方法一样就可以了,具体的方法你可以右键属性查看;修改的话,应该是在 test_suite.js 这个文件里

285Floor has deleted

大佬,昨天搭建了一下,用着很好,不过有个情况不知道怎么写,就是用例之前传递变量。比如我先获取了这个订单号,然后定位到搜索框想输入这个订单号。

还行问下,想知道的用例报错的详细信息,怎么看哈。就是堆栈报出来的错

大佬你好,刚开始使用您这套东西,关于如何启动 selenium 服务我没搞清楚,可以指导一下吗?红框部分我不知道应该如何操作!

想问一下您知道,selenium server 这块是如何操作的吗,非常感谢

290Floor has deleted

想请教一下作者 怎么样可以一直测试 比如说挂到服务器上 执行一个小时 或者更久

请问一下楼主,我的脑图模块点击编辑内容后只能看到最上面的一行组件,其他功能都不显示,不知道该怎么办 😭

Jerry li #293 · July 10, 2020 Author
对 Diane 回复

你的 JS 很多都报 404 了,找不到文件。 你检查一下对应文件在不在吧

对 Jerry li 回复

好的,我仔细找找,谢谢楼主

对 Jerry li 回复

楼主,脑图是需要另外按照模块里的 readme 文件进行安装是吗

请问节点突然无法使用了,pycharm 运行无法获取节点,但是如果用 cmd 命令行则节点可以启动,但显示的地址的无线局域网地址,而且用例依旧无法运行。而且 run 以后 ie 内核的浏览器可以访问地址,但 Chrome 的无法访问,不知道为啥一个周末就突然变成这样了,之前都没事

Jerry li #297 · July 21, 2020 Author
对 Diane 回复

看一下是不是你电脑的 IP 地址换了?
Chrome 和 IE 访问的都是同一个 IP 地址和 URL 吗?

298Floor has deleted
Author only
300Floor has deleted
Krabs · #301 · June 24, 2021
Author only
Jerry li #302 · June 26, 2021 Author
对 Krabs 回复

我怀疑是你的服务器端无法访问到你本地的 selenium server,所以提示 4444 is down.

建议你检查一下这块,比如网关,端口什么的是否有限制,或者直接从服务 Telnet 一下你本地的地址和端口看是否能通

zeng · #303 · November 12, 2021
Author only
对 zeng 回复

用例管理那里有单条执行的入口

zeng · #305 · November 12, 2021
Author only
对 zeng 回复

autotest_platform/app/core/process.py /
这个文件里面

对 Jerry li 回复

感谢大佬~

楼主好 我遇到一个问题,启动 run.py 后 访问域名不是打开页面,而是把 html 文件给下载到本地了,路由都是正确的 就是没识别出 html。请教一下这是什么原因。

楼主好 我想问一下 公共模块怎么关联到测试集里

对 limumu 回复

这个情况没遇到过。你是改动了 view 里面的代码吗?

对 wujiale 回复

公共模块是作为用例的一部分嵌进去的。你可以写一条用例,然后调用公共用例,或者看一下公共用例是不是可以直接关联到用例集里面。
因为这个项目我已经两年多没有在用了,所以有些细节不是很记得了。

对 Jerry li 回复

问题解决了 与环境有关 应该是安装了其他第三方库引起的 隔离了环境后正常

313Floor has deleted

大佬。我不太懂代码, 我想问一下,新增时,我想新增几个模块。修改那个文件?

Jerry li #315 · January 29, 2024 Author
对 zijie 回复

在 app/templates/uitest/test_case.html 文件,29 行这个 option 里面改成你要的名字,或者增加 option 就可以了

对 Jerry li 回复

我添加了。 在查询里能看到我修改的名字。 但是新增的页面还是只有原来的三个模块。😂

这个位置我修改来。 查询的时候可以看到加的那几个。 但是我在新增的时候选不到

Jerry li #318 · January 29, 2024 Author
对 zijie 回复

你看看其他几个 template ,哪个页面要改就改哪个 template

博主帮我看看这是什么情况呀



麻烦博主了 好久了没解决

Jerry li #321 · March 08, 2024 Author
对 CYN123hhh 回复

看起来是你用的 selenium 版本兼容性问题。 你先试试本地直接跑 selenium 是不是能跑起来? 就随便用 python 写个 selenium 的测试脚本,能调起浏览器和打开网页就基本上没问题了

301 个评论和这么多点赞: 这比那个 Java 写接口自动化的好很多了吧,居然没加精😄

Jerry li #323 · March 08, 2024 Author
对 null 回复

这三百多评论里有一般是我的回复,哈哈


为什么我执行成功了 也自动打开 chrome 了 状态却是执行失败

Jerry li #325 · March 11, 2024 Author
对 CYN123hhh 回复

看你的截图,失败的是 验证 的那个步骤,也就是断言失败了。
你可以点开旁边的截图看看具体是什么问题,有可能是你用错了关键字

请问博主这四个是用什么镜像下载的:framework==0.1.0 get==2019.4.13 post==2019.4.13
request==2019.4.13,我这里下载失败了,不知道是不是因此导致用例集查看结果页面的这个错误:

Jerry li #327 · March 12, 2024 Author
对 CYN123hhh 回复

Pyechart 我以前用的是 0.5.5 , 你看看能不能安装这个版本

博主,我部署不上 atxserver2,一直提示 wait-for-db.sh 文件有非法字符,web1 无法启动,这个能解决吗?如果不能的话,我安装 stf,你的项目代码要改吗?

对 CYN123hhh 回复

博主,我已经安装好 atxserver2 了。想问一下你的代码支持测试 IOS 手机吗

Jerry li #330 · April 08, 2024 Author
对 CYN123hhh 回复

我当时没有集成 iOS 的代码


博主,能不能帮我看看这个上传图片的用例为什么错了啊



这个为什么也错了啊


博主,能不能看看,执行一个弹窗类用例出错了

Jerry li #335 · May 17, 2024 Author

楼上的朋友们,这个项目我已经五年没维护了,所以你们如果遇到问题请尽量自己尝试解决和二次开发,恕我现在没办法帮到你们。 所以请慎重选择这个项目哈,抱歉!

采用 grid,怎样解决文件上传和下载的问题

感谢楼主的开源,后来为了应对公司的需求,在平台编辑的脚本,然后把脚本放到了用 java 实现的本地服务执行,就可以把自动化平台放到公网,本地起个客户端服务,就可以测试网页了,原本的模式自动化平台和 selenium-server 服务之间,不允许有内外网跳转的网络环境,就有所限制

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up。