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

Jerry li · August 12, 2018 · Last by 咖喱饭 replied at October 24, 2019 · 20523 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 账号、密码等信息

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

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

回复

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

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

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

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

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

Jerry li 回复

嗯,谢谢。做得很好了😁

update : 2018-08-28

新增测试用例编辑器功能

效果如下:

Jerry li UI 自动化测试用例整理举例-百度首页 中提及了此贴 28 Aug 19:56

请问下,已经运行了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 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 been 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 作者

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

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

每个任务生成独立的报告

Jerry li 回复

知道了,谢谢

Jerry li 回复

两个//也不行

Jerry li #129 · January 03, 2019 作者
stefan 回复

两个 \ 还是 / ?

Jerry li 回复

两个\

Jerry li #131 · January 04, 2019 作者
stefan 回复

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

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

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

试下把这行注释掉,然后手动建库 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 作者
stefan 回复

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

Jerry li #138 · January 07, 2019 作者
stefan 回复

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

Jerry li 回复

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

Jerry li #140 · January 07, 2019 作者
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 作者
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 作者
luomomimi 回复

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

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

Jerry li #149 · January 09, 2019 作者
luomomimi 回复

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

Jerry li 回复

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

Jerry li #151 · January 09, 2019 作者
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 作者
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 作者
luomomimi 回复

可以加我 QQ 896745696

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

Jerry li #157 · January 09, 2019 作者

都是封装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 作者
Bob 回复

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

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

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

Jerry li #167 · April 23, 2019 作者
RH 回复

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

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

Jerry li #169 · April 26, 2019 作者
tangcheng1 回复

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

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

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

Jerry li #172 · April 27, 2019 作者
yangdashuaige 回复

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

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

Jerry li #174 · April 28, 2019 作者
tangcheng1 回复

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

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

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

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

Jerry li #177 · April 29, 2019 作者
yangdashuaige 回复

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

Jerry li #178 · April 29, 2019 作者
yangdashuaige 回复

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

好的,谢啦老哥!

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


Jerry li #181 · May 05, 2019 作者
zcwgd163 回复

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

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

Jerry li #183 · May 07, 2019 作者
zcwgd163 回复

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

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

Jerry li #185 · May 10, 2019 作者
yangdashuaige 回复

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

请参考github 上对应的说明:

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

Jerry li #187 · May 12, 2019 作者
yangdashuaige 回复

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

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

189Floor has been deleted
枫叶 回复

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

Jerry li #191 · May 13, 2019 作者
枫叶 回复

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

Jerry li 回复

列表中有设备

Jerry li #193 · May 13, 2019 作者
枫叶 回复

你安装的是 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 作者
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 作者
linpengcheng 回复

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

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

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

Jerry li #204 · May 22, 2019 作者

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

Jerry li #205 · May 22, 2019 作者
yangdashuaige 回复

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

Jerry li #206 · May 22, 2019 作者
yangdashuaige 回复

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


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

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

Jerry li #209 · May 24, 2019 作者
yangdashuaige 回复

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


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

Jerry li #211 · May 25, 2019 作者
yangdashuaige 回复

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


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

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

Jerry li #214 · May 27, 2019 作者

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


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

Jerry li #216 · May 28, 2019 作者
yangdashuaige 回复

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

Author only


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

Jerry li #219 · May 28, 2019 作者
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 作者
362928259 回复

xpath : 点击|xpath@@value

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

Jerry li 回复

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

Author only
224Floor has been deleted
225Floor has been deleted

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

227Floor has been deleted
Jerry li #228 · June 05, 2019 作者
362928259 回复

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

Jerry li #229 · June 05, 2019 作者
521anran 回复

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

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

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

Jerry li #231 · June 05, 2019 作者
黑白灰 回复

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

Jerry li 回复

好的大佬

黑白灰 回复

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

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

521anran 回复

嗯嗯,已解决

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

Jerry li #237 · June 06, 2019 作者
521anran 回复

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

Jerry li #238 · June 06, 2019 作者
521anran 回复

就是一个 unittest 的执行而已

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

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

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

Jerry li #243 · June 18, 2019 作者
shensen1214 回复

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

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

Jerry li #245 · June 21, 2019 作者
墨然 回复

你可以在源码里加个转义

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

Jerry li #247 · June 23, 2019 作者
Lysa9409 回复

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

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

Jerry li #249 · June 24, 2019 作者
Lysa9409 回复

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

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

Jerry li #251 · June 24, 2019 作者
Lysa9409 回复

自己百度搜一下吧

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

Jerry li #253 · July 05, 2019 作者
liwenbest 回复

持久化是什么意思?

Jerry li 回复

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

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

Jerry li #256 · July 10, 2019 作者
1353644643 回复

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

Jerry li #257 · July 10, 2019 作者
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 作者
1353644643 回复

F12 看下报什么错


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

265Floor has been deleted
Jerry li #266 · July 19, 2019 作者

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

Jerry li #267 · July 19, 2019 作者
brahmslee 回复

报错信息截图看一下?

Jerry li #268 · July 19, 2019 作者
sany-soft 回复

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

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

Jerry li #270 · July 19, 2019 作者
1353644643 回复

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

Jerry li 回复


这个是core里的

这个是node里的

Jerry li #272 · July 22, 2019 作者
brahmslee 回复

实现把 填写 改成 填写1

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

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

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

Jerry li #276 · August 14, 2019 作者
毛毛虫 回复

我好像没遇到过这个问题

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

Jerry li #278 · August 24, 2019 作者
ruaruaeat 回复

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

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

ruaruaeat 回复

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

Jerry li 回复

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

ruaruaeat 回复

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

Jerry li 回复

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

ruaruaeat 回复

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

285Floor has been deleted

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

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

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