其他测试框架 强大的全新 Web UI 测试框架 Cypress - 调用 Python 脚本

非洲赵子龙 for Cypress · 2019年02月14日 · 最后由 丧尸没有牙齿 回复于 2020年05月29日 · 6617 次阅读

Python 几乎无所不能,深得大家喜爱,这里介绍 Cypress 如何调用 Python 脚本的输出.
比如,现在要测试一个场景:web 的搜索功能。那么大概步骤就是:用 python 获取数据库存储的正确结果,比对在 web 界面上搜出来的结果,如果二者吻合,那说明搜索功能正常工作,反之亦然。为什么不直接用 JS 操作数据库呢?因为我又要去熟悉 JS 的关于数据库操作的相关支撑库,麻烦啊 (#doge)!当然,麻烦归麻烦,最好的方案还是用 JS 本身的相关支撑库.
这里权当举了一个不恰当的栗子吧!

  • 写 Python 关于数据库的相关操作 很简单,但还是写下来吧!
import sys, pymysql
import urllib.parse
import datetime


def get_data(result):
    res = []
    for i in result:
        temp = []
        for j in i:
            if isinstance(j, datetime.datetime):
                t = j.strftime("%Y-%m-%D %H:%M:%S")
            elif not j:
                t = "None"
            else:
                t = j
            temp.append(urllib.parse.quote(t))
        res.append(temp)
    return res


def connect(schema):
    db = pymysql.connect("your_server_ip", "your_db_username", "you_db_pwd", schema, charset='utf8')
    cursor = db.cursor()
    return db, cursor


def disconnect(cursor):
    cursor.close()


def sql_query(argv):
    db, cur = connect(argv[1])
    try:
        cur.execute(argv[2])
        result_list = cur.fetchall()
        res = get_data(result_list)
        # 这里用print就行了,cypress可以获取python打印的内容
        print(res)
    except Exception as e:
        raise e
    finally:
        disconnect(cur)
    return result_list


if __name__ == "__main__":
    sql_query(sys.argv)

把这个 python 文件放到你 Cypress 项目的某个目录下,比如:Helper/test.py.

  • 写一个文件路径获取函数,用于在用例的可以随时查找所需要的文件的绝对路径
const path = require("path");
export function getScriptPath(scriptName){
    console.log(__filename);
    var scriptPath = path.join(__dirname, "../Helper", scriptName);
    return scriptPath;    
}
  • 编写测试用例
import * as Helper from "../../fixtures/Helper/Helper";
...
// only表示只运行当前用例
it.only("创建角色", function() {
var l = new Array();
        l.push(
          "/usr/local/bin/python3.6",
          Helper.getScriptPath("test.py"),
          "your_scheme",
          "your_sql"
        );
        var command = l.join(" ");
        // 把python的输出内容通过result传递到下一步,就可以随便玩了.
        cy.exec(command).then(result => {
          var a = result.stdout;
          //  示例:打印出来
          console.log(decodeURIComponent(a));
        });
      });
...
...

这样一来,Python 的输出结果就被 JS 成功的解析了,Python+JS 这开发效率简直不要太酸爽!
PS:一定要在该注释的地方打好注释哦!方便维护嘛!

Cypress 入门系列:

注:目前官方团队正在开发 Python 版本,同样的 Free to use,对 JS 恐惧的同学不妨等一等,或者直接 JS 上手,非常简单,VSCode 装上之后,你会爱上 Cypress 和 JS,笔者会慢慢介绍各种 Web UI 自动化复杂场景下 Cypress 的强大应对,目前还没发现 Cypress 无法处理的问题!欢迎一起入坑!QQ 群:947886065.

共收到 5 条回复 时间 点赞

我的天, 还能这样结合着玩!
大神帮我开眼了. thanks~

Python 能否调用 cypress 呢?

stevenxu 回复

可以的 就像调系统命令那样调

这个问题我之前也在研究, 没研究成功,后面就把登录模块用 JS 翻译了一遍, 这能直接访问 python 就叼炸天了, 无所不能呀,感谢分享。

能举个例子怎么调用么?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册