“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()
zipalign.exe
这个是在 sdk\tools 下面. 你环境变量对应的 SDK 目录下面的 tools 没有这个程序,你的 SDK 不完整。
默认值是 True
True 的话流程会走 Android.prototype.start。
我想确定是源码里面的情况是 False 就不会初始化 Uiautomator 的对象这种情况是源码的 bug,还是故意这样设计的,或则说这样设计有啥作用没?