zoukankan      html  css  js  c++  java
  • 使用Python实现基于图像识别的iOS自动化测试

    相对于Android来说,iOS比较封闭。这一点,在设计和评估自动化测试方案的时候感觉尤其强烈。iOS平台上没有特别好用的自动化测试工具。苹果针对iOS提供了UI Automation的Instruments工具,以及相配合使用的Javascript库,但是使用起来有很大的局限性。主要问题是必须使用Javascript来编写测试脚本,不支持其他语言,很难实现复杂的功能。而且,在一台mac机上同时只能运行一个Instruments实例,无法对多个设备同时进行测试。在多数游戏应用中,UI都不是使用标准控件的,所以不可避免的要使用图像识别技术。而iOS UI Automation API里面除了截屏的功能并没有提供多少帮助。

    所幸的是我们找到了UIAHost.performTaskWithPathArgumentsTimeout()方法。这个方法是用来调用外部程序的。巧妙地利用这个方法可以实现比较复杂的功能。但是我仍然希望测试逻辑能用Python来写,因为Python用起来相当顺手而且有成熟的测试框架。

    要让UI Automation的Javascript脚本听从Python脚本的指挥,可以把Javascript脚本写成一个服务器,接受来自Python脚本的指令,并调用相应的API完成任务。通信的任务可以使用socket。当然Javascript脚本本身无法完成这个任务,所以需要调用外部程序来实现。这个外部程序可以用Python来写,我称之为slave.py,而Javascript脚本就是master.js,因为是master创建的slave进程。当然实际上slave并不听命于master,master反而要听从slave从socket获得的指令。

    这样一来,只需要写个驱动层,把API调用包装一下,通过socket传输到slave.py,再通过slave.py的stdout返回到master.js,再通过调用UI Automation API就实现了Python脚本的自动化测试。当然本文没有涉及很多细节实现问题,留给以后有时间再阐述。

    以下是简化的master.js示例代码:

    UIALogger.logMessage("Instruments started.")
    
    var target = UIATarget.localTarget();
    var app = target.frontMostApp();
    var window = app.mainWindow();
    var host = target.host();
    
    var screenshotPath = "screen";
    
    var python_path = host.performTaskWithPathArgumentsTimeout("/usr/bin/which", ['python'], 1).stdout.replace("\n", "");
    if (python_path == "") {
        UIALogger.logError("python is not found.");
    }
    else {
        while(1) {
            var result = host.performTaskWithPathArgumentsTimeout(
                python_path,['InstrumentsSlave.py'], 30);
    
            var ins = ("" + result.stdout).split('\n'); 
            
            if (ins[0] == 'exitApp')
                break;
            
            switch (ins[0]) {
            case 'tap':
                var x = ins[1];
                var y = ins[2];
                target.tap({x:x, y:y})
                break;
            case 'input':
                var s = ins[1];
                app.keyboard().typeString(s)
                break;            
            case 'captureScreen':
                target.captureScreenWithName(screenshotPath);
                break;
            default:
                break;
            }
        }
    }
  • 相关阅读:
    JSP中page和pageContext的区别
    exe4j生成的exe文件没有把jre文件也打进exe文件中
    exe4j将jar文件和jre文件打包成exe
    exe4j打包jar文件为exe文件出现的问题:The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.
    JS作用域
    js 函数
    js数组
    js表达式和语句
    js操作符
    js注释和数据类型转换
  • 原文地址:https://www.cnblogs.com/silmerusse/p/3198590.html
Copyright © 2011-2022 走看看