使用 Macaca 测试 Electron 桌面 App

本文由Super-Ps发表于TesterHome论坛,点击原文链接可查看作者的更多文章并与ta在线交流。

继上一篇分享解决了部分问题,本次分享完整的 Macaca 集成 Eletron APP 测试方案。

Macaca 交付过程分析

为了使 Macaca 有测试 Electron 的能力,回顾之前试验的方案 selenmiu-webdriver ,其方式是:传递 chromeDriver 9515 服务端口,启动该端口建立连接,传递 binary 参数,指明 app 的路劲,传递 forBrowser 参数,指明平台类型,所以现在思考的问题是,Macaca 是否通过传递同样的参数能实现?通过 Macaca 官方示例来 分析 1 下原理,精简一下代码

const wd = require('macaca-wd');
var browser = process.env.browser || 'electron' || 'puppeteer';
browser = browser.toLowerCase();

describe('macaca-test/desktop-browser-sample.test.js', function() {
  this.timeout(5 * 60 * 1000);

  var driver = wd.promiseChainRemote({
    host: 'localhost',
    port: process.env.MACACA_SERVER_PORT || 3456
  });

  before(() => {
    return driver
      .init({
        platformName: 'desktop',
        browserName: browser,
        userAgent: `Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0 Safari/537.36 Macaca Custom UserAgent`,
        deviceScaleFactor: 2
      })
      .setWindowSize(800, 600);
  });

上面代码是 Macaca web 端的示例,对应 macaca 服务端的包就是 macaca-chrome ,为什么用它,因为它是基于 chromedriver 的,与我要做的 electron 集成方案底层服务相同。根据以上一段脚本来简要分析 1 下 macaca 交互过程

  1. 先启动服务,启动方式是 命令行输入 macaca-server 启动服务时 macaca-cli 执行 macaca-cli-server,之后调用 webdriver-server 的 inded.js,然后启动 koa 服务,加载中间件,路由,监听端口,等待客户端请求。
  2. 客户端脚本引入 macaca-wd,它是 macaca 客户端支持 node.js 的包,包括了 webdriver 的各种操作。
  3. 客户端调用 promiseChainRemote 是 macaca-wd/wd/lib/main.js 文件的方法,解析传递进来的参数,加上 ./promise-webdriver 支持的链式调用,这里指的是解析了 host,port 两个参数,并得到了一个 driver 对象可以链式调用各种方法。
  4. 进入测试用例套件,调用 init 方法, 该方法在 commands.js ,通过 webdriver.js 的 _init 方法发送脚本内传递的参数到服务端 3456 端口, 执行用例之前我们就启动的服务端,所以一直有监听。
  5. webdriver-server / responseHandler.js 接受客户端请求,并返回给客户端,在服务端命令行可以查看到详细的交互信息。
  6. macaca-chrome 调用 macaca-chromedriver.start(caps) , caps 参数就是脚本 init 里面的参数,此时 macaca-chromedriver 构造时初始化了一系列属性,proxyHost, proxyPort, urlBase ,获取版本,下载默认版本,或者自动下载与浏览器对应的 chromedriver 版本,启动 9515 服务。
  7. macaca-chromedrive 调用 proxy.js 代理请求 发送 status ,session 请求到 9515 服务。
  8. 最后总结 1 下顺序:启动 macaca-server --> macaca-wd --> webdriver-server --> macaca-chrome --> macaca-chromedrive.proxy --> 9515 ,响应按原路返回。

顺手附草图一张,可以根据顺序找下源码文件
image.png

熟悉了过程之后要解决 2 个问题:

  1. 如何传递 electron 应用的路劲?
  2. 该参数谁处理? 根据移动端示例参数的传递可以做为参考,实践 1 下,将代码改写为:
before(() => {
  return driver
    .init({
      platformName: 'desktop',
      browserName: browser,
      app: "/Applications/macaca-electron-builder.app/Contents/MacOS/macaca-electron-builder"
    })
});

运行结果报错了!通过打印 log,参数是已经传递到了步骤 6,步骤 7,参数传递到了,但是 9515 服务没处理,反复跟踪 macaca 运行过程找问题,折腾很久最后得高人指点查询Chromedriver 的参数才恍然大悟,原来 capabilities 是有提供参数的, 参数没传递正确,格式跟参数名字都不对,这里需要一个 chromeOptions Objiect 修正之后长这样

before(() => {
  return driver
    .init({
      platformName: 'desktop',
      browserName: browser,
      chromeOptions: {            //设置chromeDriver chromeOptions object 参数
            binary: '/Applications/macaca-electron-builder.app/Contents/MacOS/macaca-electron-builder'  // 填写自己的执行文件路劲或者安装之后的文件路劲
       })
});

所以,当代理转发参数到设备端时,大多数情况设备端已经实现了该参数,按照规则去设置就能调起来应用了,两个在思考的问题都已解决,下面就描述 1 下完整的方案。

测试 Electron Demo

目前该方案已经提交 macaca 官方并通过了,如果大家想体验示例,可以直接从 macaca 官方网站 或者 官方示例库里查看,这里描述 1 下 mac 的操作步骤,如果你已经懂得如何传递参数,请忽略了以下步骤。

  1. clone 示例库 到本地
  2. 安装依赖 $ npm i $ npm run build $ npm run dist
  3. 启动服务并执行测试用例 $ npm run mac-start $ npm run test
  4. 测试用例示例,因代码格式渲染有问题,直接附上完整的 testCase地址

最后

本着解决自己项目难题的目的,最终却输出了两次分享,过程中不断遇到问题,解决问题,把分析过程跟思考记录下来是希望鼓励更多人,最终沉淀出来的方案是希望帮忙更多人,同时自己也在不断成长,用积累回馈社区。
欢迎大家试用,一起探讨,学习,更加完善示例库,比如有兴趣的同学可以完善 electron 示例应用的 UI 开发,针对各种场景添加 case 等等。

本文由Super-Ps发表于TesterHome论坛,点击原文链接可查看作者的更多文章并与ta在线交流。

今日份的知识已摄入!想要学习更多干货知识、结识质量行业大牛和业界精英?
第十届中国互联网测试开发大会·深圳,了解下 >>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容