├── Autotestplat-V5.0使用手册.docx ├── Autotestplat ├── __init__.py ├── celery.py ├── settings.py ├── urls.py └── wsgi.py ├── LICENSE ├── README.md ├── Redis-x64-3.2.100 ├── EventLog.dll ├── dump.rdb ├── redis-benchmark.exe ├── redis-benchmark.pdb ├── redis-check-aof.exe ├── redis-check-aof.pdb ├── redis-cli.exe ├── redis-cli.pdb ├── redis-server.exe ├── redis-server.pdb ├── redis.windows-service.conf └── redis.windows.conf ├── autotest ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── static │ ├── css │ │ ├── bootstrap.min.css │ │ ├── codemirror.css │ │ ├── dt.css │ │ ├── fileinput.min.css │ │ ├── navbar.css │ │ ├── select2.min.css │ │ └── style.css │ ├── dist │ │ ├── css │ │ │ ├── animate.css │ │ │ ├── design-iconic-font.min.css │ │ │ ├── dripicons.css │ │ │ ├── font-awesome.min.css │ │ │ ├── glyphicons.css │ │ │ ├── ionicons.min.css │ │ │ ├── lightgallery.css │ │ │ ├── linea-icon.css │ │ │ ├── pe-icon-7-stroke.css │ │ │ ├── simple-line-icons.css │ │ │ ├── style.css │ │ │ ├── style.css.map │ │ │ └── themify-icons.css │ │ └── fonts │ │ │ └── ionicons │ │ │ ├── ionicons.eot │ │ │ ├── ionicons.svg │ │ │ ├── ionicons.ttf │ │ │ ├── ionicons.woff │ │ │ └── ionicons.woff2 │ ├── js │ │ ├── apptestcase.js │ │ ├── bootstrap.min.js │ │ ├── codemirror.js │ │ ├── exporting.js │ │ ├── fileinput.min.js │ │ ├── index.js │ │ ├── jquery.min.js │ │ ├── performance.js │ │ ├── product.js │ │ ├── public.js │ │ ├── report.js │ │ ├── select2.full.min.js │ │ ├── select2.min.js │ │ ├── systemsettings.js │ │ ├── testcase.js │ │ ├── testplan.js │ │ ├── user.js │ │ └── webtestcase.js │ ├── src │ │ ├── localfiles │ │ │ ├── bootstrap.min.js │ │ │ ├── dataTables.bootstrap4.min.js │ │ │ └── jquery.dataTables.min.js │ │ └── pic │ │ │ ├── check.png │ │ │ ├── icon_add.png │ │ │ ├── icon_del.png │ │ │ ├── icon_edit.png │ │ │ ├── icon_edit_1.png │ │ │ ├── ui_add.png │ │ │ ├── ui_delete.png │ │ │ ├── ui_edit.png │ │ │ ├── ui_radio_button.png │ │ │ ├── ui_search.png │ │ │ └── user.png │ └── vendors │ │ ├── bootstrap │ │ └── dist │ │ │ ├── css │ │ │ └── bootstrap.min.css │ │ │ └── js │ │ │ └── bootstrap.min.js │ │ ├── jquery │ │ └── dist │ │ │ └── jquery.min.js │ │ ├── laydate │ │ ├── laydate.js │ │ └── theme │ │ │ └── default │ │ │ ├── font │ │ │ ├── iconfont.eot │ │ │ ├── iconfont.svg │ │ │ ├── iconfont.ttf │ │ │ └── iconfont.woff │ │ │ └── laydate.css │ │ ├── owl.carousel │ │ └── dist │ │ │ ├── assets │ │ │ ├── owl.carousel.min.css │ │ │ ├── owl.theme.default.min.css │ │ │ └── owl.video.play.png │ │ │ └── owl.carousel.min.js │ │ └── popper.js │ │ └── dist │ │ └── umd │ │ └── popper.min.js ├── tasks.py ├── templates │ ├── app_testcase.html │ ├── index.html │ ├── interface_add.html │ ├── interface_edit.html │ ├── interface_performance.html │ ├── interface_report.html │ ├── interface_report_detail.html │ ├── interface_testcase.html │ ├── interface_testplan.html │ ├── login.html │ ├── product.html │ ├── system_setting.html │ ├── user.html │ └── web_testcase.html ├── test_out.log ├── tests.py ├── urls.py ├── users.txt ├── views.py ├── views_apptestcase.py ├── views_index.py ├── views_interface.py ├── views_interfacereport.py ├── views_interfacetestplan.py ├── views_jmeter.py ├── views_performance.py ├── views_product.py ├── views_systemsettings.py ├── views_user.py └── views_webtestcase.py ├── autotestplat.sql ├── chromedriver.exe ├── manage.py ├── requirements.txt ├── start_beat.bat ├── start_service.bat └── start_worker.bat /Autotestplat-V5.0使用手册.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Autotestplat-V5.0使用手册.docx -------------------------------------------------------------------------------- /Autotestplat/__init__.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | 3 | pymysql.version_info=(1,4,3,"final",0) 4 | pymysql.install_as_MySQLdb() -------------------------------------------------------------------------------- /Autotestplat/celery.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ############################################ 3 | #Auther::Fin 4 | #Version:Autotestplat-V2.3 5 | ############################################ 6 | from __future__ import absolute_import 7 | import os 8 | from celery import Celery 9 | import django 10 | from django.conf import settings 11 | 12 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Autotestplat.settings') 13 | django.setup() 14 | 15 | app = Celery('Autotestplat') 16 | 17 | app.config_from_object('django.conf:settings') 18 | app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 19 | 20 | app.conf.enable_utc = True 21 | app.conf.timezone = "Asia/Shanghai" 22 | 23 | @app.task(bind=True) 24 | def debug_task(self): 25 | print('Request: {0!r}'.format(self.request)) -------------------------------------------------------------------------------- /Autotestplat/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for Autotestplat project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.1.3. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.2/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | import djcelery 16 | djcelery.setup_loader() 17 | 18 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 19 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 20 | 21 | 22 | # Quick-start development settings - unsuitable for production 23 | # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 24 | 25 | # SECURITY WARNING: keep the secret key used in production secret! 26 | SECRET_KEY = '4(l9q$nnrl8@kzf!#at)6g44086o!xz8!5h)mo@(y0!!f$3*y#' 27 | 28 | # SECURITY WARNING: don't run with debug turned on in production! 29 | DEBUG = True 30 | 31 | ALLOWED_HOSTS = ['*'] 32 | 33 | 34 | INSTALLED_APPS = [ 35 | 'django.contrib.admin', 36 | 'django.contrib.auth', 37 | 'django.contrib.contenttypes', 38 | 'django.contrib.sessions', 39 | 'django.contrib.messages', 40 | 'django.contrib.staticfiles', 41 | 'autotest', 42 | 'djcelery', 43 | 'django_redis', 44 | ] 45 | 46 | MIDDLEWARE = [ 47 | 'django.middleware.security.SecurityMiddleware', 48 | 'django.contrib.sessions.middleware.SessionMiddleware', 49 | 'django.middleware.common.CommonMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'Autotestplat.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | # 'DIRS': [], 61 | 'DIRS': [os.path.join(BASE_DIR, 'autotest/templates')], 62 | 'APP_DIRS': True, 63 | 'OPTIONS': { 64 | 'context_processors': [ 65 | 'django.template.context_processors.debug', 66 | 'django.template.context_processors.request', 67 | 'django.contrib.auth.context_processors.auth', 68 | 'django.contrib.messages.context_processors.messages', 69 | ], 70 | }, 71 | }, 72 | ] 73 | 74 | WSGI_APPLICATION = 'Autotestplat.wsgi.application' 75 | 76 | 77 | DATABASES = { 78 | 'default': { 79 | 'ENGINE': 'django.db.backends.mysql', 80 | 'NAME': 'autotestplat', 81 | 'HOST': '127.0.0.1', 82 | 'PORT': 3306, 83 | 'USER': 'root', 84 | 'PASSWORD': 'test123456'} 85 | } 86 | 87 | AUTH_PASSWORD_VALIDATORS = [ 88 | { 89 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 90 | }, 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 99 | }, 100 | ] 101 | 102 | 103 | LANGUAGE_CODE = 'en-us' 104 | TIME_ZONE = 'Asia/Shanghai' 105 | USE_I18N = True 106 | USE_L10N = True 107 | USE_TZ = True 108 | 109 | 110 | STATIC_URL = '/static/' 111 | STATICFILES_DIRS = [ 112 | os.path.join(BASE_DIR, "autotest").join("static") 113 | ] 114 | 115 | MEDIA_URL = "/upload/" 116 | MEDIA_ROOT = os.path.join(BASE_DIR,'upload') 117 | 118 | CACHES = { 119 | 'default': { 120 | 'BACKEND': 'django_redis.cache.RedisCache', 121 | 'LOCATION': 'redis://127.0.0.1:6379/1', 122 | }, 123 | } 124 | REDIS_TIMEOUT=7*24*60*60 125 | CUBES_REDIS_TIMEOUT=60*60 126 | NEVER_REDIS_TIMEOUT=365*24*60*60 127 | 128 | 129 | CELERY_TIMEZONE = 'Asia/Shanghai' 130 | CELERY_ENABLE_UTC=True 131 | # BROKER_URL= 'amqp://root:root@127.0.0.1:5672/of1' #rabbitmq 132 | BROKER_URL = 'redis://127.0.0.1:6379/0' 133 | BROKER_TRANSPORT = 'redis' 134 | CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1' 135 | CELERY_ACCEPT_CONTENT = ['json'] 136 | CELERY_TASK_SERIALIZER = 'json' 137 | CELERY_RESULT_SERIALIZER = 'json' 138 | CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' -------------------------------------------------------------------------------- /Autotestplat/urls.py: -------------------------------------------------------------------------------- 1 | """Autotestplat URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.2/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include 18 | 19 | 20 | urlpatterns = [ 21 | path('admin/', admin.site.urls), 22 | path('autotest/', include('autotest.urls')), 23 | ] 24 | -------------------------------------------------------------------------------- /Autotestplat/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for Autotestplat project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Autotestplat.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Autotestplat 2 | AI+自动化测试平台系统 3 | 4 | 最新版本已升级到Autotestplat6.0,接入了大模型,支持AI生成测试用例,是付费版本, 5 | Autotestplat6.0及以后的版本都将是付费版本,如有需要请请联系作者购买,作者微信:fin123456,公众号:测试开发社区! 6 | 7 | 8 | Autotestplat-v5.2.2及以前版本依然开源免费 9 | 功能介绍: 10 | 实现了接口自动化测试,产品/项目,用户,系统参数设置,接口测试用例,测试计划,定时任务,测试报告。 11 | 实现了实时接口性能测试,生成测试脚本,执行测试,测试报告。 12 | 实现了AppUI自动化设置,用例录入,单个用例运行,全部用例运行。 13 | 实现了WebUI自动化设置,用例录入,单个用例执行,全部用例执行。 14 | 15 | 16 | 部署指南: 17 | python3.6 18 | django2.1.3 19 | 更高版本待后续更新... 20 | 1、下载和安装python 3.6、git、mysql、redis等安装包https://github.com/testdevhome/installPackage 21 | 2、git clone https://github.com/testdevhome/Autotestplat 22 | 3、cd Autotestplat 23 | 4、pip install -r requirements.txt 24 | 5、创建和导入数据库 25 | 创建数据库名autotestplat,导入autotestplat.sql 26 | 修改数据库连接配置文件 Autotestplat/settings.py 77行 DATABASES 27 | 6、运行命令 python manage.py runserver 0.0.0.0:80 28 | 7、运行命令 redis-server redis.conf 29 | 8、python manage.py celery worker -c 6 -l debug 30 | 9、python manage.py celery beat 31 | 10、访问 127.0.0.1/autotest/login 32 | 33 | 操作手册: 34 | 接口测试 35 | 第一步、设置用户,设置产品/项目,用户设置默认产品,也就是当前正在进入使用的产品。 36 | 第二步、在系统设置中设置参数,环境设置即设置host地址,常量即设置固定值作为参数,变量可以是时间戳,随机数字、字符等。 37 | 第三步、在接口用例中进行接口用例录入调试,设置断言,通过正则表达式设置关联参数,执行;在接口中通过{关键字}设置参数。 38 | 第四步、在测试计划中选择接口用例,定时设置,勾选用例调试。 39 | 第五步、在测试报告中查看测试记录,报告的详情数据。 40 | 性能测试 41 | 第一步、选择接口,输入并发数,持续压测时间,点击生成jmeter脚本。 42 | 第二步、点击测试开始。 43 | 第三步、点击查看结果。 44 | AppUI测试 45 | 第一步、系统设置App设置。 46 | 第二步、启动weditor,连接手机,抓取App元素控件,录入用例。 47 | 第三步、执行,查看用例结果。 48 | WebUI测试 49 | 第一步、系统设置Web设置。 50 | 第二步、安装谷歌浏览器版本100.0.4896.75 (正式版本) (32 位)。 51 | 第三步、执行,查看用例结果。 52 | 53 |  54 |  55 |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 | 64 | 65 | 欢迎关注我们的微信公众号,请扫一扫如下图: 66 | 67 |  68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /Redis-x64-3.2.100/EventLog.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/EventLog.dll -------------------------------------------------------------------------------- /Redis-x64-3.2.100/dump.rdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/dump.rdb -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-benchmark.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-benchmark.exe -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-benchmark.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-benchmark.pdb -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-check-aof.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-check-aof.exe -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-check-aof.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-check-aof.pdb -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-cli.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-cli.exe -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-cli.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-cli.pdb -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-server.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-server.exe -------------------------------------------------------------------------------- /Redis-x64-3.2.100/redis-server.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/Redis-x64-3.2.100/redis-server.pdb -------------------------------------------------------------------------------- /autotest/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/__init__.py -------------------------------------------------------------------------------- /autotest/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /autotest/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AutoConfig(AppConfig): 5 | name = 'autotest' 6 | -------------------------------------------------------------------------------- /autotest/static/css/codemirror.css: -------------------------------------------------------------------------------- 1 | /* BASICS */ 2 | 3 | .CodeMirror { 4 | /* Set height, width, borders, and global font properties here */ 5 | font-family: monospace; 6 | height: 300px; 7 | color: black; 8 | direction: ltr; 9 | } 10 | 11 | /* PADDING */ 12 | 13 | .CodeMirror-lines { 14 | padding: 4px 0; /* Vertical padding around content */ 15 | } 16 | .CodeMirror pre.CodeMirror-line, 17 | .CodeMirror pre.CodeMirror-line-like { 18 | padding: 0 4px; /* Horizontal padding of content */ 19 | } 20 | 21 | .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { 22 | background-color: white; /* The little square between H and V scrollbars */ 23 | } 24 | 25 | /* GUTTER */ 26 | 27 | .CodeMirror-gutters { 28 | border-right: 1px solid #ddd; 29 | background-color: #f7f7f7; 30 | white-space: nowrap; 31 | } 32 | .CodeMirror-linenumbers {} 33 | .CodeMirror-linenumber { 34 | padding: 0 3px 0 5px; 35 | min-width: 20px; 36 | text-align: right; 37 | color: #999; 38 | white-space: nowrap; 39 | } 40 | 41 | .CodeMirror-guttermarker { color: black; } 42 | .CodeMirror-guttermarker-subtle { color: #999; } 43 | 44 | /* CURSOR */ 45 | 46 | .CodeMirror-cursor { 47 | border-left: 1px solid black; 48 | border-right: none; 49 | width: 0; 50 | } 51 | /* Shown when moving in bi-directional text */ 52 | .CodeMirror div.CodeMirror-secondarycursor { 53 | border-left: 1px solid silver; 54 | } 55 | .cm-fat-cursor .CodeMirror-cursor { 56 | width: auto; 57 | border: 0 !important; 58 | background: #7e7; 59 | } 60 | .cm-fat-cursor div.CodeMirror-cursors { 61 | z-index: 1; 62 | } 63 | .cm-fat-cursor .CodeMirror-line::selection, 64 | .cm-fat-cursor .CodeMirror-line > span::selection, 65 | .cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } 66 | .cm-fat-cursor .CodeMirror-line::-moz-selection, 67 | .cm-fat-cursor .CodeMirror-line > span::-moz-selection, 68 | .cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } 69 | .cm-fat-cursor { caret-color: transparent; } 70 | @-moz-keyframes blink { 71 | 0% {} 72 | 50% { background-color: transparent; } 73 | 100% {} 74 | } 75 | @-webkit-keyframes blink { 76 | 0% {} 77 | 50% { background-color: transparent; } 78 | 100% {} 79 | } 80 | @keyframes blink { 81 | 0% {} 82 | 50% { background-color: transparent; } 83 | 100% {} 84 | } 85 | 86 | /* Can style cursor different in overwrite (non-insert) mode */ 87 | .CodeMirror-overwrite .CodeMirror-cursor {} 88 | 89 | .cm-tab { display: inline-block; text-decoration: inherit; } 90 | 91 | .CodeMirror-rulers { 92 | position: absolute; 93 | left: 0; right: 0; top: -50px; bottom: 0; 94 | overflow: hidden; 95 | } 96 | .CodeMirror-ruler { 97 | border-left: 1px solid #ccc; 98 | top: 0; bottom: 0; 99 | position: absolute; 100 | } 101 | 102 | /* DEFAULT THEME */ 103 | 104 | .cm-s-default .cm-header {color: blue;} 105 | .cm-s-default .cm-quote {color: #090;} 106 | .cm-negative {color: #d44;} 107 | .cm-positive {color: #292;} 108 | .cm-header, .cm-strong {font-weight: bold;} 109 | .cm-em {font-style: italic;} 110 | .cm-link {text-decoration: underline;} 111 | .cm-strikethrough {text-decoration: line-through;} 112 | 113 | .cm-s-default .cm-keyword {color: #708;} 114 | .cm-s-default .cm-atom {color: #219;} 115 | .cm-s-default .cm-number {color: #164;} 116 | .cm-s-default .cm-def {color: #00f;} 117 | .cm-s-default .cm-variable, 118 | .cm-s-default .cm-punctuation, 119 | .cm-s-default .cm-property, 120 | .cm-s-default .cm-operator {} 121 | .cm-s-default .cm-variable-2 {color: #05a;} 122 | .cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} 123 | .cm-s-default .cm-comment {color: #a50;} 124 | .cm-s-default .cm-string {color: #a11;} 125 | .cm-s-default .cm-string-2 {color: #f50;} 126 | .cm-s-default .cm-meta {color: #555;} 127 | .cm-s-default .cm-qualifier {color: #555;} 128 | .cm-s-default .cm-builtin {color: #30a;} 129 | .cm-s-default .cm-bracket {color: #997;} 130 | .cm-s-default .cm-tag {color: #170;} 131 | .cm-s-default .cm-attribute {color: #00c;} 132 | .cm-s-default .cm-hr {color: #999;} 133 | .cm-s-default .cm-link {color: #00c;} 134 | 135 | .cm-s-default .cm-error {color: #f00;} 136 | .cm-invalidchar {color: #f00;} 137 | 138 | .CodeMirror-composing { border-bottom: 2px solid; } 139 | 140 | /* Default styles for common addons */ 141 | 142 | div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} 143 | div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} 144 | .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } 145 | .CodeMirror-activeline-background {background: #e8f2ff;} 146 | 147 | /* STOP */ 148 | 149 | /* The rest of this file contains styles related to the mechanics of 150 | the editor. You probably shouldn't touch them. */ 151 | 152 | .CodeMirror { 153 | position: relative; 154 | overflow: hidden; 155 | background: white; 156 | } 157 | 158 | .CodeMirror-scroll { 159 | overflow: scroll !important; /* Things will break if this is overridden */ 160 | /* 50px is the magic margin used to hide the element's real scrollbars */ 161 | /* See overflow: hidden in .CodeMirror */ 162 | margin-bottom: -50px; margin-right: -50px; 163 | padding-bottom: 50px; 164 | height: 100%; 165 | outline: none; /* Prevent dragging from highlighting the element */ 166 | position: relative; 167 | z-index: 0; 168 | } 169 | .CodeMirror-sizer { 170 | position: relative; 171 | border-right: 50px solid transparent; 172 | } 173 | 174 | /* The fake, visible scrollbars. Used to force redraw during scrolling 175 | before actual scrolling happens, thus preventing shaking and 176 | flickering artifacts. */ 177 | .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { 178 | position: absolute; 179 | z-index: 6; 180 | display: none; 181 | outline: none; 182 | } 183 | .CodeMirror-vscrollbar { 184 | right: 0; top: 0; 185 | overflow-x: hidden; 186 | overflow-y: scroll; 187 | } 188 | .CodeMirror-hscrollbar { 189 | bottom: 0; left: 0; 190 | overflow-y: hidden; 191 | overflow-x: scroll; 192 | } 193 | .CodeMirror-scrollbar-filler { 194 | right: 0; bottom: 0; 195 | } 196 | .CodeMirror-gutter-filler { 197 | left: 0; bottom: 0; 198 | } 199 | 200 | .CodeMirror-gutters { 201 | position: absolute; left: 0; top: 0; 202 | min-height: 100%; 203 | z-index: 3; 204 | } 205 | .CodeMirror-gutter { 206 | white-space: normal; 207 | height: 100%; 208 | display: inline-block; 209 | vertical-align: top; 210 | margin-bottom: -50px; 211 | } 212 | .CodeMirror-gutter-wrapper { 213 | position: absolute; 214 | z-index: 4; 215 | background: none !important; 216 | border: none !important; 217 | } 218 | .CodeMirror-gutter-background { 219 | position: absolute; 220 | top: 0; bottom: 0; 221 | z-index: 4; 222 | } 223 | .CodeMirror-gutter-elt { 224 | position: absolute; 225 | cursor: default; 226 | z-index: 4; 227 | } 228 | .CodeMirror-gutter-wrapper ::selection { background-color: transparent } 229 | .CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } 230 | 231 | .CodeMirror-lines { 232 | cursor: text; 233 | min-height: 1px; /* prevents collapsing before first draw */ 234 | } 235 | .CodeMirror pre.CodeMirror-line, 236 | .CodeMirror pre.CodeMirror-line-like { 237 | /* Reset some styles that the rest of the page might have set */ 238 | -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; 239 | border-width: 0; 240 | background: transparent; 241 | font-family: inherit; 242 | font-size: inherit; 243 | margin: 0; 244 | white-space: pre; 245 | word-wrap: normal; 246 | line-height: inherit; 247 | color: inherit; 248 | z-index: 2; 249 | position: relative; 250 | overflow: visible; 251 | -webkit-tap-highlight-color: transparent; 252 | -webkit-font-variant-ligatures: contextual; 253 | font-variant-ligatures: contextual; 254 | } 255 | .CodeMirror-wrap pre.CodeMirror-line, 256 | .CodeMirror-wrap pre.CodeMirror-line-like { 257 | word-wrap: break-word; 258 | white-space: pre-wrap; 259 | word-break: normal; 260 | } 261 | 262 | .CodeMirror-linebackground { 263 | position: absolute; 264 | left: 0; right: 0; top: 0; bottom: 0; 265 | z-index: 0; 266 | } 267 | 268 | .CodeMirror-linewidget { 269 | position: relative; 270 | z-index: 2; 271 | padding: 0.1px; /* Force widget margins to stay inside of the container */ 272 | } 273 | 274 | .CodeMirror-widget {} 275 | 276 | .CodeMirror-rtl pre { direction: rtl; } 277 | 278 | .CodeMirror-code { 279 | outline: none; 280 | } 281 | 282 | /* Force content-box sizing for the elements where we expect it */ 283 | .CodeMirror-scroll, 284 | .CodeMirror-sizer, 285 | .CodeMirror-gutter, 286 | .CodeMirror-gutters, 287 | .CodeMirror-linenumber { 288 | -moz-box-sizing: content-box; 289 | box-sizing: content-box; 290 | } 291 | 292 | .CodeMirror-measure { 293 | position: absolute; 294 | width: 100%; 295 | height: 0; 296 | overflow: hidden; 297 | visibility: hidden; 298 | } 299 | 300 | .CodeMirror-cursor { 301 | position: absolute; 302 | pointer-events: none; 303 | } 304 | .CodeMirror-measure pre { position: static; } 305 | 306 | div.CodeMirror-cursors { 307 | visibility: hidden; 308 | position: relative; 309 | z-index: 3; 310 | } 311 | div.CodeMirror-dragcursors { 312 | visibility: visible; 313 | } 314 | 315 | .CodeMirror-focused div.CodeMirror-cursors { 316 | visibility: visible; 317 | } 318 | 319 | .CodeMirror-selected { background: #d9d9d9; } 320 | .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } 321 | .CodeMirror-crosshair { cursor: crosshair; } 322 | .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } 323 | .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } 324 | 325 | .cm-searching { 326 | background-color: #ffa; 327 | background-color: rgba(255, 255, 0, .4); 328 | } 329 | 330 | /* Used to force a border model for a node */ 331 | .cm-force-border { padding-right: .1px; } 332 | 333 | @media print { 334 | /* Hide the cursor when printing */ 335 | .CodeMirror div.CodeMirror-cursors { 336 | visibility: hidden; 337 | } 338 | } 339 | 340 | /* See issue #2901 */ 341 | .cm-tab-wrap-hack:after { content: ''; } 342 | 343 | /* Help users use markselection to safely style text background */ 344 | span.CodeMirror-selectedtext { background: none; } 345 | -------------------------------------------------------------------------------- /autotest/static/css/dt.css: -------------------------------------------------------------------------------- 1 | table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:2em;color:black;}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▴"}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▾"}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody table.dataTable thead>tr>th:before,div.dataTables_scrollBody table.dataTable thead>tr>th:after,div.dataTables_scrollBody table.dataTable thead>tr>td:before,div.dataTables_scrollBody table.dataTable thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgba(2, 117, 216, 0.9);animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.9);color:white}table.dataTable.table-striped>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.05)}table.dataTable.table-striped>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.95)}table.dataTable.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.075)}table.dataTable.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.975)}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:before,div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody tr:first-child th,div.dataTables_scrollBody>table>tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} -------------------------------------------------------------------------------- /autotest/static/css/fileinput.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * @copyright Copyright © Kartik Visweswaran, Krajee.com, 2014 - 2015 3 | * @package bootstrap-fileinput 4 | * @version 4.1.8 5 | * 6 | * File input styling for Bootstrap 3.0 7 | * Built for Yii Framework 2.0 8 | * Author: Kartik Visweswaran 9 | * Year: 2015 10 | * For more Yii related demos visit http://demos.krajee.com 11 | */.file-input{overflow-x:auto}.file-loading{top:0;right:0;width:25px;height:25px;font-size:999px;text-align:right;color:#fff;background:transparent url(../img/loading.gif) top left no-repeat;border:none}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;text-align:right;filter:alpha(opacity=0);opacity:0;background:none repeat scroll 0 0 transparent;cursor:inherit;display:block}.file-caption .glyphicon{display:inline-block;min-width:18px;float:left;margin-top:2px}.file-caption-name{display:inline-block;overflow:hidden;max-height:20px;padding-right:10px;word-break:break-all}.file-caption-ellipsis{position:absolute;right:10px;margin-top:-6px;font-size:1.2em;display:none;font-weight:700;cursor:default}.kv-has-ellipsis .file-caption-ellipsis{display:inline}.kv-has-ellipsis{padding-right:17px}.kv-search-container .kv-search-clear{position:absolute;padding:10px;right:0}.file-error-message{background-color:#f2dede;color:#a94442;text-align:center;border-radius:5px;padding:5px}.file-error-message pre,.file-error-message ul{text-align:left;margin:5px 0}.file-caption-disabled{background-color:#EEE;cursor:not-allowed;opacity:1}.file-input .btn .disabled,.file-input .btn[disabled]{cursor:not-allowed}.file-preview{border-radius:5px;border:1px solid #ddd;padding:5px;width:100%;margin-bottom:5px}.file-preview-frame{display:table;margin:8px;height:160px;border:1px solid #ddd;box-shadow:1px 1px 5px 0 #a2958a;padding:6px;float:left;text-align:center;vertical-align:middle}.file-preview-frame:hover{box-shadow:3px 3px 5px 0 #333}.file-preview-image{height:160px;vertical-align:text-center}.file-preview-text{width:160px;color:#428bca;font-size:11px;text-align:center}.file-preview-other{padding-top:48px;text-align:center}.file-preview-other i{font-size:2.4em}.file-other-error{width:100%;padding-top:30px;text-align:right}.file-input-ajax-new .fileinput-remove-button,.file-input-ajax-new .fileinput-upload-button,.file-input-new .close,.file-input-new .file-preview,.file-input-new .fileinput-remove-button,.file-input-new .fileinput-upload-button,.file-input-new .glyphicon-file{display:none}.loading{background:transparent url(../img/loading.gif) no-repeat scroll center center content-box!important}.wrap-indicator{font-weight:700;color:#245269;cursor:pointer}.file-actions{text-align:left}.file-footer-buttons{float:right}.file-thumbnail-footer .file-caption-name{padding-top:4px;font-size:11px;color:#777}.file-upload-indicator{padding-top:2px;cursor:default}.file-upload-indicator:hover{font-size:1.2em;font-weight:700;padding-top:0}.file-drop-zone{border:1px dashed #aaa;border-radius:4px;height:100%;text-align:center;vertical-align:middle;margin:12px 15px 12px 12px;padding:5px}.file-drop-zone-title{color:#aaa;font-size:40px;padding:85px 10px}.highlighted{border:2px dashed #999!important;background-color:#f0f0f0}.file-uploading{background-image:url(../img/loading-sm.gif);background-position:center bottom 10px;background-repeat:no-repeat;opacity:.6}.file-icon-large{font-size:1.2em} -------------------------------------------------------------------------------- /autotest/static/css/navbar.css: -------------------------------------------------------------------------------- 1 | 2 | .textarea { 3 | width: 100%; 4 | box-sizing: border-box; 5 | border: 0; 6 | height: 600px; 7 | } 8 | .textarea1 { 9 | width: 100%; 10 | box-sizing: border-box; 11 | border: 0; 12 | height: 350px; 13 | } 14 | .headline > li { 15 | font-weight: bold; 16 | list-style: none; 17 | float: left; 18 | margin-left: 20px; 19 | } 20 | .btn.staticB { 21 | color: #324148; 22 | background-color: #eaecec; 23 | border-color: #eaecec; 24 | } 25 | .btn.staticB.activeB{ 26 | color: #fff; 27 | background-color: #00acf0; 28 | border-color: #00acf0; 29 | } 30 | .tooltipm { 31 | position: relative; 32 | display: inline-block; 33 | } 34 | .tooltipm .tooltiptextm { 35 | visibility: hidden; 36 | width: 380px; 37 | background-color: #d6d9daee; 38 | color: #000; 39 | text-align: center; 40 | border-radius: 6px; 41 | padding: 5px 0; 42 | position: absolute; 43 | z-index: 1; 44 | top: 150%; 45 | left: 50%; 46 | margin-left: -190px; 47 | } 48 | .tooltipm .tooltiptextm::after { 49 | content: ""; 50 | position: absolute; 51 | bottom: 100%; 52 | left: 50%; 53 | margin-left: -5px; 54 | border-width: 5px; 55 | border-style: solid; 56 | border-color: transparent transparent #d6d9dadd transparent; 57 | } 58 | .tooltipm:hover .tooltiptextm { 59 | visibility: visible; 60 | z-index: 2; 61 | } 62 | #help 63 | { 64 | position: absolute; 65 | right: 160px; 66 | } 67 | #logout 68 | { 69 | position: absolute; 70 | right: 50px; 71 | } 72 | #navUser 73 | { 74 | position: absolute; 75 | right: 70px; 76 | display: flex; 77 | } 78 | #userName img { 79 | margin-right: 2px; 80 | margin-bottom: -3px; 81 | } 82 | a { 83 | cursor:pointer; 84 | text-decoration:none 85 | } 86 | td { 87 | font-size: 14px; 88 | } 89 | .screenHeight{ 90 | min-height: calc(100vh); 91 | } 92 | 93 | #select-option { 94 | height: 40px; 95 | font-size: 14px; 96 | border: none; 97 | color: inherit; 98 | text-align: left; 99 | width: 100%; 100 | } 101 | 102 | #select-option option { 103 | font-size: 14px; 104 | } 105 | 106 | #select-option option:hover { 107 | background-color: #f5f5f5; 108 | } 109 | 110 | #select-option option:checked { 111 | text-align: right; 112 | } 113 | 114 | .tree ul { 115 | position: relative; 116 | padding-left: 1em; 117 | } 118 | 119 | .node-hovered { 120 | background-color: #f0f0f0; 121 | cursor: pointer; 122 | } 123 | 124 | .node-hovered > ul, .node-hovered > li { 125 | background-color: white; 126 | } 127 | 128 | .small-border { 129 | border: 1px solid #000; 130 | } 131 | 132 | .small-border-table { 133 | border: 1px solid #0003; 134 | } 135 | 136 | -------------------------------------------------------------------------------- /autotest/static/css/select2.min.css: -------------------------------------------------------------------------------- 1 | .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} 2 | -------------------------------------------------------------------------------- /autotest/static/dist/css/dripicons.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | @font-face { 4 | font-family: "dripicons-v2"; 5 | src:url("../fonts/dripicons/dripicons-v2.eot"); 6 | src:url("../fonts/dripicons/dripicons-v2.eot?#iefix") format("embedded-opentype"), 7 | url("../fonts/dripicons/dripicons-v2.woff") format("woff"), 8 | url("../fonts/dripicons/dripicons-v2.ttf") format("truetype"), 9 | url("../fonts/dripicons/dripicons-v2.svg#dripicons-v2") format("svg"); 10 | font-weight: normal; 11 | font-style: normal; 12 | 13 | } 14 | 15 | [data-icon]:before { 16 | font-family: "dripicons-v2" !important; 17 | content: attr(data-icon); 18 | font-style: normal !important; 19 | font-weight: normal !important; 20 | font-variant: normal !important; 21 | text-transform: none !important; 22 | speak: none; 23 | line-height: 1; 24 | -webkit-font-smoothing: antialiased; 25 | -moz-osx-font-smoothing: grayscale; 26 | } 27 | 28 | [class^="dripicons-"]:before, 29 | [class*=" dripicons-"]:before { 30 | font-family: "dripicons-v2" !important; 31 | font-style: normal !important; 32 | font-weight: normal !important; 33 | font-variant: normal !important; 34 | text-transform: none !important; 35 | speak: none; 36 | line-height: 1; 37 | -webkit-font-smoothing: antialiased; 38 | -moz-osx-font-smoothing: grayscale; 39 | } 40 | 41 | .dripicons-alarm:before { 42 | content: "\61"; 43 | } 44 | .dripicons-align-center:before { 45 | content: "\62"; 46 | } 47 | .dripicons-align-justify:before { 48 | content: "\63"; 49 | } 50 | .dripicons-align-left:before { 51 | content: "\64"; 52 | } 53 | .dripicons-align-right:before { 54 | content: "\65"; 55 | } 56 | .dripicons-anchor:before { 57 | content: "\66"; 58 | } 59 | .dripicons-archive:before { 60 | content: "\67"; 61 | } 62 | .dripicons-arrow-down:before { 63 | content: "\68"; 64 | } 65 | .dripicons-arrow-left:before { 66 | content: "\69"; 67 | } 68 | .dripicons-arrow-right:before { 69 | content: "\6a"; 70 | } 71 | .dripicons-arrow-thin-down:before { 72 | content: "\6b"; 73 | } 74 | .dripicons-arrow-thin-left:before { 75 | content: "\6c"; 76 | } 77 | .dripicons-arrow-thin-right:before { 78 | content: "\6d"; 79 | } 80 | .dripicons-arrow-thin-up:before { 81 | content: "\6e"; 82 | } 83 | .dripicons-arrow-up:before { 84 | content: "\6f"; 85 | } 86 | .dripicons-article:before { 87 | content: "\70"; 88 | } 89 | .dripicons-backspace:before { 90 | content: "\71"; 91 | } 92 | .dripicons-basket:before { 93 | content: "\72"; 94 | } 95 | .dripicons-basketball:before { 96 | content: "\73"; 97 | } 98 | .dripicons-battery-empty:before { 99 | content: "\74"; 100 | } 101 | .dripicons-battery-full:before { 102 | content: "\75"; 103 | } 104 | .dripicons-battery-low:before { 105 | content: "\76"; 106 | } 107 | .dripicons-battery-medium:before { 108 | content: "\77"; 109 | } 110 | .dripicons-bell:before { 111 | content: "\78"; 112 | } 113 | .dripicons-blog:before { 114 | content: "\79"; 115 | } 116 | .dripicons-bluetooth:before { 117 | content: "\7a"; 118 | } 119 | .dripicons-bold:before { 120 | content: "\41"; 121 | } 122 | .dripicons-bookmark:before { 123 | content: "\42"; 124 | } 125 | .dripicons-bookmarks:before { 126 | content: "\43"; 127 | } 128 | .dripicons-box:before { 129 | content: "\44"; 130 | } 131 | .dripicons-briefcase:before { 132 | content: "\45"; 133 | } 134 | .dripicons-brightness-low:before { 135 | content: "\46"; 136 | } 137 | .dripicons-brightness-max:before { 138 | content: "\47"; 139 | } 140 | .dripicons-brightness-medium:before { 141 | content: "\48"; 142 | } 143 | .dripicons-broadcast:before { 144 | content: "\49"; 145 | } 146 | .dripicons-browser:before { 147 | content: "\4a"; 148 | } 149 | .dripicons-browser-upload:before { 150 | content: "\4b"; 151 | } 152 | .dripicons-brush:before { 153 | content: "\4c"; 154 | } 155 | .dripicons-calendar:before { 156 | content: "\4d"; 157 | } 158 | .dripicons-camcorder:before { 159 | content: "\4e"; 160 | } 161 | .dripicons-camera:before { 162 | content: "\4f"; 163 | } 164 | .dripicons-card:before { 165 | content: "\50"; 166 | } 167 | .dripicons-cart:before { 168 | content: "\51"; 169 | } 170 | .dripicons-checklist:before { 171 | content: "\52"; 172 | } 173 | .dripicons-checkmark:before { 174 | content: "\53"; 175 | } 176 | .dripicons-chevron-down:before { 177 | content: "\54"; 178 | } 179 | .dripicons-chevron-left:before { 180 | content: "\55"; 181 | } 182 | .dripicons-chevron-right:before { 183 | content: "\56"; 184 | } 185 | .dripicons-chevron-up:before { 186 | content: "\57"; 187 | } 188 | .dripicons-clipboard:before { 189 | content: "\58"; 190 | } 191 | .dripicons-clock:before { 192 | content: "\59"; 193 | } 194 | .dripicons-clockwise:before { 195 | content: "\5a"; 196 | } 197 | .dripicons-cloud:before { 198 | content: "\30"; 199 | } 200 | .dripicons-cloud-download:before { 201 | content: "\31"; 202 | } 203 | .dripicons-cloud-upload:before { 204 | content: "\32"; 205 | } 206 | .dripicons-code:before { 207 | content: "\33"; 208 | } 209 | .dripicons-contract:before { 210 | content: "\34"; 211 | } 212 | .dripicons-contract-2:before { 213 | content: "\35"; 214 | } 215 | .dripicons-conversation:before { 216 | content: "\36"; 217 | } 218 | .dripicons-copy:before { 219 | content: "\37"; 220 | } 221 | .dripicons-crop:before { 222 | content: "\38"; 223 | } 224 | .dripicons-cross:before { 225 | content: "\39"; 226 | } 227 | .dripicons-crosshair:before { 228 | content: "\21"; 229 | } 230 | .dripicons-cutlery:before { 231 | content: "\22"; 232 | } 233 | .dripicons-device-desktop:before { 234 | content: "\23"; 235 | } 236 | .dripicons-device-mobile:before { 237 | content: "\24"; 238 | } 239 | .dripicons-device-tablet:before { 240 | content: "\25"; 241 | } 242 | .dripicons-direction:before { 243 | content: "\26"; 244 | } 245 | .dripicons-disc:before { 246 | content: "\27"; 247 | } 248 | .dripicons-document:before { 249 | content: "\28"; 250 | } 251 | .dripicons-document-delete:before { 252 | content: "\29"; 253 | } 254 | .dripicons-document-edit:before { 255 | content: "\2a"; 256 | } 257 | .dripicons-document-new:before { 258 | content: "\2b"; 259 | } 260 | .dripicons-document-remove:before { 261 | content: "\2c"; 262 | } 263 | .dripicons-dot:before { 264 | content: "\2d"; 265 | } 266 | .dripicons-dots-2:before { 267 | content: "\2e"; 268 | } 269 | .dripicons-dots-3:before { 270 | content: "\2f"; 271 | } 272 | .dripicons-download:before { 273 | content: "\3a"; 274 | } 275 | .dripicons-duplicate:before { 276 | content: "\3b"; 277 | } 278 | .dripicons-enter:before { 279 | content: "\3c"; 280 | } 281 | .dripicons-exit:before { 282 | content: "\3d"; 283 | } 284 | .dripicons-expand:before { 285 | content: "\3e"; 286 | } 287 | .dripicons-expand-2:before { 288 | content: "\3f"; 289 | } 290 | .dripicons-experiment:before { 291 | content: "\40"; 292 | } 293 | .dripicons-export:before { 294 | content: "\5b"; 295 | } 296 | .dripicons-feed:before { 297 | content: "\5d"; 298 | } 299 | .dripicons-flag:before { 300 | content: "\5e"; 301 | } 302 | .dripicons-flashlight:before { 303 | content: "\5f"; 304 | } 305 | .dripicons-folder:before { 306 | content: "\60"; 307 | } 308 | .dripicons-folder-open:before { 309 | content: "\7b"; 310 | } 311 | .dripicons-forward:before { 312 | content: "\7c"; 313 | } 314 | .dripicons-gaming:before { 315 | content: "\7d"; 316 | } 317 | .dripicons-gear:before { 318 | content: "\7e"; 319 | } 320 | .dripicons-graduation:before { 321 | content: "\5c"; 322 | } 323 | .dripicons-graph-bar:before { 324 | content: "\e000"; 325 | } 326 | .dripicons-graph-line:before { 327 | content: "\e001"; 328 | } 329 | .dripicons-graph-pie:before { 330 | content: "\e002"; 331 | } 332 | .dripicons-headset:before { 333 | content: "\e003"; 334 | } 335 | .dripicons-heart:before { 336 | content: "\e004"; 337 | } 338 | .dripicons-help:before { 339 | content: "\e005"; 340 | } 341 | .dripicons-home:before { 342 | content: "\e006"; 343 | } 344 | .dripicons-hourglass:before { 345 | content: "\e007"; 346 | } 347 | .dripicons-inbox:before { 348 | content: "\e008"; 349 | } 350 | .dripicons-information:before { 351 | content: "\e009"; 352 | } 353 | .dripicons-italic:before { 354 | content: "\e00a"; 355 | } 356 | .dripicons-jewel:before { 357 | content: "\e00b"; 358 | } 359 | .dripicons-lifting:before { 360 | content: "\e00c"; 361 | } 362 | .dripicons-lightbulb:before { 363 | content: "\e00d"; 364 | } 365 | .dripicons-link:before { 366 | content: "\e00e"; 367 | } 368 | .dripicons-link-broken:before { 369 | content: "\e00f"; 370 | } 371 | .dripicons-list:before { 372 | content: "\e010"; 373 | } 374 | .dripicons-loading:before { 375 | content: "\e011"; 376 | } 377 | .dripicons-location:before { 378 | content: "\e012"; 379 | } 380 | .dripicons-lock:before { 381 | content: "\e013"; 382 | } 383 | .dripicons-lock-open:before { 384 | content: "\e014"; 385 | } 386 | .dripicons-mail:before { 387 | content: "\e015"; 388 | } 389 | .dripicons-map:before { 390 | content: "\e016"; 391 | } 392 | .dripicons-media-loop:before { 393 | content: "\e017"; 394 | } 395 | .dripicons-media-next:before { 396 | content: "\e018"; 397 | } 398 | .dripicons-media-pause:before { 399 | content: "\e019"; 400 | } 401 | .dripicons-media-play:before { 402 | content: "\e01a"; 403 | } 404 | .dripicons-media-previous:before { 405 | content: "\e01b"; 406 | } 407 | .dripicons-media-record:before { 408 | content: "\e01c"; 409 | } 410 | .dripicons-media-shuffle:before { 411 | content: "\e01d"; 412 | } 413 | .dripicons-media-stop:before { 414 | content: "\e01e"; 415 | } 416 | .dripicons-medical:before { 417 | content: "\e01f"; 418 | } 419 | .dripicons-menu:before { 420 | content: "\e020"; 421 | } 422 | .dripicons-message:before { 423 | content: "\e021"; 424 | } 425 | .dripicons-meter:before { 426 | content: "\e022"; 427 | } 428 | .dripicons-microphone:before { 429 | content: "\e023"; 430 | } 431 | .dripicons-minus:before { 432 | content: "\e024"; 433 | } 434 | .dripicons-monitor:before { 435 | content: "\e025"; 436 | } 437 | .dripicons-move:before { 438 | content: "\e026"; 439 | } 440 | .dripicons-music:before { 441 | content: "\e027"; 442 | } 443 | .dripicons-network-1:before { 444 | content: "\e028"; 445 | } 446 | .dripicons-network-2:before { 447 | content: "\e029"; 448 | } 449 | .dripicons-network-3:before { 450 | content: "\e02a"; 451 | } 452 | .dripicons-network-4:before { 453 | content: "\e02b"; 454 | } 455 | .dripicons-network-5:before { 456 | content: "\e02c"; 457 | } 458 | .dripicons-pamphlet:before { 459 | content: "\e02d"; 460 | } 461 | .dripicons-paperclip:before { 462 | content: "\e02e"; 463 | } 464 | .dripicons-pencil:before { 465 | content: "\e02f"; 466 | } 467 | .dripicons-phone:before { 468 | content: "\e030"; 469 | } 470 | .dripicons-photo:before { 471 | content: "\e031"; 472 | } 473 | .dripicons-photo-group:before { 474 | content: "\e032"; 475 | } 476 | .dripicons-pill:before { 477 | content: "\e033"; 478 | } 479 | .dripicons-pin:before { 480 | content: "\e034"; 481 | } 482 | .dripicons-plus:before { 483 | content: "\e035"; 484 | } 485 | .dripicons-power:before { 486 | content: "\e036"; 487 | } 488 | .dripicons-preview:before { 489 | content: "\e037"; 490 | } 491 | .dripicons-print:before { 492 | content: "\e038"; 493 | } 494 | .dripicons-pulse:before { 495 | content: "\e039"; 496 | } 497 | .dripicons-question:before { 498 | content: "\e03a"; 499 | } 500 | .dripicons-reply:before { 501 | content: "\e03b"; 502 | } 503 | .dripicons-reply-all:before { 504 | content: "\e03c"; 505 | } 506 | .dripicons-return:before { 507 | content: "\e03d"; 508 | } 509 | .dripicons-retweet:before { 510 | content: "\e03e"; 511 | } 512 | .dripicons-rocket:before { 513 | content: "\e03f"; 514 | } 515 | .dripicons-scale:before { 516 | content: "\e040"; 517 | } 518 | .dripicons-search:before { 519 | content: "\e041"; 520 | } 521 | .dripicons-shopping-bag:before { 522 | content: "\e042"; 523 | } 524 | .dripicons-skip:before { 525 | content: "\e043"; 526 | } 527 | .dripicons-stack:before { 528 | content: "\e044"; 529 | } 530 | .dripicons-star:before { 531 | content: "\e045"; 532 | } 533 | .dripicons-stopwatch:before { 534 | content: "\e046"; 535 | } 536 | .dripicons-store:before { 537 | content: "\e047"; 538 | } 539 | .dripicons-suitcase:before { 540 | content: "\e048"; 541 | } 542 | .dripicons-swap:before { 543 | content: "\e049"; 544 | } 545 | .dripicons-tag:before { 546 | content: "\e04a"; 547 | } 548 | .dripicons-tag-delete:before { 549 | content: "\e04b"; 550 | } 551 | .dripicons-tags:before { 552 | content: "\e04c"; 553 | } 554 | .dripicons-thumbs-down:before { 555 | content: "\e04d"; 556 | } 557 | .dripicons-thumbs-up:before { 558 | content: "\e04e"; 559 | } 560 | .dripicons-ticket:before { 561 | content: "\e04f"; 562 | } 563 | .dripicons-time-reverse:before { 564 | content: "\e050"; 565 | } 566 | .dripicons-to-do:before { 567 | content: "\e051"; 568 | } 569 | .dripicons-toggles:before { 570 | content: "\e052"; 571 | } 572 | .dripicons-trash:before { 573 | content: "\e053"; 574 | } 575 | .dripicons-trophy:before { 576 | content: "\e054"; 577 | } 578 | .dripicons-upload:before { 579 | content: "\e055"; 580 | } 581 | .dripicons-user:before { 582 | content: "\e056"; 583 | } 584 | .dripicons-user-group:before { 585 | content: "\e057"; 586 | } 587 | .dripicons-user-id:before { 588 | content: "\e058"; 589 | } 590 | .dripicons-vibrate:before { 591 | content: "\e059"; 592 | } 593 | .dripicons-view-apps:before { 594 | content: "\e05a"; 595 | } 596 | .dripicons-view-list:before { 597 | content: "\e05b"; 598 | } 599 | .dripicons-view-list-large:before { 600 | content: "\e05c"; 601 | } 602 | .dripicons-view-thumb:before { 603 | content: "\e05d"; 604 | } 605 | .dripicons-volume-full:before { 606 | content: "\e05e"; 607 | } 608 | .dripicons-volume-low:before { 609 | content: "\e05f"; 610 | } 611 | .dripicons-volume-medium:before { 612 | content: "\e060"; 613 | } 614 | .dripicons-volume-off:before { 615 | content: "\e061"; 616 | } 617 | .dripicons-wallet:before { 618 | content: "\e062"; 619 | } 620 | .dripicons-warning:before { 621 | content: "\e063"; 622 | } 623 | .dripicons-web:before { 624 | content: "\e064"; 625 | } 626 | .dripicons-weight:before { 627 | content: "\e065"; 628 | } 629 | .dripicons-wifi:before { 630 | content: "\e066"; 631 | } 632 | .dripicons-wrong:before { 633 | content: "\e067"; 634 | } 635 | .dripicons-zoom-in:before { 636 | content: "\e068"; 637 | } 638 | .dripicons-zoom-out:before { 639 | content: "\e069"; 640 | } 641 | -------------------------------------------------------------------------------- /autotest/static/dist/css/pe-icon-7-stroke.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Pe-icon-7-stroke'; 3 | src:url('../fonts/pe-icon-7/Pe-icon-7-stroke.eot?d7yf1v'); 4 | src:url('../fonts/pe-icon-7/Pe-icon-7-stroke.eot?#iefixd7yf1v') format('embedded-opentype'), 5 | url('../fonts/pe-icon-7/Pe-icon-7-stroke.woff?d7yf1v') format('woff'), 6 | url('../fonts/pe-icon-7/Pe-icon-7-stroke.ttf?d7yf1v') format('truetype'), 7 | url('../fonts/pe-icon-7/Pe-icon-7-stroke.svg?d7yf1v#Pe-icon-7-stroke') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | [class^="pe-7s-"], [class*=" pe-7s-"] { 13 | font-family: 'Pe-icon-7-stroke'; 14 | speak: none; 15 | font-style: normal; 16 | font-weight: normal; 17 | font-variant: normal; 18 | text-transform: none; 19 | line-height: 1; 20 | 21 | /* Better Font Rendering =========== */ 22 | -webkit-font-smoothing: antialiased; 23 | -moz-osx-font-smoothing: grayscale; 24 | } 25 | 26 | .pe-7s-album:before { 27 | content: "\e6aa"; 28 | } 29 | .pe-7s-arc:before { 30 | content: "\e6ab"; 31 | } 32 | .pe-7s-back-2:before { 33 | content: "\e6ac"; 34 | } 35 | .pe-7s-bandaid:before { 36 | content: "\e6ad"; 37 | } 38 | .pe-7s-car:before { 39 | content: "\e6ae"; 40 | } 41 | .pe-7s-diamond:before { 42 | content: "\e6af"; 43 | } 44 | .pe-7s-door-lock:before { 45 | content: "\e6b0"; 46 | } 47 | .pe-7s-eyedropper:before { 48 | content: "\e6b1"; 49 | } 50 | .pe-7s-female:before { 51 | content: "\e6b2"; 52 | } 53 | .pe-7s-gym:before { 54 | content: "\e6b3"; 55 | } 56 | .pe-7s-hammer:before { 57 | content: "\e6b4"; 58 | } 59 | .pe-7s-headphones:before { 60 | content: "\e6b5"; 61 | } 62 | .pe-7s-helm:before { 63 | content: "\e6b6"; 64 | } 65 | .pe-7s-hourglass:before { 66 | content: "\e6b7"; 67 | } 68 | .pe-7s-leaf:before { 69 | content: "\e6b8"; 70 | } 71 | .pe-7s-magic-wand:before { 72 | content: "\e6b9"; 73 | } 74 | .pe-7s-male:before { 75 | content: "\e6ba"; 76 | } 77 | .pe-7s-map-2:before { 78 | content: "\e6bb"; 79 | } 80 | .pe-7s-next-2:before { 81 | content: "\e6bc"; 82 | } 83 | .pe-7s-paint-bucket:before { 84 | content: "\e6bd"; 85 | } 86 | .pe-7s-pendrive:before { 87 | content: "\e6be"; 88 | } 89 | .pe-7s-photo:before { 90 | content: "\e6bf"; 91 | } 92 | .pe-7s-piggy:before { 93 | content: "\e6c0"; 94 | } 95 | .pe-7s-plugin:before { 96 | content: "\e6c1"; 97 | } 98 | .pe-7s-refresh-2:before { 99 | content: "\e6c2"; 100 | } 101 | .pe-7s-rocket:before { 102 | content: "\e6c3"; 103 | } 104 | .pe-7s-settings:before { 105 | content: "\e6c4"; 106 | } 107 | .pe-7s-shield:before { 108 | content: "\e6c5"; 109 | } 110 | .pe-7s-smile:before { 111 | content: "\e6c6"; 112 | } 113 | .pe-7s-usb:before { 114 | content: "\e6c7"; 115 | } 116 | .pe-7s-vector:before { 117 | content: "\e6c8"; 118 | } 119 | .pe-7s-wine:before { 120 | content: "\e6c9"; 121 | } 122 | .pe-7s-cloud-upload:before { 123 | content: "\e68a"; 124 | } 125 | .pe-7s-cash:before { 126 | content: "\e68c"; 127 | } 128 | .pe-7s-close:before { 129 | content: "\e680"; 130 | } 131 | .pe-7s-bluetooth:before { 132 | content: "\e68d"; 133 | } 134 | .pe-7s-cloud-download:before { 135 | content: "\e68b"; 136 | } 137 | .pe-7s-way:before { 138 | content: "\e68e"; 139 | } 140 | .pe-7s-close-circle:before { 141 | content: "\e681"; 142 | } 143 | .pe-7s-id:before { 144 | content: "\e68f"; 145 | } 146 | .pe-7s-angle-up:before { 147 | content: "\e682"; 148 | } 149 | .pe-7s-wristwatch:before { 150 | content: "\e690"; 151 | } 152 | .pe-7s-angle-up-circle:before { 153 | content: "\e683"; 154 | } 155 | .pe-7s-world:before { 156 | content: "\e691"; 157 | } 158 | .pe-7s-angle-right:before { 159 | content: "\e684"; 160 | } 161 | .pe-7s-volume:before { 162 | content: "\e692"; 163 | } 164 | .pe-7s-angle-right-circle:before { 165 | content: "\e685"; 166 | } 167 | .pe-7s-users:before { 168 | content: "\e693"; 169 | } 170 | .pe-7s-angle-left:before { 171 | content: "\e686"; 172 | } 173 | .pe-7s-user-female:before { 174 | content: "\e694"; 175 | } 176 | .pe-7s-angle-left-circle:before { 177 | content: "\e687"; 178 | } 179 | .pe-7s-up-arrow:before { 180 | content: "\e695"; 181 | } 182 | .pe-7s-angle-down:before { 183 | content: "\e688"; 184 | } 185 | .pe-7s-switch:before { 186 | content: "\e696"; 187 | } 188 | .pe-7s-angle-down-circle:before { 189 | content: "\e689"; 190 | } 191 | .pe-7s-scissors:before { 192 | content: "\e697"; 193 | } 194 | .pe-7s-wallet:before { 195 | content: "\e600"; 196 | } 197 | .pe-7s-safe:before { 198 | content: "\e698"; 199 | } 200 | .pe-7s-volume2:before { 201 | content: "\e601"; 202 | } 203 | .pe-7s-volume1:before { 204 | content: "\e602"; 205 | } 206 | .pe-7s-voicemail:before { 207 | content: "\e603"; 208 | } 209 | .pe-7s-video:before { 210 | content: "\e604"; 211 | } 212 | .pe-7s-user:before { 213 | content: "\e605"; 214 | } 215 | .pe-7s-upload:before { 216 | content: "\e606"; 217 | } 218 | .pe-7s-unlock:before { 219 | content: "\e607"; 220 | } 221 | .pe-7s-umbrella:before { 222 | content: "\e608"; 223 | } 224 | .pe-7s-trash:before { 225 | content: "\e609"; 226 | } 227 | .pe-7s-tools:before { 228 | content: "\e60a"; 229 | } 230 | .pe-7s-timer:before { 231 | content: "\e60b"; 232 | } 233 | .pe-7s-ticket:before { 234 | content: "\e60c"; 235 | } 236 | .pe-7s-target:before { 237 | content: "\e60d"; 238 | } 239 | .pe-7s-sun:before { 240 | content: "\e60e"; 241 | } 242 | .pe-7s-study:before { 243 | content: "\e60f"; 244 | } 245 | .pe-7s-stopwatch:before { 246 | content: "\e610"; 247 | } 248 | .pe-7s-star:before { 249 | content: "\e611"; 250 | } 251 | .pe-7s-speaker:before { 252 | content: "\e612"; 253 | } 254 | .pe-7s-signal:before { 255 | content: "\e613"; 256 | } 257 | .pe-7s-shuffle:before { 258 | content: "\e614"; 259 | } 260 | .pe-7s-shopbag:before { 261 | content: "\e615"; 262 | } 263 | .pe-7s-share:before { 264 | content: "\e616"; 265 | } 266 | .pe-7s-server:before { 267 | content: "\e617"; 268 | } 269 | .pe-7s-search:before { 270 | content: "\e618"; 271 | } 272 | .pe-7s-film:before { 273 | content: "\e6a5"; 274 | } 275 | .pe-7s-science:before { 276 | content: "\e619"; 277 | } 278 | .pe-7s-disk:before { 279 | content: "\e6a6"; 280 | } 281 | .pe-7s-ribbon:before { 282 | content: "\e61a"; 283 | } 284 | .pe-7s-repeat:before { 285 | content: "\e61b"; 286 | } 287 | .pe-7s-refresh:before { 288 | content: "\e61c"; 289 | } 290 | .pe-7s-add-user:before { 291 | content: "\e6a9"; 292 | } 293 | .pe-7s-refresh-cloud:before { 294 | content: "\e61d"; 295 | } 296 | .pe-7s-paperclip:before { 297 | content: "\e69c"; 298 | } 299 | .pe-7s-radio:before { 300 | content: "\e61e"; 301 | } 302 | .pe-7s-note2:before { 303 | content: "\e69d"; 304 | } 305 | .pe-7s-print:before { 306 | content: "\e61f"; 307 | } 308 | .pe-7s-network:before { 309 | content: "\e69e"; 310 | } 311 | .pe-7s-prev:before { 312 | content: "\e620"; 313 | } 314 | .pe-7s-mute:before { 315 | content: "\e69f"; 316 | } 317 | .pe-7s-power:before { 318 | content: "\e621"; 319 | } 320 | .pe-7s-medal:before { 321 | content: "\e6a0"; 322 | } 323 | .pe-7s-portfolio:before { 324 | content: "\e622"; 325 | } 326 | .pe-7s-like2:before { 327 | content: "\e6a1"; 328 | } 329 | .pe-7s-plus:before { 330 | content: "\e623"; 331 | } 332 | .pe-7s-left-arrow:before { 333 | content: "\e6a2"; 334 | } 335 | .pe-7s-play:before { 336 | content: "\e624"; 337 | } 338 | .pe-7s-key:before { 339 | content: "\e6a3"; 340 | } 341 | .pe-7s-plane:before { 342 | content: "\e625"; 343 | } 344 | .pe-7s-joy:before { 345 | content: "\e6a4"; 346 | } 347 | .pe-7s-photo-gallery:before { 348 | content: "\e626"; 349 | } 350 | .pe-7s-pin:before { 351 | content: "\e69b"; 352 | } 353 | .pe-7s-phone:before { 354 | content: "\e627"; 355 | } 356 | .pe-7s-plug:before { 357 | content: "\e69a"; 358 | } 359 | .pe-7s-pen:before { 360 | content: "\e628"; 361 | } 362 | .pe-7s-right-arrow:before { 363 | content: "\e699"; 364 | } 365 | .pe-7s-paper-plane:before { 366 | content: "\e629"; 367 | } 368 | .pe-7s-delete-user:before { 369 | content: "\e6a7"; 370 | } 371 | .pe-7s-paint:before { 372 | content: "\e62a"; 373 | } 374 | .pe-7s-bottom-arrow:before { 375 | content: "\e6a8"; 376 | } 377 | .pe-7s-notebook:before { 378 | content: "\e62b"; 379 | } 380 | .pe-7s-note:before { 381 | content: "\e62c"; 382 | } 383 | .pe-7s-next:before { 384 | content: "\e62d"; 385 | } 386 | .pe-7s-news-paper:before { 387 | content: "\e62e"; 388 | } 389 | .pe-7s-musiclist:before { 390 | content: "\e62f"; 391 | } 392 | .pe-7s-music:before { 393 | content: "\e630"; 394 | } 395 | .pe-7s-mouse:before { 396 | content: "\e631"; 397 | } 398 | .pe-7s-more:before { 399 | content: "\e632"; 400 | } 401 | .pe-7s-moon:before { 402 | content: "\e633"; 403 | } 404 | .pe-7s-monitor:before { 405 | content: "\e634"; 406 | } 407 | .pe-7s-micro:before { 408 | content: "\e635"; 409 | } 410 | .pe-7s-menu:before { 411 | content: "\e636"; 412 | } 413 | .pe-7s-map:before { 414 | content: "\e637"; 415 | } 416 | .pe-7s-map-marker:before { 417 | content: "\e638"; 418 | } 419 | .pe-7s-mail:before { 420 | content: "\e639"; 421 | } 422 | .pe-7s-mail-open:before { 423 | content: "\e63a"; 424 | } 425 | .pe-7s-mail-open-file:before { 426 | content: "\e63b"; 427 | } 428 | .pe-7s-magnet:before { 429 | content: "\e63c"; 430 | } 431 | .pe-7s-loop:before { 432 | content: "\e63d"; 433 | } 434 | .pe-7s-look:before { 435 | content: "\e63e"; 436 | } 437 | .pe-7s-lock:before { 438 | content: "\e63f"; 439 | } 440 | .pe-7s-lintern:before { 441 | content: "\e640"; 442 | } 443 | .pe-7s-link:before { 444 | content: "\e641"; 445 | } 446 | .pe-7s-like:before { 447 | content: "\e642"; 448 | } 449 | .pe-7s-light:before { 450 | content: "\e643"; 451 | } 452 | .pe-7s-less:before { 453 | content: "\e644"; 454 | } 455 | .pe-7s-keypad:before { 456 | content: "\e645"; 457 | } 458 | .pe-7s-junk:before { 459 | content: "\e646"; 460 | } 461 | .pe-7s-info:before { 462 | content: "\e647"; 463 | } 464 | .pe-7s-home:before { 465 | content: "\e648"; 466 | } 467 | .pe-7s-help2:before { 468 | content: "\e649"; 469 | } 470 | .pe-7s-help1:before { 471 | content: "\e64a"; 472 | } 473 | .pe-7s-graph3:before { 474 | content: "\e64b"; 475 | } 476 | .pe-7s-graph2:before { 477 | content: "\e64c"; 478 | } 479 | .pe-7s-graph1:before { 480 | content: "\e64d"; 481 | } 482 | .pe-7s-graph:before { 483 | content: "\e64e"; 484 | } 485 | .pe-7s-global:before { 486 | content: "\e64f"; 487 | } 488 | .pe-7s-gleam:before { 489 | content: "\e650"; 490 | } 491 | .pe-7s-glasses:before { 492 | content: "\e651"; 493 | } 494 | .pe-7s-gift:before { 495 | content: "\e652"; 496 | } 497 | .pe-7s-folder:before { 498 | content: "\e653"; 499 | } 500 | .pe-7s-flag:before { 501 | content: "\e654"; 502 | } 503 | .pe-7s-filter:before { 504 | content: "\e655"; 505 | } 506 | .pe-7s-file:before { 507 | content: "\e656"; 508 | } 509 | .pe-7s-expand1:before { 510 | content: "\e657"; 511 | } 512 | .pe-7s-exapnd2:before { 513 | content: "\e658"; 514 | } 515 | .pe-7s-edit:before { 516 | content: "\e659"; 517 | } 518 | .pe-7s-drop:before { 519 | content: "\e65a"; 520 | } 521 | .pe-7s-drawer:before { 522 | content: "\e65b"; 523 | } 524 | .pe-7s-download:before { 525 | content: "\e65c"; 526 | } 527 | .pe-7s-display2:before { 528 | content: "\e65d"; 529 | } 530 | .pe-7s-display1:before { 531 | content: "\e65e"; 532 | } 533 | .pe-7s-diskette:before { 534 | content: "\e65f"; 535 | } 536 | .pe-7s-date:before { 537 | content: "\e660"; 538 | } 539 | .pe-7s-cup:before { 540 | content: "\e661"; 541 | } 542 | .pe-7s-culture:before { 543 | content: "\e662"; 544 | } 545 | .pe-7s-crop:before { 546 | content: "\e663"; 547 | } 548 | .pe-7s-credit:before { 549 | content: "\e664"; 550 | } 551 | .pe-7s-copy-file:before { 552 | content: "\e665"; 553 | } 554 | .pe-7s-config:before { 555 | content: "\e666"; 556 | } 557 | .pe-7s-compass:before { 558 | content: "\e667"; 559 | } 560 | .pe-7s-comment:before { 561 | content: "\e668"; 562 | } 563 | .pe-7s-coffee:before { 564 | content: "\e669"; 565 | } 566 | .pe-7s-cloud:before { 567 | content: "\e66a"; 568 | } 569 | .pe-7s-clock:before { 570 | content: "\e66b"; 571 | } 572 | .pe-7s-check:before { 573 | content: "\e66c"; 574 | } 575 | .pe-7s-chat:before { 576 | content: "\e66d"; 577 | } 578 | .pe-7s-cart:before { 579 | content: "\e66e"; 580 | } 581 | .pe-7s-camera:before { 582 | content: "\e66f"; 583 | } 584 | .pe-7s-call:before { 585 | content: "\e670"; 586 | } 587 | .pe-7s-calculator:before { 588 | content: "\e671"; 589 | } 590 | .pe-7s-browser:before { 591 | content: "\e672"; 592 | } 593 | .pe-7s-box2:before { 594 | content: "\e673"; 595 | } 596 | .pe-7s-box1:before { 597 | content: "\e674"; 598 | } 599 | .pe-7s-bookmarks:before { 600 | content: "\e675"; 601 | } 602 | .pe-7s-bicycle:before { 603 | content: "\e676"; 604 | } 605 | .pe-7s-bell:before { 606 | content: "\e677"; 607 | } 608 | .pe-7s-battery:before { 609 | content: "\e678"; 610 | } 611 | .pe-7s-ball:before { 612 | content: "\e679"; 613 | } 614 | .pe-7s-back:before { 615 | content: "\e67a"; 616 | } 617 | .pe-7s-attention:before { 618 | content: "\e67b"; 619 | } 620 | .pe-7s-anchor:before { 621 | content: "\e67c"; 622 | } 623 | .pe-7s-albums:before { 624 | content: "\e67d"; 625 | } 626 | .pe-7s-alarm:before { 627 | content: "\e67e"; 628 | } 629 | .pe-7s-airplay:before { 630 | content: "\e67f"; 631 | } 632 | -------------------------------------------------------------------------------- /autotest/static/dist/fonts/ionicons/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/dist/fonts/ionicons/ionicons.eot -------------------------------------------------------------------------------- /autotest/static/dist/fonts/ionicons/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/dist/fonts/ionicons/ionicons.ttf -------------------------------------------------------------------------------- /autotest/static/dist/fonts/ionicons/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/dist/fonts/ionicons/ionicons.woff -------------------------------------------------------------------------------- /autotest/static/dist/fonts/ionicons/ionicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/dist/fonts/ionicons/ionicons.woff2 -------------------------------------------------------------------------------- /autotest/static/js/exporting.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v5.0.12 (2017-05-24) 3 | Exporting module 4 | 5 | (c) 2010-2017 Torstein Honsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(k){"object"===typeof module&&module.exports?module.exports=k:k(Highcharts)})(function(k){(function(f){var k=f.defaultOptions,p=f.doc,A=f.Chart,w=f.addEvent,I=f.removeEvent,E=f.fireEvent,t=f.createElement,B=f.discardElement,v=f.css,n=f.merge,C=f.pick,h=f.each,F=f.objectEach,u=f.extend,J=f.isTouchDevice,D=f.win,G=D.navigator.userAgent,K=f.Renderer.prototype.symbols;/Edge\/|Trident\/|MSIE /.test(G);/firefox/i.test(G);u(k.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image", 10 | downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});k.navigation={buttonOptions:{theme:{},symbolSize:14,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,verticalAlign:"top",width:24}};n(!0,k.navigation,{menuStyle:{border:"1px solid #999999",background:"#ffffff",padding:"5px 0"},menuItemStyle:{padding:"0.5em 1em",background:"none",color:"#333333",fontSize:J?"14px":"11px",transition:"background 250ms, color 250ms"},menuItemHoverStyle:{background:"#335cad", 11 | color:"#ffffff"},buttonOptions:{symbolFill:"#666666",symbolStroke:"#666666",symbolStrokeWidth:3,theme:{fill:"#ffffff",stroke:"none",padding:5}}});k.exporting={type:"image/png",url:"https://export.highcharts.com/",printMaxWidth:780,scale:2,buttons:{contextButton:{className:"highcharts-contextbutton",menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}}, 12 | {textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(a,b,e){var c=t("form",n({method:"post",action:a,enctype:"multipart/form-data"},e),{display:"none"},p.body);F(b,function(a,b){t("input",{type:"hidden",name:b,value:a},null,c)});c.submit();B(c)};u(A.prototype,{sanitizeSVG:function(a, 13 | b){if(b&&b.exporting&&b.exporting.allowHTML){var e=a.match(/<\/svg>(.*?$)/);e&&e[1]&&(e='\x3cforeignObject x\x3d"0" y\x3d"0" width\x3d"'+b.chart.width+'" height\x3d"'+b.chart.height+'"\x3e\x3cbody xmlns\x3d"http://www.w3.org/1999/xhtml"\x3e'+e[1]+"\x3c/body\x3e\x3c/foreignObject\x3e",a=a.replace("\x3c/svg\x3e",e+"\x3c/svg\x3e"))}a=a.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\(("|")(\S+)("|")\)/g, 14 | "url($2)").replace(/url\([^#]+#/g,"url(#").replace(/.*?$/,"\x3c/svg\x3e").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1\x3d"rgb($2)" $1-opacity\x3d"$3"').replace(/ /g,"\u00a0").replace(//g,"\u00ad");return a=a.replace(//g,"\x3c$1title\x3e").replace(/height=([^" ]+)/g, 15 | 'height\x3d"$1"').replace(/width=([^" ]+)/g,'width\x3d"$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href\x3d"$1"/\x3e').replace(/ id=([^" >]+)/g,' id\x3d"$1"').replace(/class=([^" >]+)/g,'class\x3d"$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b,e,c,r,m,g=n(this.options,a);p.createElementNS||(p.createElementNS=function(a,b){return p.createElement(b)}); 16 | e=t("div",null,{position:"absolute",top:"-9999em",width:this.chartWidth+"px",height:this.chartHeight+"px"},p.body);c=this.renderTo.style.width;m=this.renderTo.style.height;c=g.exporting.sourceWidth||g.chart.width||/px$/.test(c)&&parseInt(c,10)||600;m=g.exporting.sourceHeight||g.chart.height||/px$/.test(m)&&parseInt(m,10)||400;u(g.chart,{animation:!1,renderTo:e,forExport:!0,renderer:"SVGRenderer",width:c,height:m});g.exporting.enabled=!1;delete g.data;g.series=[];h(this.series,function(a){r=n(a.userOptions, 17 | {animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});r.isInternal||g.series.push(r)});h(this.axes,function(a){a.userOptions.internalKey||(a.userOptions.internalKey=f.uniqueKey())});b=new f.Chart(g,this.callback);a&&h(["xAxis","yAxis","series"],function(c){var d={};a[c]&&(d[c]=a[c],b.update(d))});h(this.axes,function(a){var c=f.find(b.axes,function(b){return b.options.internalKey===a.userOptions.internalKey}),d=a.getExtremes(),e=d.userMin,d=d.userMax;!c||void 0===e&&void 0===d|| 18 | c.setExtremes(e,d,!0,!1)});c=b.getChartHTML();c=this.sanitizeSVG(c,g);g=null;b.destroy();B(e);return c},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(n({chart:{borderRadius:0}},e.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){b=this.getSVGForExport(a,b);a=n(this.options.exporting,a);f.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale, 19 | svg:b},a.formAttributes)},print:function(){var a=this,b=a.container,e=[],c=b.parentNode,f=p.body,m=f.childNodes,g=a.options.exporting.printMaxWidth,d,H;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);E(a,"beforePrint");if(H=g&&a.chartWidth>g)d=[a.options.chart.width,void 0,!1],a.setSize(g,void 0,!1);h(m,function(a,b){1===a.nodeType&&(e[b]=a.style.display,a.style.display="none")});f.appendChild(b);D.focus();D.print();setTimeout(function(){c.appendChild(b);h(m,function(a,b){1===a.nodeType&& 20 | (a.style.display=e[b])});a.isPrinting=!1;H&&a.setSize.apply(a,d);E(a,"afterPrint")},1E3)}},contextMenu:function(a,b,e,c,f,m,g){var d=this,r=d.options.navigation,k=d.chartWidth,q=d.chartHeight,n="cache-"+a,l=d[n],x=Math.max(f,m),y,z;l||(d[n]=l=t("div",{className:a},{position:"absolute",zIndex:1E3,padding:x+"px"},d.container),y=t("div",{className:"highcharts-menu"},null,l),v(y,u({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},r.menuStyle)),z=function(){v(l, 21 | {display:"none"});g&&g.setState(0);d.openMenu=!1},d.exportEvents.push(w(l,"mouseleave",function(){l.hideTimer=setTimeout(z,500)}),w(l,"mouseenter",function(){clearTimeout(l.hideTimer)}),w(p,"mouseup",function(b){d.pointer.inClass(b.target,a)||z()})),h(b,function(a){if(a){var b;a.separator?b=t("hr",null,null,y):(b=t("div",{className:"highcharts-menu-item",onclick:function(b){b&&b.stopPropagation();z();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},null,y),b.onmouseover= 22 | function(){v(this,r.menuItemHoverStyle)},b.onmouseout=function(){v(this,r.menuItemStyle)},v(b,u({cursor:"pointer"},r.menuItemStyle)));d.exportDivElements.push(b)}}),d.exportDivElements.push(y,l),d.exportMenuWidth=l.offsetWidth,d.exportMenuHeight=l.offsetHeight);b={display:"block"};e+d.exportMenuWidth>k?b.right=k-e-f-x+"px":b.left=e-x+"px";c+m+d.exportMenuHeight>q&&"top"!==g.alignOptions.verticalAlign?b.bottom=q-c-x+"px":b.top=c+m-x+"px";v(l,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer, 23 | c=n(b.options.navigation.buttonOptions,a),f=c.onclick,m=c.menuItems,g,d,k=c.symbolSize||12;b.btnCount||(b.btnCount=0);b.exportDivElements||(b.exportDivElements=[],b.exportSVGElements=[]);if(!1!==c.enabled){var h=c.theme,q=h.states,p=q&&q.hover,q=q&&q.select,l;delete h.states;f?l=function(a){a.stopPropagation();f.call(b,a)}:m&&(l=function(){b.contextMenu(d.menuClassName,m,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?h.paddingLeft=C(h.paddingLeft,25):c.text||u(h,{width:c.width, 24 | height:c.height,padding:0});d=e.button(c.text,0,0,l,h,p,q).addClass(a.className).attr({"stroke-linecap":"round",title:b.options.lang[c._titleKey],zIndex:3});d.menuClassName=a.menuClassName||"highcharts-menu-"+b.btnCount++;c.symbol&&(g=e.symbol(c.symbol,c.symbolX-k/2,c.symbolY-k/2,k,k).addClass("highcharts-button-symbol").attr({zIndex:1}).add(d),g.attr({stroke:c.symbolStroke,fill:c.symbolFill,"stroke-width":c.symbolStrokeWidth||1}));d.add().align(u(c,{width:d.width,x:C(c.x,b.buttonOffset)}),!0,"spacingBox"); 25 | b.buttonOffset+=(d.width+c.buttonSpacing)*("right"===c.align?-1:1);b.exportSVGElements.push(d,g)}},destroyExport:function(a){var b=a?a.target:this;a=b.exportSVGElements;var e=b.exportDivElements,c=b.exportEvents,f;a&&(h(a,function(a,c){a&&(a.onclick=a.ontouchstart=null,f="cache-"+a.menuClassName,b[f]&&delete b[f],b.exportSVGElements[c]=a.destroy())}),a.length=0);e&&(h(e,function(a,c){clearTimeout(a.hideTimer);I(a,"mouseleave");b.exportDivElements[c]=a.onmouseout=a.onmouseover=a.ontouchstart=a.onclick= 26 | null;B(a)}),e.length=0);c&&(h(c,function(a){a()}),c.length=0)}});K.menu=function(a,b,e,c){return["M",a,b+2.5,"L",a+e,b+2.5,"M",a,b+c/2+.5,"L",a+e,b+c/2+.5,"M",a,b+c-1.5,"L",a+e,b+c-1.5]};A.prototype.renderExporting=function(){var a=this,b=a.options.exporting,e=b.buttons,c=a.isDirtyExporting||!a.exportSVGElements;a.buttonOffset=0;a.isDirtyExporting&&a.destroyExport();c&&!1!==b.enabled&&(a.exportEvents=[],F(e,function(b){a.addButton(b)}),a.isDirtyExporting=!1);w(a,"destroy",a.destroyExport)};A.prototype.callbacks.push(function(a){a.renderExporting(); 27 | w(a,"redraw",a.renderExporting);h(["exporting","navigation"],function(b){a[b]={update:function(e,c){a.isDirtyExporting=!0;n(!0,a.options[b],e);C(c,!0)&&a.redraw()}}})})})(k)}); 28 | -------------------------------------------------------------------------------- /autotest/static/js/index.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * @方法描述 4 | */ 5 | function infoInit(){ 6 | } -------------------------------------------------------------------------------- /autotest/static/js/performance.js: -------------------------------------------------------------------------------- 1 | setProgressURL = 'apiperformance/progress/' 2 | 3 | 4 | function search_performance_interface() { 5 | var key_words_name = document.getElementById("key_words_name").value; 6 | var key_words_url = document.getElementById("key_words_url").value; 7 | if (key_words_name == '' && key_words_url == '') { 8 | window.location.reload(true); 9 | } 10 | else { 11 | $.ajax({ 12 | url: "/autotest/apiperformance/search/", 13 | data: JSON.stringify({ 14 | key_words_name: key_words_name, 15 | key_words_url: key_words_url, 16 | }), 17 | contentType: 'application/json;charset=utf-8', 18 | type: "POST", 19 | traditional: true, 20 | success: function (result) { 21 | $('#tbody').empty(); 22 | len = result['id_list'].length; 23 | console.log(len); 24 | for (i = 1; i < len+1; i++) { 25 | tmp_append = '' + 26 | //'' + 27 | '' + i + '' + 28 | '' + result['id_list'][i-1] + '' + 29 | '' + result['name_list'][i-1] + '' + 30 | '' + result['url_list'][i-1] + '' + 31 | '' + result['charger_list'][i-1] + '' + 32 | '' + 33 | '' + 34 | '选择' + 35 | '' + 36 | '' + 37 | ''; 38 | $('#tbody').append(tmp_append); 39 | } 40 | console.log(result); 41 | }, 42 | fail: function (result) { 43 | debugger 44 | } 45 | }); 46 | } 47 | } 48 | 49 | function generate_performance_file(ele){ 50 | var login_list = $(".logins"); 51 | var id_list_login = []; 52 | for(var i=0;i') 168 | var progressBar = document.getElementById('progressBar'); 169 | var duration = document.getElementById('num_sj').value; 170 | var increment = parseInt(duration) * 60; 171 | progressBar.max = increment; 172 | let startTime = new Date(); 173 | 174 | var intervalId = setInterval(function() { 175 | let now = new Date(); 176 | let elapsed = now - startTime; 177 | let seconds = Math.floor(elapsed / 1000); 178 | progressBar.value = seconds % 60; 179 | $.ajax({ 180 | url: appURL+setProgressURL, 181 | type: 'POST', 182 | data: JSON.stringify({ 183 | progress: progressBar.value, 184 | progress_total: increment, 185 | }), 186 | success: (rst) => { 187 | console.log("success") 188 | } 189 | }); 190 | if (progressBar.value === progressBar.max-1) { 191 | clearInterval(intervalId); 192 | } 193 | }, 100); 194 | } 195 | else { 196 | $('.jmeter_status').empty().append('状态:出现异常'); 197 | return; 198 | } 199 | }, 200 | fail: function(result) { 201 | debugger 202 | } 203 | }); 204 | 205 | $.ajax({ 206 | url: "/autotest/apiperformance/start/", 207 | headers:{'X-CSRFToken': '{{ csrf_token }}'}, 208 | contentType: 'application/json;charset=utf-8', 209 | type: "POST", 210 | traditional: true, 211 | success: function(result) { 212 | console.log(result); 213 | if(result == 'success'){ 214 | $('.jmeter_status').empty().append('状态:测试完成'); 215 | $.ajax({ 216 | url: appURL+setProgressURL, 217 | type: 'POST', 218 | data: JSON.stringify({ 219 | progress: 0, 220 | progress_total: 1, 221 | }), 222 | success: (rst) => { 223 | console.log("success") 224 | } 225 | }); 226 | } 227 | else { 228 | $('.jmeter_status').empty().append('状态:测试失败'); 229 | } 230 | }, 231 | fail: function(result) { 232 | debugger 233 | } 234 | }); 235 | } 236 | 237 | function select_login(id1,name1,module1) { 238 | $('#login_panel').append(''+name1+''); 239 | } 240 | function select_not_login(id1,name1,module1) { 241 | $('#not_login_panel').append(''+name1+''); 242 | } 243 | function remove_login_selected(ele) { 244 | var id1 = '#'+ele; 245 | $('#login_panel').find(id1).remove(); 246 | } 247 | function remove_not_login_selected(ele) { 248 | var id1 = '#'+ele; 249 | $('#not_login_panel').find(id1).remove(); 250 | } -------------------------------------------------------------------------------- /autotest/static/js/product.js: -------------------------------------------------------------------------------- 1 | addURL = 'product/add/' 2 | addFieldNames = ["product_name", "product_type", "product_introduction"] 3 | addRequiredFields = [0, 1, 2] 4 | 5 | modURL = 'product/mod/' 6 | modFieldNames = ["id","product_name", "product_type", "product_introduction"] 7 | modRequiredFields = [0, 1, 2] 8 | modRowIndex = [0, 1, 2, 3] 9 | 10 | delURL = 'product/del/' 11 | delFieldNames = ["id"] 12 | 13 | getSearchSelectURL = '' 14 | getSelectURL = '' 15 | searchableTableColumns = [1,2,3] 16 | 17 | tableURL = 'product/getTableData/' 18 | table = 0 19 | tableButtonOperation = " 修改 \ 20 | 删除 " 21 | tableItemsPerPage = 10 22 | tableColumnsData = [ 23 | { data: 0 , 24 | searchable:false, 25 | }, 26 | { data: 1, 27 | searchable:true, 28 | }, 29 | { data: 2, 30 | searchable:true, 31 | }, 32 | { data: 3, 33 | searchable:true, 34 | }, 35 | { data: 4, 36 | searchable:true, 37 | }, 38 | { data: null, 39 | orderable: false, 40 | render: function(data){ 41 | return tableButtonOperation 42 | }, 43 | searchable:false, 44 | } 45 | ] 46 | 47 | function infoInit(){ 48 | tableDataInit() 49 | } 50 | 51 | /** 52 | * @param {Object} d 53 | */ 54 | function tableSearchDataFunction(d){ 55 | return 56 | } 57 | 58 | /** 59 | * @returns 60 | */ 61 | function additionalTips(type = ""){ 62 | return null 63 | } -------------------------------------------------------------------------------- /autotest/static/js/report.js: -------------------------------------------------------------------------------- 1 | 2 | delURL = 'report/del/' 3 | delFieldNames = ["report_id"] 4 | 5 | modURL = 'report/mod/' 6 | modRowIndex = [0, 1, 2, 3, 4, 5] 7 | reportDetailRUL = 'getReportDetail/' 8 | 9 | getSearchSelectURL = '' 10 | getSelectURL = '' 11 | searchableTableColumns = [0,2,3] 12 | 13 | tableURL = 'report/getTableData/' 14 | table = 0 15 | tableButtonOperation = "详情"+ 16 | " 删除 " 17 | tableItemsPerPage = 10 18 | tableColumnsData = [ 19 | { data: 0 , 20 | searchable:true, 21 | }, 22 | { data: 3, 23 | searchable:true, 24 | }, 25 | { data: 4, 26 | searchable:true, 27 | }, 28 | { data: 7, 29 | searchable:false, 30 | }, 31 | { data: 6, 32 | searchable:false, 33 | }, 34 | { data: null, 35 | orderable: false, 36 | render: function(data){ 37 | return tableButtonOperation 38 | }, 39 | searchable:false, 40 | } 41 | ] 42 | 43 | function infoInit(){ 44 | tableDataInit() 45 | laydate.render({ 46 | elem: '#date_Search', 47 | type: 'date', 48 | format: 'yyyy-MM-dd', 49 | }); 50 | } 51 | 52 | /** 53 | * @param {Object} d 54 | */ 55 | function tableSearchDataFunction(d){ 56 | return 57 | } 58 | 59 | /** 60 | * @returns 61 | */ 62 | function additionalTips(type = ""){ 63 | return null 64 | } 65 | 66 | function report_id(e) { 67 | window.event.stopPropagation() 68 | selectedRow = e.parentNode.parentNode 69 | report_id = selectedRow.children[0].innerText 70 | $("[name=caseTitle]").text("测试报告 [" + report_id + "] 详情") 71 | console.log(report_id) 72 | return report_id 73 | } -------------------------------------------------------------------------------- /autotest/static/js/testplan.js: -------------------------------------------------------------------------------- 1 | 2 | runURL = 'apitestplan/run/' 3 | getProgressURL = 'apitestplan/get/' 4 | 5 | 6 | function infoInit(){ 7 | laydate.render({ 8 | elem: '#date_Add', 9 | type: 'datetime', 10 | format: 'yyyy-MM-dd HH:mm', 11 | }); 12 | laydate.render({ 13 | elem: '#date_Mod', 14 | type: 'datetime', 15 | format: 'yyyy-MM-dd HH:mm', 16 | }); 17 | laydate.render({ 18 | elem: '#date_Search', 19 | type: 'datetime', 20 | format: 'yyyy-MM-dd HH:mm', 21 | }); 22 | } 23 | 24 | /** 25 | * @param {Object} d 26 | */ 27 | function tableSearchDataFunction(d){ 28 | return 29 | } 30 | 31 | 32 | /** 33 | * @returns 34 | */ 35 | function additionalTips(type = ""){ 36 | return null 37 | } 38 | 39 | 40 | /** 41 | * 42 | * @returns 43 | * @param {Element} e 44 | * @param {*} tips 45 | */ 46 | function runActions(e,tips="运行成功"){ 47 | run(e) 48 | } 49 | 50 | -------------------------------------------------------------------------------- /autotest/static/js/user.js: -------------------------------------------------------------------------------- 1 | addURL = 'user/add/' 2 | addFieldNames = ["username", "password", "email", "is_superuser","last_name"] 3 | addRequiredFields = [0, 1, 2, 3, 4] 4 | 5 | modURL = 'user/mod/' 6 | modFieldNames = ["id", "username", "password", "email", "is_superuser","last_name"] 7 | modRequiredFields = [1, 2, 3, 4, 5] 8 | modRowIndex = [0, 1, 2, 3, 4, 5] 9 | 10 | setURL='user/mod/' 11 | setFieldNames = ["id", "username", "password", "email", "is_superuser","last_name"] 12 | setRequiredFields = [0,1,2,3,4,5] 13 | setRowIndex = [0,1,2,3,4,5] 14 | 15 | delURL = 'user/del/' 16 | delFieldNames = ["id"] 17 | 18 | getSearchSelectURL = 'user/getSearchSelect/' 19 | getAddSelectURL = 'user/getAddSelect/' 20 | getSelectURL = 'user/getSelect/' 21 | searchableTableColumns = [1, 4] 22 | 23 | tableURL = 'user/getTableData/' 24 | table = 0 25 | tableButtonOperation = " 设置 \ 26 | 修改 \ 27 | 删除 " 28 | tableItemsPerPage = 10 29 | tableColumnsData = [ 30 | { data: 0 , 31 | searchable:false, 32 | }, 33 | { data: 4, 34 | searchable:true, 35 | }, 36 | { data: 1, 37 | render: function(data){ 38 | return "******" 39 | }, 40 | searchable:false, 41 | }, 42 | { data: 7, 43 | searchable:false, 44 | }, 45 | { data: 3, 46 | render: function(data) { 47 | if (data == '1') 48 | data = "管理员"; 49 | else if (data == '0') 50 | data = "普通用户"; 51 | return data; 52 | }, 53 | searchable:true, 54 | }, 55 | { data: 6, 56 | searchable:true, 57 | }, 58 | { data: null, 59 | orderable: false, 60 | render: function(data){ 61 | return tableButtonOperation 62 | }, 63 | searchable:false, 64 | } 65 | ] 66 | 67 | function infoInit(){ 68 | getAndShowSearchSelectValue() 69 | getAndShowAddSelectValue() 70 | getAndShowModSelectValue() 71 | getAndShowSetSelectValue() 72 | tableDataInit() 73 | } 74 | 75 | 76 | function tableSearchDataFunction(d){ 77 | d.user_name = $("[name=searchField]").eq(0).val() 78 | } 79 | 80 | 81 | function additionalTips(type = ""){ 82 | return null 83 | } 84 | -------------------------------------------------------------------------------- /autotest/static/src/localfiles/dataTables.bootstrap4.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | DataTables Bootstrap 4 integration 3 | ©2011-2017 SpryMedia Ltd - datatables.net/license 4 | */ 5 | var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", 12 | renderer:"bootstrap"});a.extend(d.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});d.ext.renderer.pageButton.bootstrap=function(f,l,A,B,m,t){var u=new d.Api(f),C=f.oClasses,n=f.oLanguage.oPaginate,D=f.oLanguage.oAria.paginate||{},h,k,v=0,y=function(q,w){var x,E=function(p){p.preventDefault(); 13 | a(p.currentTarget).hasClass("disabled")||u.page()==p.data.action||u.page(p.data.action).draw("page")};var r=0;for(x=w.length;r",{"class":C.sPageButton+" "+k,id:0===A&&"string"===typeof g?f.sTableId+"_"+g:null}).append(a("",{href:"#","aria-controls":f.sTableId,"aria-label":D[g],"data-dt-idx":v,tabindex:f.iTabIndex,"class":"page-link"}).html(h)).appendTo(q);f.oApi._fnBindAction(F,{action:g},E);v++}}}};try{var z=a(l).find(c.activeElement).data("dt-idx")}catch(q){}y(a(l).empty().html('').children("ul"),B);z!==e&&a(l).find("[data-dt-idx="+z+"]").trigger("focus")};return d}); 15 | -------------------------------------------------------------------------------- /autotest/static/src/pic/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/check.png -------------------------------------------------------------------------------- /autotest/static/src/pic/icon_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/icon_add.png -------------------------------------------------------------------------------- /autotest/static/src/pic/icon_del.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/icon_del.png -------------------------------------------------------------------------------- /autotest/static/src/pic/icon_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/icon_edit.png -------------------------------------------------------------------------------- /autotest/static/src/pic/icon_edit_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/icon_edit_1.png -------------------------------------------------------------------------------- /autotest/static/src/pic/ui_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/ui_add.png -------------------------------------------------------------------------------- /autotest/static/src/pic/ui_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/ui_delete.png -------------------------------------------------------------------------------- /autotest/static/src/pic/ui_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/ui_edit.png -------------------------------------------------------------------------------- /autotest/static/src/pic/ui_radio_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/ui_radio_button.png -------------------------------------------------------------------------------- /autotest/static/src/pic/ui_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/ui_search.png -------------------------------------------------------------------------------- /autotest/static/src/pic/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/src/pic/user.png -------------------------------------------------------------------------------- /autotest/static/vendors/laydate/theme/default/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/vendors/laydate/theme/default/font/iconfont.eot -------------------------------------------------------------------------------- /autotest/static/vendors/laydate/theme/default/font/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /autotest/static/vendors/laydate/theme/default/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/vendors/laydate/theme/default/font/iconfont.ttf -------------------------------------------------------------------------------- /autotest/static/vendors/laydate/theme/default/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/vendors/laydate/theme/default/font/iconfont.woff -------------------------------------------------------------------------------- /autotest/static/vendors/laydate/theme/default/laydate.css: -------------------------------------------------------------------------------- 1 | .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}@font-face{font-family:laydate-icon;src:url(font/iconfont.eot);src:url(font/iconfont.eot#iefix) format('embedded-opentype'),url(font/iconfont.svg#iconfont) format('svg'),url(font/iconfont.woff) format('woff'),url(font/iconfont.ttf) format('truetype')}.laydate-icon{font-family:laydate-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-name:laydate-downbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #C9C9C9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-footer span:hover{color:#5FB878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#B5FFF8}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#00acf0!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} -------------------------------------------------------------------------------- /autotest/static/vendors/owl.carousel/dist/assets/owl.carousel.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Owl Carousel v2.3.4 3 | * Copyright 2013-2018 David Deutsch 4 | * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE 5 | */ 6 | .owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;touch-action:manipulation;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-nav button.owl-next,.owl-carousel .owl-nav button.owl-prev,.owl-carousel button.owl-dot{background:0 0;color:inherit;border:none;padding:0!important;font:inherit}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item .owl-lazy:not([src]),.owl-carousel .owl-item .owl-lazy[src^=""]{max-height:0}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%} -------------------------------------------------------------------------------- /autotest/static/vendors/owl.carousel/dist/assets/owl.theme.default.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Owl Carousel v2.3.4 3 | * Copyright 2013-2018 David Deutsch 4 | * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE 5 | */ 6 | .owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791} -------------------------------------------------------------------------------- /autotest/static/vendors/owl.carousel/dist/assets/owl.video.play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/autotest/static/vendors/owl.carousel/dist/assets/owl.video.play.png -------------------------------------------------------------------------------- /autotest/tasks.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from Autotestplat.celery import app 3 | 4 | @app.task(bind=True) 5 | def debug_task(self): 6 | print('Request: {0!r}'.format(self.request)) 7 | -------------------------------------------------------------------------------- /autotest/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 自动化测试平台 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 产品管理 34 | 35 | 36 | 接口用例 37 | 38 | 39 | 测试计划 40 | 41 | 42 | 测试报告 43 | 44 | 45 | 性能测试 46 | 47 | 48 | UI测试 49 | 50 | AppUI测试 51 | WebUI测试 52 | 53 | 54 | 55 | 系统设置 56 | 57 | 58 | 用户管理 59 | 60 | 61 | 使用手册 62 | 63 | 64 | 65 | 66 | 67 | 退 出 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Autotestplat-V5.0 功能说明 78 | 实现了接口自动化完整功能,产品,接口用例、参数化,测试计划,定时任务,测试报告。 79 | 达到了企业级自动化测试平台需求。 80 | 实现了实时接口性能测试,生成测试脚本,执行测试,测试报告。当前版本测试过程和结果暂时没有设计存储于数据库。 81 | 82 | 实现了AppUI自动化设置,用例录入,单个用例运行,全部用例运行。测试报告当前版本暂时没有设计。 83 | 84 | 实现了WebUI自动化设置,用例录入,单个用例运行,全部用例运行。测试报告当前版本暂时没有设计。 85 | 86 | 87 | Autotestplat-V5.0 操作手册 88 | 接口测试: 89 | 第一步、设置用户,设置产品/项目,用户设置默认产品,也就是当前正在进入使用的产品。 90 | 第二步、在系统设置中设置参数,环境设置即设置host地址,常量即设置固定值作为参数,变量可以是时间戳,随机数字、字符等。 91 | 第三步、在接口用例中进行接口用例录入调试,设置断言,通过正则表达式设置关联参数,执行;在接口中通过{关键字}提取参数值。 92 | 第四步、在测试计划中选择接口用例,定时设置,勾选调试,更新,增行,减行,更改顺序。 93 | 第五步、在测试报告中查看测试记录,报告的详情数据。 94 | 95 | 性能测试: 96 | 第一步、选择接口,输入并发数,持续压测时间,点击生成jmeter脚本。 97 | 第二步、点击测试开始。 98 | 第三步、点击查看结果。 99 | AppUI测试: 100 | 第一步、系统设置App设置。 101 | 第二步、启动weditor,连接手机,抓取App元素控件,录入用例。 102 | 第三步、执行,查看用例结果。 103 | WebUI测试: 104 | 第一步、系统设置Web设置。 105 | 第二步、安装谷歌浏览器,版本100.0.4896.75 (正式版本) (32 位)。 106 | 第三步、执行,查看用例结果。 107 | 108 | 安装部署: 109 | 110 | 第一步:git clone https://github.com/testdevhome/Autotestplat 111 | 112 | 第二步:pip install -r requirements.txt 113 | 114 | 第三步:python manage.py runserver 0.0.0.0:80 115 | 116 | 第四步:redis-server redis.windows.conf 117 | 118 | 第五步:python manage.py celery worker -c 6 -l debug 119 | 120 | 第六步:python manage.py celery beat 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /autotest/templates/interface_performance.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 性能测试 10 | 11 | 12 | {# #} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 产品管理 45 | 46 | 47 | 接口用例 48 | 49 | 50 | 测试计划 51 | 52 | 53 | 测试报告 54 | 55 | 56 | 性能测试 57 | 58 | 59 | UI测试 60 | 61 | AppUI测试 62 | WebUI测试 63 | 64 | 65 | 66 | 系统设置 67 | 68 | 69 | 用户管理 70 | 71 | 72 | 73 | {{ product_name }} 74 | {% for product in product_alls %} 75 | 76 | {% if product.product_name == product_name %} 77 | {{ product.product_name }} ✓ 78 | {% else %} 79 | {{ product.product_name }} 80 | {% endif %} 81 | 82 | {% endfor %} 83 | 84 | 85 | 86 | 87 | 88 | 使用手册 89 | 退出 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 查询 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 顺序 123 | ID 124 | 接口名称 125 | URL 126 | 产品 127 | 创建人 128 | 选择接口 129 | 130 | 131 | 132 | 133 | {% for rec in page_list %} 134 | 135 | {{ forloop.counter }} 136 | {{ rec.id }} 137 | {{ rec.name }} 138 | {{ rec.url }} 139 | {{ rec.product_id }} 140 | {{ rec.charger }} 141 | 142 | 143 | 选择 144 | 145 | 146 | 147 | {% endfor %} 148 | 149 | 150 | 151 | 152 | 153 | 154 | {% if page_list.has_previous %} 155 | 首页 156 | 上一页 157 | {% else %} 158 | 上一页 159 | {% endif %} 160 | {% if page_list.has_next %} 161 | 下一页 162 | 尾页 163 | {% else %} 164 | 下一页 165 | {% endif %} 166 | 167 | 跳转 168 | 第 {{ page_list.number }} / {{ page_list.paginator.num_pages }}页 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 设置 179 | 180 | 181 | 182 | 并发线程数 183 | 184 | 185 | 186 | 187 | 188 | 次数 189 | 190 | 191 | 192 | 193 | 194 | 持续时间(分钟) 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 模式 207 | 208 | 多用户 209 | 单用户 210 | 211 | 212 | 213 | 214 | 215 | cookie 216 | 217 | 不处理 218 | 后台生成 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 操作 228 | 生成Jmeter文件 229 | 测试开始 230 | 查看结果 231 | 232 | 233 | 234 | 235 | 236 | 237 | 239 | 240 | 登录接口 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 选择的接口列表 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | -------------------------------------------------------------------------------- /autotest/templates/interface_report.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 测试报告 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 产品管理 42 | 43 | 44 | 接口用例 45 | 46 | 47 | 测试计划 48 | 49 | 50 | 测试报告 51 | 52 | 53 | 性能测试 54 | 55 | 56 | UI测试 57 | 58 | AppUI测试 59 | WebUI测试 60 | 61 | 62 | 63 | 系统设置 64 | 65 | 66 | 用户管理 67 | 68 | 69 | 70 | {{ product_name }} 71 | {% for product in product_alls %} 72 | 73 | {% if product.product_name == product_name %} 74 | {{ product.product_name }} ✓ 75 | {% else %} 76 | {{ product.product_name }} 77 | {% endif %} 78 | 79 | {% endfor %} 80 | 81 | 82 | 83 | 84 | 85 | 使用手册 86 | 退出 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 测试报告ID: 99 | 100 | 101 | 102 | 测试计划: 103 | 104 | 105 | 106 | 执行时间: 107 | 108 | 109 | 查询 110 | 111 | 112 | 113 | 114 | 115 | 测试报告ID 116 | 包含测试计划 117 | 执行时间 118 | 接口数量 119 | 通过率 120 | 操作 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 删除确认 133 | 134 | × 135 | 136 | 137 | 138 | 139 | 报告ID 140 | 141 | 142 | 143 | 包含测试计划 144 | 145 | 146 | 147 | 执行时间 148 | 149 | 150 | 151 | 接口数量 152 | 153 | 154 | 155 | 确 定 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | -------------------------------------------------------------------------------- /autotest/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Autotestplat-V5.0 9 | 10 | 11 | 12 | 13 | 14 | 15 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 一站式自动化测试平台系统 61 | 62 | 63 | 64 | 65 | 用 户 名 66 | 67 | 68 | 69 | 70 | 71 | 密 码 72 | 73 | 74 | 75 | 76 | 登 录 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /autotest/templates/product.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 产品管理 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 产品管理 35 | 36 | 37 | 接口用例 38 | 39 | 40 | 测试计划 41 | 42 | 43 | 测试报告 44 | 45 | 46 | 性能测试 47 | 48 | 49 | UI测试 50 | 51 | AppUI测试 52 | WebUI测试 53 | 54 | 55 | 56 | 系统设置 57 | 58 | 59 | 用户管理 60 | 61 | 62 | 63 | {{ product_name }} 64 | {% for product in product_alls %} 65 | 66 | {% if product.product_name == product_name %} 67 | {{ product.product_name }} ✓ 68 | {% else %} 69 | {{ product.product_name }} 70 | {% endif %} 71 | 72 | {% endfor %} 73 | 74 | 75 | 76 | 77 | 78 | 使用手册 79 | 退出 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 产品名称: 92 | 93 | 94 | 95 | 产品介绍: 96 | 97 | 98 | 查询 99 | 添加 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | ID 108 | 产品名称 109 | 产品类型 110 | 产品介绍 111 | 创建人 112 | 操作 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 添加产品 125 | 126 | × 127 | 128 | 129 | 130 | 131 | * 产品名称 132 | 133 | 134 | 135 | * 产品类型 136 | 137 | 138 | 139 | * 产品介绍 140 | 141 | 142 | 143 | 确 定 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 修改产品 153 | 154 | × 155 | 156 | 157 | 158 | 159 | * 产品编码 160 | 161 | 162 | 163 | * 产品名称 164 | 165 | 166 | 167 | * 产品类型 168 | 169 | 170 | 171 | * 产品介绍 172 | 173 | 174 | 175 | 保 存 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 删除确认 185 | 186 | × 187 | 188 | 189 | 190 | 191 | 产品编码 192 | 193 | 194 | 195 | 产品名称 196 | 197 | 198 | 199 | 200 | 确 定 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | -------------------------------------------------------------------------------- /autotest/test_out.log: -------------------------------------------------------------------------------- 1 | 【接口名称】: 用户列表接口-随机数字参数4mod 2 | 【请求方式】: POST 3 | 【请求URL】:http://127.0.0.1/autotest/user/getTableData/ 4 | 【请求head】:{"Accept": "", "Content-Type": "application/json;charset=utf-8", "Cookie": "", "token": "{token}"} 5 | 【请求参数】:{'username': '76006146790'} 6 | 【Cookies】: 7 | 8 | 【响应状态码】:200 OK 9 | 【响应数据】:{"data": [[2, "pbkdf2_sha256$120000$auasduyPIcIm$6Otq65NwuQ/z0pDImICy+xbNXqdSSZdqqk57oOfeNbM=", "2024-01-08T23:18:20.383Z", 0, "fin", "fin", "Autotestplat", "13711112221", 1, 1, "2023-10-04T03:24:35Z"], [4, "pbkdf2_sha256$120000$Sy6uDO27Dtfg$XOZvLV0DLAC0QXtZ1tgnTj+EYzMYvFiegv96plk9EbQ=", "2023-12-04T05:14:34.016Z", 0, "test", "", "ChatGPT", "13800001111", 1, 1, "2023-10-13T06:23:00Z"], [7, "pbkdf2_sha256$120000$5gxslwxrcPYl$Dnk4wwqVsLXN0Hgcbc+W+EqECZB+THuwRcxoSfs9bzU=", "2023-11-30T07:03:02.557Z", 1, "root", "", "Autotestplat", "13822223333", 1, 1, "2023-11-06T00:00:00Z"], [8, "pbkdf2_sha256$120000$hWrOMJTGZ9XP$7zz48zsB2k66Dehhxgna5lQiCVw9PHs7Kvb2wbgClvU=", "2023-12-04T05:39:44.845Z", 1, "admin", "", "Autotestplat", "13822223333", 1, 1, "2023-11-06T00:00:00Z"]]} 10 | 【响应时间】:0.030801 秒 11 | 12 | 【断言】: fin 13 | 【测试结果】: 测试通过 14 | 15 | -------------------------------------------------------------------------------- /autotest/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /autotest/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ############################################ 3 | #Auther::Fin 4 | #Version:Autotestplat-V4.0 5 | ############################################ 6 | from django.urls import path 7 | from . import views, views_index 8 | from . import views_user 9 | from . import views_product 10 | from . import views_interface 11 | from . import views_systemsettings 12 | from . import views_interfacetestplan 13 | from . import views_interfacereport 14 | from . import views_performance 15 | from . import views_apptestcase 16 | from . import views_webtestcase 17 | 18 | urlpatterns = [ 19 | path('index/', views_index.indexView, name='index'), 20 | path('user/', views_user.userView, name='user'), 21 | path('user/getSearchSelect/', views_user.loadUserRoleSearch), 22 | path('user/getAddSelect/', views_user.loadAddOptions), 23 | path('user/getSelect/', views_user.loadOptions), 24 | path('user/getTableData/', views_user.loadUser), 25 | path('user/add/', views_user.addUser), 26 | path('user/mod/', views_user.updateUser), 27 | path('user/del/', views_user.deleteUser), 28 | path('user/get/', views_user.getUserProduct), 29 | path('user/set/', views_user.setUserProduct), 30 | path('login/', views_user.loginView, name='login'), 31 | path('login/identify/', views_user.login), 32 | path('login/last/', views_user.lastLogin), 33 | path('logout/', views_user.logout), 34 | path('systemsettings/', views_systemsettings.showSystemSettings, name='parasettings'), 35 | path('systemsettings/getTableData/', views_systemsettings.loadSystemSettings), 36 | path('systemsettings/add/', views_systemsettings.addSettingsPara), 37 | path('systemsettings/del/', views_systemsettings.delSettingsPara), 38 | path('systemsettings/showMod/', views_systemsettings.showModSettingsPara), 39 | path('systemsettings/mod/', views_systemsettings.saveModSettingsPara), 40 | path('systemsettings/getSearchSelect/', views_systemsettings.loadParaTypeSearch), 41 | path('systemsettings/getSelect/', views_systemsettings.loadParaOption), 42 | path('product/', views_product.productView, name='product'), 43 | path('product/getTableData/', views_product.loadProduct), 44 | path('product/add/', views_product.addProduct), 45 | path('product/mod/', views_product.updateProduct), 46 | path('product/del/', views_product.deleteProduct), 47 | path('apitestcase/module/get/', views_interface.loadModule), 48 | path('apitestcase/addModule/', views_interface.addModule), 49 | path('apitestcase/modModule/', views_interface.modModule), 50 | path('apitestcase/delModule/', views_interface.deleteModule), 51 | path('apitestcase/', views_interface.getApiView,name='apitestcase'), 52 | path('apitestcase/getTableData//', views_interface.loadApiTestcaseTable), 53 | path('apitestcase/show_add_window/', views_interface.showAddWindow), 54 | path('apitestcase/add/', views_interface.addInterfaces), 55 | path('apitestcase/search/', views_interface.searchInterface), 56 | path('apitestcase/show_edit_interface///', views_interface.showEditInterface), 57 | path('apitestcase/save_edit_interface//', views_interface.saveEditInterface), 58 | path('apitestcase/save_copy_interface//', views_interface.saveCopyInterface), 59 | path('apitestcase/del/', views_interface.delInterface), 60 | path('apitestcase/send/', views_interface.startInterfaceSend), 61 | path('apitestcase/show_request_data/', views_interface.showRequestData), 62 | path('apitestplan/', views_interfacetestplan.interfaceTestplan,name='apitestplan'), 63 | path('apitestplan/add/', views_interfacetestplan.addTestplan), 64 | path('apitestplan/show_edit_testplan/', views_interfacetestplan.showEditTestplan), 65 | path('apitestplan/mod/', views_interfacetestplan.saveEditTestplan), 66 | path('apitestplan/update/', views_interfacetestplan.updateTestplanInterface), 67 | path('apitestplan/del_row/', views_interfacetestplan.delRow), 68 | path('apitestplan/del_row_edit/', views_interfacetestplan.delRowEdit), 69 | path('apitestplan/del/', views_interfacetestplan.delTestplan), 70 | path('apitestplan/search/', views_interfacetestplan.searchTestplan), 71 | path('apitestplan/apitestcase/search/', views_interfacetestplan.searchTestplanApiTestcase), 72 | path('apitestplan/run/', views_interfacetestplan.startInterfaceTestplan), 73 | path('apitestplan/run//', views_interfacetestplan.runTestplan), 74 | path('apitestplan/get//', views_interfacetestplan.getProgress), 75 | path('report/', views_interfacereport.reportView, name='apireport'), 76 | path('report/getTableData/', views_interfacereport.loadReport), 77 | path('report/getReportDetail//', views_interfacereport.getReportDetail, name='reportdetail'), 78 | path('report/del/', views_interfacereport.deleteReport), 79 | path('apiperformance/', views_performance.apiPerformance, name='apiperformance'), 80 | path('apiperformance/search/', views_performance.searchPerformanceInterface), 81 | path('apiperformance/generate/', views_performance.generateJmeterFile), 82 | path('apiperformance/prepare/', views_performance.prepareJmeter), 83 | path('apiperformance/start/', views_performance.startTestJmeter), 84 | path('apiperformance/progress/', views_performance.showProgress), 85 | path('apptestcase/', views_apptestcase.getAppView, name='apptestcase'), 86 | path('apptestcase/getSearchSelect/', views_apptestcase.loadAppOptions), 87 | path('apptestcase/getTableData/', views_apptestcase.loadAppTestcaseTable), 88 | path('apptestcase/addApptestcase/', views_apptestcase.addApptestcase), 89 | path('apptestcase/delApptestcase/', views_apptestcase.deleteApptestcase), 90 | path('apptestcase/showModAppTestcase/',views_apptestcase.showModAppTestcase), 91 | path('apptestcase/modApptestcase/', views_apptestcase.modApptestcase), 92 | path('apptestcase/showCopyAppTestcase/', views_apptestcase.showCopyAppTestcase), 93 | path('apptestcase/copyApptestcase/', views_apptestcase.copyApptestcase), 94 | path('apptestcase/run_apptestcase/', views_apptestcase.runApptestcase), 95 | path('apptestcase/runAllTestcase/', views_apptestcase.runAllTestcase), 96 | 97 | path('webtestcase/', views_webtestcase.getWebView, name='webtestcase'), 98 | path('webtestcase/getSearchSelect/', views_webtestcase.loadWebOptions), 99 | path('webtestcase/getTableData/', views_webtestcase.loadWebTestcaseTable), 100 | path('webtestcase/addWebtestcase/', views_webtestcase.addWebtestcase), 101 | path('webtestcase/delWebtestcase/', views_webtestcase.deleteWebtestcase), 102 | path('webtestcase/showModWebTestcase/', views_webtestcase.showModWebTestcase), 103 | path('webtestcase/modWebtestcase/', views_webtestcase.modWebtestcase), 104 | path('webtestcase/showCopyWebTestcase/', views_webtestcase.showCopyWebTestcase), 105 | path('webtestcase/copyWebtestcase/', views_webtestcase.copyWebtestcase), 106 | path('webtestcase/run_webtestcase/', views_webtestcase.runWebtestcase), 107 | path('webtestcase/runAllTestcase/', views_webtestcase.runAllTestcase), 108 | ] -------------------------------------------------------------------------------- /autotest/users.txt: -------------------------------------------------------------------------------- 1 | fin,test123456 2 | test,test123456 -------------------------------------------------------------------------------- /autotest/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | def login_view(request): 4 | if request.method == 'GET': 5 | return render(request, 'login.html') 6 | 7 | 8 | -------------------------------------------------------------------------------- /autotest/views_index.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | def indexView(request): 4 | return render(request, "index.html") 5 | 6 | -------------------------------------------------------------------------------- /autotest/views_interfacereport.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ############################################ 3 | #Auther::Fin 4 | #Version:Autotestplat-V2.6 5 | ############################################ 6 | import re,time,random,json,os 7 | from .models import * 8 | from datetime import datetime 9 | from django.views.decorators.csrf import csrf_exempt 10 | from django.shortcuts import render, redirect 11 | from django.http import JsonResponse, HttpResponse 12 | from .views_user import * 13 | from django.contrib.auth import get_user_model 14 | from django.db.models import Count 15 | from djcelery.models import PeriodicTask 16 | from django.conf import settings 17 | from django.http import StreamingHttpResponse 18 | from django.template.context_processors import csrf 19 | from django.shortcuts import render_to_response 20 | from pdfkit import from_url 21 | import pdfkit 22 | def reportView(request): 23 | user_name = request.session.get('user', '') 24 | product_all = AutotestplatProduct.objects.filter(delete_flag='N') 25 | product_id = AuthUser.objects.filter(username=user_name).first().last_name 26 | product_name = AutotestplatProduct.objects.filter(id=product_id).first().product_name 27 | c = csrf(request) 28 | c.update({"product_name":product_name,"product_alls":product_all}) 29 | return render_to_response("interface_report.html",c) 30 | 31 | @csrf_exempt 32 | def loadReport(request): 33 | username = request.session.get('user', '') 34 | if AuthUser.objects.filter(username=username).first().is_superuser == 1: 35 | items = AutotestplatTestplanInterfaceResult.objects.all().values_list('report_id','product_id','product_name', 'suit_name', 'date_time','task_mode','pass_pers').annotate(Count('id')) 36 | else: 37 | product_id = AuthUser.objects.filter(username=username).first().last_name 38 | items = [] 39 | result = AutotestplatTestplanInterfaceResult.objects.filter(product_id=product_id).values_list('report_id','product_id','product_name', 'suit_name', 'date_time','task_mode','pass_pers').annotate(Count('id')) 40 | if result: 41 | items +=result 42 | rst = [] 43 | for item in items: 44 | arr = [] 45 | for j in item: 46 | arr.append(j) 47 | rst.append(arr) 48 | realRst = {'data': rst} 49 | return JsonResponse(realRst) 50 | 51 | @csrf_exempt 52 | def getReportDetail(request,report_id): 53 | items = AutotestplatTestplanInterfaceResult.objects.filter(report_id=report_id).all().order_by('id') 54 | testreport_id = report_id 55 | testplan_name = items.first().suit_name 56 | testplan_time = items.first().date_time 57 | product_name = items.first().product_name 58 | testcase_all_count = len(AutotestplatTestplanInterfaceResult.objects.filter(report_id=report_id).all().order_by('id')) 59 | testcase_pass_count = len(AutotestplatTestplanInterfaceResult.objects.filter(report_id=report_id).filter(result=0).order_by('id')) 60 | testcase_fail_count = len(AutotestplatTestplanInterfaceResult.objects.filter(report_id=report_id).filter(result=1).order_by('id')) 61 | testcase_norun_count = testcase_all_count-testcase_pass_count-testcase_fail_count 62 | testcase_pass_pers = '{:.0%}'.format(testcase_pass_count / testcase_all_count) 63 | return render(request, "interface_report_detail.html",{"test_result": items,"report_id":testreport_id,"testplan_name":testplan_name,"testcase_all_count":testcase_all_count,"testcase_pass_count":testcase_pass_count,"testcase_fail_count":testcase_fail_count,"testcase_norun_count":testcase_norun_count,"testcase_pass_pers":testcase_pass_pers,"testplan_time":testplan_time,'product_name':product_name}) 64 | 65 | @csrf_exempt 66 | def deleteReport(request): 67 | id = request.POST.get('report_id') 68 | AutotestplatTestplanInterfaceResult.objects.filter(report_id=id).delete() 69 | return HttpResponse('200') 70 | 71 | -------------------------------------------------------------------------------- /autotest/views_product.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ############################################ 3 | #Auther::Fin 4 | #Version:Autotestplat-V2.6 5 | ############################################ 6 | import re,time,random,json 7 | from .models import * 8 | from datetime import datetime 9 | from django.views.decorators.csrf import csrf_exempt 10 | from django.shortcuts import render, redirect 11 | from django.http import JsonResponse, HttpResponse 12 | from django.template.context_processors import csrf 13 | from django.shortcuts import render_to_response 14 | from .views_user import * 15 | from django.contrib.auth import get_user_model 16 | 17 | def productView(request): 18 | user_name = request.session.get('user', '') 19 | product_all = AutotestplatProduct.objects.filter(delete_flag='N') 20 | product_id = AuthUser.objects.filter(username=user_name).first().last_name 21 | product_name = AutotestplatProduct.objects.filter(id=product_id).first().product_name 22 | c = csrf(request) 23 | c.update({"product_name":product_name,"product_alls":product_all}) 24 | return render_to_response("product.html",c) 25 | 26 | @csrf_exempt 27 | def loadProduct(request): 28 | items = AutotestplatProduct.objects.exclude(delete_flag='Y').values_list().order_by('id') 29 | rst = [] 30 | for item in items: 31 | arr = [] 32 | for j in item: 33 | arr.append(j) 34 | rst.append(arr) 35 | realRst = {'data': rst} 36 | return JsonResponse(realRst) 37 | 38 | @csrf_exempt 39 | def addProduct(request): 40 | product_name = request.POST.get('product_name') 41 | product_type = request.POST.get('product_type') 42 | product_introduction = request.POST.get('product_introduction') 43 | charger = request.session.get('user', '') 44 | delete_flag = 'N' 45 | product_name_exist = AutotestplatProduct.objects.filter(product_name=product_name).first() 46 | if product_name_exist: 47 | return HttpResponse(f'产品”{product_name}“已存在,请重新填写') 48 | AutotestplatProduct.objects.create(product_name=product_name, product_type=product_type, product_introduction=product_introduction,charger=charger,delete_flag=delete_flag) 49 | return HttpResponse('200') 50 | 51 | @csrf_exempt 52 | def deleteProduct(request): 53 | id = request.POST.get('id') 54 | delete_flag = 'Y' 55 | sn = AuthUser.objects.filter(last_name=id) 56 | if sn: 57 | return HttpResponse(f'在用户设置中,有人设置了默认正使用该产品,不能删除!') 58 | AutotestplatProduct.objects.filter(id=id).update(delete_flag=delete_flag) 59 | return HttpResponse('200') 60 | 61 | @csrf_exempt 62 | def updateProduct(request): 63 | id = request.POST.get('id') 64 | product_name = request.POST.get('product_name') 65 | product_type = request.POST.get('product_type') 66 | product_introduction = request.POST.get('product_introduction') 67 | if AutotestplatProduct.objects.exclude(id=id).filter(product_name=product_name).exists(): 68 | return HttpResponse(f'产品”{product_name}“重复,请重新填写') 69 | AutotestplatProduct.objects.filter(id=id).update(id=id,product_name=product_name,product_type=product_type,product_introduction=product_introduction) 70 | return HttpResponse('200') 71 | -------------------------------------------------------------------------------- /autotest/views_systemsettings.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ############################################ 3 | #Auther::Fin 4 | #Version:Autotestplat-V2.7 5 | ############################################ 6 | import json,time,random 7 | from .models import * 8 | from datetime import datetime 9 | from django.views.decorators.csrf import csrf_exempt 10 | from django.shortcuts import render, redirect 11 | from django.http import JsonResponse, HttpResponse 12 | from django.db.models import Q 13 | from django.template.context_processors import csrf 14 | from django.shortcuts import render_to_response 15 | from django.contrib.auth.decorators import login_required 16 | from faker import Faker 17 | from hashlib import md5 18 | import hashlib 19 | import requests 20 | import hashlib,string 21 | from django.http import HttpResponseBadRequest, HttpResponseRedirect 22 | 23 | fake = Faker("zh_CN") 24 | 25 | @login_required 26 | def showSystemSettings(request): 27 | username = request.session.get('user', '') 28 | user_product_id = AuthUser.objects.filter(username=username).first().last_name 29 | product_name_tmp = AutotestplatProduct.objects.filter(id=user_product_id).first().product_name 30 | try: 31 | para_list = AutotestplatParameter.objects.filter(Q(product_id=user_product_id),~Q(type='res')).order_by('-id').all() 32 | except: 33 | para_list = AutotestplatParameter.objects.filter(~Q(type='res')) 34 | product_name = AutotestplatProduct.objects.all() 35 | product_all = AutotestplatProduct.objects.filter(delete_flag='N') 36 | c = csrf(request) 37 | c.update({'para_list': para_list,"product_names":product_name,"product_alls":product_all,"product_name":product_name_tmp}) 38 | return render_to_response("system_setting.html",c) 39 | 40 | @csrf_exempt 41 | @login_required 42 | def loadSystemSettings(request): 43 | username = request.session.get('user', '') 44 | if AuthUser.objects.filter(username=username).first().is_superuser == 1: 45 | items = AutotestplatParameter.objects.filter(~Q(type='res')).values_list().order_by('id') 46 | else: 47 | user_product_id = AuthUser.objects.filter(username=username).first().last_name 48 | try: 49 | items = AutotestplatParameter.objects.filter(Q(product_id=user_product_id), ~Q(type='res')).values_list().order_by('id') 50 | except: 51 | items = AutotestplatParameter.objects.filter(~Q(type='res')).values_list().order_by('id') 52 | rst = [] 53 | for item in items: 54 | arr = [] 55 | tmp_ids = AutotestplatProduct.objects.all().values_list().order_by('id') 56 | tmp = [] 57 | for tmp_id in tmp_ids: 58 | tmp.append(tmp_id[0]) 59 | if (item[7] == None): 60 | count = 0 61 | else: 62 | count = tmp.count(int(item[7])) 63 | if count > 0: 64 | product_name = AutotestplatProduct.objects.filter(id=int(item[7])).first().product_name 65 | item_list = list(item) 66 | item_list[7] = product_name 67 | item = tuple(item_list) 68 | for j in item: 69 | arr.append(j) 70 | rst.append(arr) 71 | realRst = {'data': rst} 72 | return JsonResponse(realRst) 73 | 74 | @csrf_exempt 75 | def loadParaTypeSearch(request): 76 | para_type = [] 77 | items = AutotestplatParameter.objects.filter().values('type').order_by('type').distinct() 78 | for item in items: 79 | if (item['type']=='con'): 80 | item['type']='常量' 81 | para_type.append(item['type']) 82 | elif(item['type']=='var'): 83 | item['type']='变量' 84 | para_type.append(item['type']) 85 | elif(item['type']=='env'): 86 | item['type']='环境设置' 87 | para_type.append(item['type']) 88 | elif (item['type'] == 'auth'): 89 | item['type'] = '认证' 90 | para_type.append(item['type']) 91 | elif (item['type'] == 'app'): 92 | item['type'] = 'App设置' 93 | para_type.append(item['type']) 94 | elif (item['type'] == 'web'): 95 | item['type'] = 'Web设置' 96 | para_type.append(item['type']) 97 | else: 98 | pass 99 | rst = [para_type] 100 | return JsonResponse(rst, safe=False) 101 | 102 | @csrf_exempt 103 | def loadParaOption(request): 104 | username = request.session.get('user', '') 105 | product_name = [] 106 | if AuthUser.objects.filter(username=username).first().is_superuser == 1: 107 | items = AutotestplatProduct.objects.filter().values('product_name').order_by('product_name').distinct() 108 | else: 109 | product_id = AuthUser.objects.filter(username=username).first().last_name 110 | items = AutotestplatProduct.objects.filter(id=product_id).values('product_name').order_by('product_name').distinct() 111 | for item in items: 112 | product_name.append(item['product_name']) 113 | para_type = ['常量','变量','环境设置','认证','App设置','Web设置'] 114 | rst = [product_name,para_type] 115 | return JsonResponse(rst, safe=False) 116 | 117 | def addSettingsPara(request): 118 | product_name = request.POST.get('product_id') 119 | product_id = AutotestplatProduct.objects.filter(product_name=product_name).first().id 120 | type = request.POST.get('type') 121 | if(type=='常量'): 122 | type='con' 123 | elif(type=='变量'): 124 | type='var' 125 | elif(type=='环境设置'): 126 | type='env' 127 | elif (type == '认证'): 128 | type = 'auth' 129 | elif (type == 'App设置'): 130 | type = 'app' 131 | elif (type == 'Web设置'): 132 | type = 'web' 133 | name = request.POST.get('name') 134 | keywords = request.POST.get('keywords') 135 | value = request.POST.get('value') 136 | login_account = request.POST.get('login_account') 137 | login_password = request.POST.get('login_password') 138 | left = request.POST.get('left') 139 | right = request.POST.get('right') 140 | keywords_exist = AutotestplatParameter.objects.filter(keywords=keywords).first() 141 | if keywords_exist: 142 | return HttpResponse(f'关键字"{keywords}"在当前产品或其他产品中已存在,请重新填写') 143 | AutotestplatParameter.objects.create(product_id=product_id, type=type, name=name, keywords=keywords, value=value,login_account=login_account,login_password=login_password,left=left,right=right) 144 | return HttpResponse('200') 145 | 146 | def delSettingsPara(request): 147 | if request.method == "POST": 148 | id = request.POST.get('id') 149 | AutotestplatParameter.objects.filter(id=id).delete() 150 | return HttpResponse('200') 151 | 152 | 153 | def showModSettingsPara(request): 154 | if request.method == "POST": 155 | raw_data = request.body 156 | raw_data = json.loads(raw_data) 157 | id = raw_data['id1'] 158 | para_infos = AutotestplatParameter.objects.filter(id=id) 159 | loginUserName = para_infos.first().login_account 160 | loginPassword = para_infos.first().login_password 161 | left = para_infos.first().left 162 | right = para_infos.first().right 163 | para_info = {'id': id, 164 | 'loginUserName': loginUserName, 165 | 'loginPassword':loginPassword, 166 | 'left':left, 167 | 'right':right, 168 | } 169 | return HttpResponse(json.dumps(para_info), content_type='application/json') 170 | 171 | 172 | def saveModSettingsPara(request): 173 | id = request.POST.get('id') 174 | product_name = request.POST.get('product_id') 175 | product_id = AutotestplatProduct.objects.filter(product_name=product_name).first().id 176 | type = request.POST.get('type') 177 | name = request.POST.get('name') 178 | keywords = request.POST.get('keywords') 179 | value = request.POST.get('value') 180 | login_account = request.POST.get('login_account') 181 | login_password = request.POST.get('login_password') 182 | left = request.POST.get('left') 183 | right = request.POST.get('right') 184 | if (type == '常量'): 185 | type = 'con' 186 | elif (type == '变量'): 187 | type = 'var' 188 | elif (type == '环境设置'): 189 | type = 'env' 190 | elif (type == '认证'): 191 | type = 'auth' 192 | elif (type == 'App设置'): 193 | type = 'app' 194 | elif (type == 'Web设置'): 195 | type = 'web' 196 | if AutotestplatParameter.objects.exclude(id=id).filter(keywords=keywords).exists(): 197 | return HttpResponse(f'关键字”{keywords}“已存在,请重新填写') 198 | AutotestplatParameter.objects.filter(id=id).update(id=id, product_id=product_id,type=type,name=name,keywords=keywords,value=value,login_account=login_account,login_password=login_password,left=left,right=right) 199 | return HttpResponse('200') 200 | -------------------------------------------------------------------------------- /autotest/views_user.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ############################################ 3 | #Auther::Fin 4 | #Version:Autotestplat-V2.6 5 | ############################################ 6 | import json,time 7 | from .models import * 8 | from datetime import datetime 9 | from django.views.decorators.csrf import csrf_exempt 10 | from django.shortcuts import render, redirect 11 | from django.http import JsonResponse, HttpResponse 12 | from django.template.context_processors import csrf 13 | from django.shortcuts import render_to_response 14 | from django.contrib.auth import login 15 | from django.contrib import auth 16 | from django.contrib.auth.hashers import make_password 17 | 18 | def loginView(request): 19 | return render(request, 'login.html') 20 | 21 | @csrf_exempt 22 | def login(request): 23 | if request.method == "POST": 24 | username = request.POST.get('user', '') 25 | password = request.POST.get('pwd', '') 26 | user = auth.authenticate(username=username, password=password) 27 | if user is not None and user.is_active: 28 | auth.login(request, user) 29 | request.session['user'] = username 30 | return HttpResponse(f'登录成功') 31 | else: 32 | return HttpResponse(f'用户名或密码输入不正确') 33 | else: 34 | return HttpResponse(f'请输入正确用户名和密码') 35 | 36 | @csrf_exempt 37 | def lastLogin(request): 38 | if request.POST.get('user') != '': 39 | return HttpResponse('200') 40 | return HttpResponse('400') 41 | 42 | @csrf_exempt 43 | def logout(request): 44 | return HttpResponse('logout') 45 | 46 | def userView(request): 47 | user_name = request.session.get('user', '') 48 | product_all = AutotestplatProduct.objects.filter(delete_flag='N') 49 | product_id = AuthUser.objects.filter(username=user_name).first().last_name 50 | product_name = AutotestplatProduct.objects.filter(id=product_id).first().product_name 51 | c = csrf(request) 52 | c.update({"product_name":product_name,"product_alls":product_all}) 53 | return render_to_response("user.html",c) 54 | 55 | @csrf_exempt 56 | def loadUser(request): 57 | items = AuthUser.objects.all().values_list().order_by('id') 58 | rst = [] 59 | for item in items: 60 | arr = [] 61 | tmp_ids =AutotestplatProduct.objects.all().values_list().order_by('id') 62 | tmp = [] 63 | for tmp_id in tmp_ids: 64 | tmp.append(tmp_id[0]) 65 | if(item[6]==None or item[6]==''): 66 | count=0 67 | else: 68 | count = tmp.count(int(item[6])) 69 | if count>0: 70 | product_name=AutotestplatProduct.objects.filter(id=item[6]).first().product_name 71 | item_list = list(item) 72 | item_list[6] = product_name 73 | item = tuple(item_list) 74 | for j in item: 75 | arr.append(j) 76 | rst.append(arr) 77 | realRst = {'data': rst} 78 | return JsonResponse(realRst) 79 | 80 | @csrf_exempt 81 | def loadUserRoleSearch(request): 82 | role_name = [] 83 | items = AuthUser.objects.filter().values('is_superuser').order_by('is_superuser').distinct() 84 | for item in items: 85 | if (item['is_superuser'] == 1): 86 | item['is_superuser'] = '管理员' 87 | role_name.append(item['is_superuser']) 88 | elif (item['is_superuser'] == 0): 89 | item['is_superuser'] = '普通用户' 90 | role_name.append(item['is_superuser']) 91 | rst = [role_name] 92 | return JsonResponse(rst, safe=False) 93 | 94 | 95 | @csrf_exempt 96 | def loadAddOptions(request): 97 | product_id = [] 98 | items = AutotestplatProduct.objects.exclude(delete_flag='Y').values('product_name').order_by('id').distinct() 99 | for item in items: 100 | product_id.append(item['product_name']) 101 | rst = [product_id] 102 | return JsonResponse(rst, safe=False) 103 | 104 | @csrf_exempt 105 | def loadOptions(request): 106 | role_name = [] 107 | items = AuthUser.objects.filter().values('is_superuser').order_by('is_superuser').distinct() 108 | for item in items: 109 | if (item['is_superuser'] == 1): 110 | item['is_superuser'] = '管理员' 111 | role_name.append(item['is_superuser']) 112 | elif (item['is_superuser'] == 0): 113 | item['is_superuser'] = '普通用户' 114 | role_name.append(item['is_superuser']) 115 | product_id = [] 116 | items = AutotestplatProduct.objects.filter().values('product_name').order_by('id').distinct() 117 | for item in items: 118 | product_id.append(item['product_name']) 119 | rst = [role_name,product_id] 120 | return JsonResponse(rst, safe=False) 121 | 122 | @csrf_exempt 123 | def addUser(request): 124 | user_name = request.POST.get('username') 125 | user_pwd = request.POST.get('password') 126 | make_user_pwd = make_password(user_pwd) 127 | contact = request.POST.get('email') 128 | role_name = request.POST.get('is_superuser') 129 | if (role_name == '管理员'): 130 | role_name = 1 131 | elif (role_name == '普通用户'): 132 | role_name = 0 133 | product_name = request.POST.get('last_name') 134 | product_id = AutotestplatProduct.objects.filter(product_name=product_name).first().id 135 | is_staff = 1 136 | is_active = 1 137 | create_date = str(time.strftime("%Y-%m-%d")) 138 | user = AuthUser.objects.filter(username=user_name) 139 | if user: 140 | return HttpResponse(f'用户"{user_name}"已存在,请重新填写') 141 | AuthUser.objects.create(username=user_name,password=make_user_pwd,email=contact,is_superuser=role_name,last_name=product_id,is_staff=is_staff,is_active=is_active,date_joined=create_date) 142 | return HttpResponse('200') 143 | 144 | @csrf_exempt 145 | def deleteUser(request): 146 | id = request.POST.get('id') 147 | AuthUser.objects.filter(id=id).delete() 148 | return HttpResponse('200') 149 | 150 | @csrf_exempt 151 | def updateUser(request,userName): 152 | id = request.POST.get('id') 153 | cur_id=AuthUser.objects.filter(username=userName).first().id 154 | user_name = request.POST.get('username') 155 | user_pwd = request.POST.get('password') 156 | if user_pwd == "undefined": 157 | make_user_pwd=AuthUser.objects.filter(id=id).first().password 158 | elif user_pwd=="******": 159 | make_user_pwd=AuthUser.objects.filter(id=id).first().password 160 | else: 161 | make_user_pwd = make_password(user_pwd) 162 | contact = request.POST.get('email') 163 | role_name = request.POST.get('is_superuser') 164 | if (role_name == '管理员'): 165 | role_name = 1 166 | elif (role_name == '普通用户'): 167 | role_name = 0 168 | product_name= request.POST.get('last_name') 169 | product_id = AutotestplatProduct.objects.filter(product_name=product_name).first().id 170 | if AuthUser.objects.exclude(id=id).filter(username=user_name).exists(): 171 | return HttpResponse(f'用户”{user_name}“已存在,请重新填写') 172 | AuthUser.objects.filter(id=id).update(username=user_name,password=make_user_pwd,email=contact,is_superuser=role_name,last_name=product_id) 173 | return HttpResponse('200,'+str(cur_id)) 174 | 175 | 176 | @csrf_exempt 177 | def getUserProduct(request): 178 | user_name = request.session.get('user', '') 179 | product_id=AuthUser.objects.filter(username=user_name).first().last_name 180 | product_name=AutotestplatProduct.objects.filter(id=product_id).first().product_name 181 | return HttpResponse(product_name) 182 | 183 | @csrf_exempt 184 | def setUserProduct(request): 185 | product_name = request.POST.get('product_name') 186 | user_name = request.session.get('user', '') 187 | product_id = AutotestplatProduct.objects.filter(product_name=product_name).first().id 188 | AuthUser.objects.filter(username=user_name).update(last_name=product_id) 189 | return HttpResponse('200') -------------------------------------------------------------------------------- /chromedriver.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/testdevhome/Autotestplat/78ffaa365c593bee2d8224d34920b63837f5f40f/chromedriver.exe -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Autotestplat.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | setuptools==28.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 2 | kombu==3.0.37 -i https://pypi.tuna.tsinghua.edu.cn/simple 3 | celery==3.1.26.post2 -i https://pypi.tuna.tsinghua.edu.cn/simple 4 | django==2.1.3 -i https://pypi.tuna.tsinghua.edu.cn/simple 5 | django-celery==3.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple 6 | redis==2.10.6 -i https://pypi.tuna.tsinghua.edu.cn/simple 7 | celery-with-redis==3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 8 | django-redis==4.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 9 | PyMySQL==1.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple 10 | requests==2.15.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 11 | urllib3==1.22 -i https://pypi.tuna.tsinghua.edu.cn/simple 12 | chardet==3.0.4 -i https://pypi.tuna.tsinghua.edu.cn/simple 13 | certifi==2023.7.22 -i https://pypi.tuna.tsinghua.edu.cn/simple 14 | idna==2.6 -i https://pypi.tuna.tsinghua.edu.cn/simple 15 | adbutils==1.2.11 -i https://pypi.tuna.tsinghua.edu.cn/simple 16 | django-cors-headers==3.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 17 | mysqlclient==1.4.6 -i https://pypi.tuna.tsinghua.edu.cn/simple 18 | paramiko==3.3.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 19 | psutil==5.9.5 -i https://pypi.tuna.tsinghua.edu.cn/simple 20 | pywin32==305 -i https://pypi.tuna.tsinghua.edu.cn/simple 21 | faker==14.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 22 | uiautomator2==2.16.25 -i https://pypi.tuna.tsinghua.edu.cn/simple 23 | weditor==0.6.4 -i https://pypi.tuna.tsinghua.edu.cn/simple 24 | selenium==3.141.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 25 | -------------------------------------------------------------------------------- /start_beat.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | del /q /s "E:\Autotestplat\celerybeat.pid" 3 | python manage.py celery beat 4 | pause -------------------------------------------------------------------------------- /start_service.bat: -------------------------------------------------------------------------------- 1 | python manage.py runserver 0.0.0.0:80 -------------------------------------------------------------------------------- /start_worker.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | python manage.py celery worker -c 6 -l debug 3 | pause --------------------------------------------------------------------------------