Macaca Macaca 使用键盘等物理按键

达峰的夏天 · 2017年03月26日 · 最后由 jasonSky 回复于 2018年09月12日 · 2757 次阅读

上一版的实现:https://testerhome.com/topics/7785 中暴露了许多问题,尤其是方案不统一的做法非常不好,经过 Macaca 开发小组讨论,按照各端统一的做法来实现了 keys。

录制器 UIRecoder 也会同步支持此功能

如何使用?

首先还是升级驱动版本到最新,然后使用 Macaca 提供的 Node.js Java 或 Python 语言包,调用keys即可,例如:


const KEY_MAP = require('webdriver-keycode');
driver.keys(`send keys: ${KEY_MAP.HOME_SCREEN}`)  // 输入“send keys: ”字符后会按HOME_SCREEN

更多参考文档请见:https://github.com/alibaba/macaca/issues/487,此文档会随着功能实现同步更新

PC 现有编码映射逻辑

  • \uE002 "HELP" => 259 (0x00000103)
  • \uE003 "BACK_SPACE" => 67 (0x00000043)
  • \uE004 "TAB" => 61 (0x0000003d)
  • \uE005 "CLEAR" => 28 (0x0000001c)
  • \uE007 "ENTER" => 66 (0x00000042)
  • \uE008 "SHIFT" => 59 (0x0000003b)
  • \uE009 "CONTROL" => 113 (0x00000071)
  • \uE00A "ALT" => 57 (0x00000039)
  • \uE00B "PAUSE" => 121 (0x00000079)
  • \uE00C "ESCAPE" => 111 (0x0000006f)
  • \uE00E "PAGE_UP" => 92 (0x0000005c)
  • \uE00F "PAGE_DOWN" => 93 (0x0000005d)
  • \uE010 "END" => 123 (0x0000007b)
  • \uE011 "HOME" => 122 (0x0000007a)
  • \uE012 "ARROW_LEFT" => 21 (0x00000015)
  • \uE013 "ARROW_UP" => 19 (0x00000013)
  • \uE014 "ARROW_RIGHT" => 22 (0x00000016)
  • \uE015 "ARROW_DOWN" => 20 (0x00000014)
  • \uE016 "INSERT" => 124 (0x0000007c)
  • \uE017 "DELETE" => 112 (0x00000070)
  • \uE031 "F1" => 131 (0x00000083)
  • \uE032 "F2" => 132 (0x00000084)
  • \uE033 "F3" => 133 (0x00000085)
  • \uE034 "F4" => 134 (0x00000086)
  • \uE035 "F5" => 135 (0x00000087)
  • \uE036 "F6" => 136 (0x00000088)
  • \uE037 "F7" => 137 (0x00000089)
  • \uE038 "F8" => 138 (0x0000008a)
  • \uE039 "F9" => 139 (0x0000008b)
  • \uE03A "F10" => 140 (0x0000008c)
  • \uE03B "F11" => 141 (0x0000008d)
  • \uE03C "F12" => 142 (0x0000008e)
  • \uE03D "META" => 117 (0x00000075)

Android 编码映射逻辑

  • \uE101 "POWER 电源键" => 26 (0x0000001a)
  • \uE102 "VOLUME_UP 音量加" => 24 (0x00000018)
  • \uE103 "VOLUME_DOWN 音量减" => 25 (0x00000019)
  • \uE104 "VOLUME_MUTE 禁音" => 164 (0x000000a4)
  • \uE105 "HOME_SCREEN HOME 键" => 3 (0x00000003)
  • \uE106 "BACK BACK 键" => 4 (0x00000004)
  • \uE107 "MENU MENU 键" => 82 (0x00000052)
  • \uE108 "CAMERA 拍照键" => 27 (0x0000001b)
  • \uE109 "CALL 电话键" => 5 (0x00000005)
  • \uE10A "END_CALL 结束电话键" => 6 (0x00000006)
  • \uE10B "SEARCH 搜索键" => 84 (0x00000054)
  • \uE10C "DPAD_LEFT 导航左键" => 21 (0x00000015)
  • \uE10D "DPAD_UP 导航上键" => 19 (0x00000013)
  • \uE10E "DPAD_RIGHT 导航右键" => 22 (0x00000016)
  • \uE10F "DPAD_DOWN 导航下键" => 20 (0x00000014)
  • \uE110 "DPAD_CENTER 导航确定键" => 23 (0x00000017)

iOS 物理键编码规范

  • \uE105 "HOME_SCREEN HOME 键"
共收到 16 条回复 时间 点赞
达峰的夏天 java 如何模拟 Android 的按键 中提及了此贴 03月26日 16:28
达峰的夏天 appium 基础之键盘处理 中提及了此贴 03月26日 16:29

@xdf macaca 是否支持获取 toast 文本的信息,在官网上看 api 没看到相关的说明,287162474 这个群一直加不进去。。。

在 toast 销毁前直接获取 toast 就行啊,问题在哪啊?

没看到相关的 api 说明,是相当于直接获取 text() 文本?

python 如何调用 keys?

@xdf https://macacajs.github.io/macaca-wd/#source 在 API 文档那没看到有相关说明,应该调用哪个方法?

这次改动,貌似对 driver.keys 方法对一些密码控件输入框的支持又不是很好了。当同一个页面存在好几个密码输入框时,比如修改密码的场景。最初输入框输入都是 sendkeys 就可以,之后发现 app 密码控件用该方法能定位到输入框但是在输入时,总是自动跳到上一个输入框输入所以改成
JSONObject center1 = (JSONObject) driver.getRect(UpdatePWPageUI.XINMIMASHURU);
int X1 = center1.getIntValue("x")+center1.getIntValue("width")/2;
int Y1 = center1.getIntValue("y")+center1.getIntValue("height")/2;
driver.tap(X1,Y1);
driver.keys(newPWFirst);
用了一段时间没问题,但是现在更新之后发现,用这个方法又会出现以前的问题,输入原始密码后,输入新密码时,自动跳回到原始密码输入框输入新密码。换回去直接用 sendkeys 方法也不行,望官方同学关注一下。

强烈建议支持一下 python😂

python 用什么?

看 sample

iOS 的就只有一个吗

Python 最后实现了这个方法吗? 例如想调用 Ctrl + - 实现页面缩小。
selenium 里面是可以的,macaca 怎么做都发现没效果。

17楼 已删除

录制器 UIRecoder 也会同步支持此功能 -----这个是不是还没有支持?

appium 自动化如何实现 按下 iOS 手机 HOME 键

伯乐一顾 回复

char[] home = {'\uE105'}
driver.keys(new String(home))

一个新的问题: 回到桌面后, 打开其他应用 里面的元素都获取不了 返回 NoSuchElement @xdf

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