• “Mac 自带的 UIAutomator 生成 JavaScript, 跑起来速度很快的。”

    对于你说的很快,夸张了吧,Appium 比起直接用 Uiautomator(Android)写的 jar,执行起来是要慢点,但是也不至于你说的那么慢吧 .

    Appium 真正驱动手机执行的动作的部分,还是依赖的是设备平台自己的测试框架,例如 Andorid 下面的 Uiautomator,具体实现你去看 Bootstrap 的源码:

    static {
        map.put("waitForIdle", new WaitForIdle());
        map.put("clear", new Clear());
        map.put("orientation", new Orientation());
        map.put("swipe", new Swipe());
        map.put("flick", new Flick());
        map.put("drag", new Drag());
        map.put("pinch", new Pinch());
        map.put("click", new Click());
        map.put("touchLongClick", new TouchLongClick());
        map.put("touchDown", new TouchDown());
        map.put("touchUp", new TouchUp());
        map.put("touchMove", new TouchMove());
        map.put("getText", new GetText());
        map.put("setText", new SetText());
        map.put("getName", new GetName());
        map.put("getAttribute", new GetAttribute());
        map.put("getDeviceSize", new GetDeviceSize());
        map.put("scrollTo", new ScrollTo());
        map.put("find", new Find());
        map.put("getLocation", new GetLocation());
        map.put("getSize", new GetSize());
        map.put("wake", new Wake());
        map.put("pressBack", new PressBack());
        map.put("pressKeyCode", new PressKeyCode());
        map.put("longPressKeyCode", new LongPressKeyCode());
        map.put("takeScreenshot", new TakeScreenshot());
        map.put("updateStrings", new UpdateStrings());
        map.put("getDataDir", new GetDataDir());
        map.put("performMultiPointerGesture", new MultiPointerGesture());
        map.put("openNotification", new OpenNotification());
        map.put("source", new Source());
        map.put("compressedLayoutHierarchy", new CompressedLayoutHierarchy());
      }
    

    这个 map 里面 key 所对应的方法里面的动作,其实基本上都是 Uiautomator 的接口去实现的。
    所以慢也不至于像你说的那么慢。
    httpserver 和 scriptClient,BootStrap 和 AppiumServer 之间的通行的确会消耗掉一部分时间。

  • #2 楼 @fanfaneve
    大哥 启动能不慢吗?

    Android.prototype.start = function (cb, onDie) {
      this.launchCb = cb;
      this.uiautomatorExitCb = onDie;
      logger.info("Starting android appium");
      async.series([
        this.initJavaVersion.bind(this),
        this.initAdb.bind(this),
        this.initUiautomator.bind(this),
        this.prepareDevice.bind(this),
        this.packageAndLaunchActivityFromManifest.bind(this),
        this.checkApiLevel.bind(this),
        this.pushStrings.bind(this),
        this.processFromManifest.bind(this),
        this.uninstallApp.bind(this),
        this.installAppForTest.bind(this),
        this.forwardPort.bind(this),
        this.pushAppium.bind(this),
        this.initUnicode.bind(this),
        this.pushSettingsApp.bind(this),
        this.pushUnlock.bind(this),
        function (cb) {this.uiautomator.start(cb);}.bind(this),
        this.wakeUp.bind(this),
        this.unlock.bind(this),
        this.getDataDir.bind(this),
        this.setupCompressedLayoutHierarchy.bind(this),
        this.startAppUnderTest.bind(this),
        this.initAutoWebview.bind(this)
      ], function (err) {
        if (err) {
          this.shutdown(function () {
            this.launchCb(err);
          }.bind(this));
        } else {
          this.didLaunch = true;
          this.launchCb(null, this.proxySessionId);
        }
      }.bind(this));
    };
    

    this.installAppForTest.bind(this),
    this.pushUnlock.bind(this),
    等动作都比较耗时。
    有些没必要的你完全可以注释掉。

    我现在是自己将 server 端的代码修改了一部分,速度要好很多.

  • 请粘贴一下 server 端打印出来的信息呢 。

  • 帮你查了一下源码:

    @property
     def tag_name(self):
           """This element's ``tagName`` property."""
           return self._execute(Command.GET_ELEMENT_TAG_NAME)['value']
    

    tag_name 为标志位了@property 了,也就是说 这个函数在外部访问的时候,可以将他当成属性来使用,所以正确的做法应该是 logButton.tag_name 不要加括号

  • 'unicode' object is not callable

    PYTHON 中遇到这种错误,指的是字符串被当做了函数使用,

    tag_name 是 logButton 对象的函数还是属性,如果是属性,那么应该是 logButton.tag_name 不是 logButton.tag_name()

  • appium 出错,大神来看下 at 2015年04月17日

    zipalign.exe

    这个是在 sdk\tools 下面. 你环境变量对应的 SDK 目录下面的 tools 没有这个程序,你的 SDK 不完整。

  • Appium autoLaunch 问题 at 2015年04月17日

    #3 楼 @chenhengjie123

    // meaning they will manage app install / launching
    

    我去看看自己安装的这种流程在源码里的逻辑。

  • Appium autoLaunch 问题 at 2015年04月17日

    默认值是 True

    True 的话流程会走 Android.prototype.start。

    我想确定是源码里面的情况是 False 就不会初始化 Uiautomator 的对象这种情况是源码的 bug,还是故意这样设计的,或则说这样设计有啥作用没?