from selenium import webdriver
from common import get_case_id
from common.mongo import Mongo class Logic(object):
""" 每一个方法名对应前端的操作的元素,方便反射 """ def __init__(self):
self.mongo = Mongo() def browser(self, params):
""" 打开网页 """
url = params.get('value', None)
self.driver.get(url) def find(self, params):
""" 查找元素 接收选择器和元素内容"""
selector = params.get('selector', None)
value = params.get('value', None)
return self.driver.find_element(selector, value) def send(self, element, params):
""" 输入内容 """
text = params.get('value', "默认值")
element.send_keys(text) def click(self, element, params):
""" 点击操作 """
element.click() def close(self):
""" 关闭浏览器 """
self.driver.quit() def execute(self, data):
""" 执行测试,把前端传过来的指令映射为selenium的操作方法 """
# 防止每次调logic都初始化driver,这里放到执行时才初始化driver
self.driver = webdriver.Chrome()
# 取data的commands(所有的元素和操作的dict)
'''
{'casename': 'zz',
'commands':
[
{'command': 'browser', 'parameter': {'value': 'http://127.0.0.1:8000/automation/create'}},
{'command': 'find', 'parameter': {'selector': 'xpath', 'value': '//*[@id="command"]'}}
]}
'''
commands = data.get("commands")
# {'command': 'find', 'parameter': {'selector': 'xpath', 'value': '//*[@id="command"]'}}
element = None
for command in commands:
print(command)
# print(command['command'])
# print(command['parameter'])
cmd = command['command'] # 获取操作方法,对应selenium的方法
params = command['parameter'] # 获取参数:元素、操作对应的值
print(f"run command: [{cmd}] with param: [{params}] and element: [{element}]")
if element:
# 第二步,拿到element,对元素执行相应的操作
element = getattr(self, cmd)(element, params)
else:
# 第一步,element为空,查找元素并返回
element = getattr(self, cmd)(params) # 把操作方法反射为selenium的方法,传入params对应的参数
self.close() def save(self, data):
""" 保存功能 """
data.setdefault('_id', get_case_id())
self.mongo.insert("2019", "automation", data)
return data['_id'] def trigger(self, data):
""" 触发执行测试,用于持续集成 """
id = data.get('id')
cases = list(self.mongo.search("2019", "automation", {'_id': id}))
print(cases[0])
self.execute(cases[0])
from flask import Flask

from interface import interface
from automation import automation app = Flask(__name__) app.register_blueprint(interface)
app.register_blueprint(automation) if __name__ == '__main__':
app.run(
host="0.0.0.0",
port=8000,
debug=True,
)
 

测开之路六十六:UI测试平台之处理逻辑和蓝图添加到程序入口的更多相关文章

  1. 测开之路七十六:性能测试蓝图之html

    <!-- 继承base模板 -->{% extends 'base.html' %} {% block script %} <!-- 从cdn引入ace edter的js --> ...

  2. 测开之路八十六:python操作sqlite

    创建sqlite数据库,并创建表和数据 python自带sqlite3库可以创建数据库文件 导入库:import sqlite3 创建游标,指定数据库名字:con = sqlite3.connect( ...

  3. 测开之路七十六:linux变量和环境变量

    变量 赋值 variable=0,访问 $var或${var} 参数 $n 用``引住的会先执行(~键) 位置参数 环境变量/etc/profile:全局的环境变量 . bash_profile:用户 ...

  4. 测开之路五十六:实现类似unittest的断言

    import inspect class Case(object): """ 实现断言 """ def __init__(self): se ...

  5. 测开之路三十六:常用的css选择器

    在static下新建一个css,并写入内容 /*标签选择器,label标签的颜色为红色*/label {color: red;} /*.代表类选择器,绿色*/.test {color: green;} ...

  6. 测开之路二十六:Flask基础之最小web程序

    Flask中文文档:http://docs.jinkan.org/docs/flask/ 安装Flask库 选端口号的一种方法(避免和别人选的端口冲突,小于1024的时候重新选) 最小web程序 用1 ...

  7. 测开之路六十三:UI测试平台之视图层

    实现效果,在页面时配置 后台执行 蓝图结构 视图代码 from flask import jsonifyfrom flask import requestfrom flask import Bluep ...

  8. 测开之路一百零六:bootstrap布局

    可以在html的head里面加一些说明 <meta http-equiv="X-UA-Compatible" content="IE=edge">& ...

  9. 测开之路五十五:实现类似于unittest查找case

    实现给一个路径,去查找test开头的测试用例文件 创建一个计算器的类,方便后面测试用 class Calculator(object): def add(self, x, y): return x + ...

随机推荐

  1. Sql Server主副本和辅助副本间账号同步以及权限同步

    问题描述 SqlServer如果配置了AlwaysOn,其数据库账号信息同步会出现问题. 我遇到的情况是在主副本添加了账号信息,且给某个数据库添加了权限,这个账号会同步至辅助副本,但是数据库角色信息没 ...

  2. 对第一个HelloWorld程序的总结:

    /* 注释的作用 :提高了代码的阅读性:调试程序的重要方法 对第一个程序的总结: 创建:创建一个以.java结尾的文件叫做源文件 编译:(javac 源文件名.java) 会生成一个或多个字节码(.c ...

  3. Spring之使用注解实例化Bean并注入属性

    1.准备工作 (1)导入jar包 除了上篇文章使用到的基本jar包外,还得加入aop的jar包,所有jar包如下 所需jar包 (2)配置xml <?xml version="1.0& ...

  4. 谈一下你对 uWSGI 和 nginx 的理解??

    1.uWSGI 是一个 Web 服务器,它实现了 WSGI 协议.uwsgi.http 等协议.Nginx 中HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换.WSGI 是一种 ...

  5. python sys模块导入和模块的使用

    sys故名思意,就是系统模块,系统模块内置很多方法,怎么样去调用方法呢 1,argv 参数 sys.argv() 2,exit() 退出程序 sys.exit() 3,version  获取版本信息 ...

  6. XMLHttpRequest.setRequestHeader()

    在AJAX中,如果需要像 HTML 表单那样 POST 数据,需要使用 setRequestHeader() 方法来添加 HTTP 头. 然后在 send() 方法中规定需要希望发送的数据: setR ...

  7. postman断言

    较旧的写作邮差测试风格 较旧的Postman测试编写风格依赖于特殊tests对象的设置值.您可以为对象中的元素设置描述性键,然后说明它是真还是假.例如,tests["Body contain ...

  8. Nginx针对前端静态资源的缓存处理

    当用户上报一个线上的bug后,开发者修改前端代码的bug上新后,用户反映问题依旧存在的问题...这种情况是不是曾经遇到过,这个问题跟浏览器的缓存机制有很大关系(强制缓存和协商缓存,这里我就不介绍具体的 ...

  9. linux 配置 Sersync

    [root@SERSYNC sersync]# cp conf/confxml.xml conf/confxml.xml.bak.$(date +%F) [root@SERSYNC sersync]# ...

  10. linux安装 rsync 客户端和相关权限认证

    [root@rsync-client-inotify /]# yum install rsync -y [root@rsync-client-inotify /]# echo "redhat ...