手机游戏中遇到的坑(一)

本文分享了一位测试工程师从手机APP自动化转向手游自动化测试的过程。面对手游元素无法直接定位的问题,作者尝试了集成WeTestSDK、使用Robotframework+Sikuli及Appium+坐标定位等多种方案,并分享了每种方法的优缺点。

最近因为工作需要在做手机游戏方面的自动化研究

之前一直是做的手机APP自动化测试,最开始以为手机游戏和手机app都是基于Android手机的,应该是一样的,觉得自己坐下来是没有问题的。

开始做下来后发觉问题越来越多,坑也越来越多

第一个坑------定位之坑:

开启游戏后,悠闲的打开UIautomatorview,准备开始定位元素,结果傻眼了,除了一些第三方的登录注册输入外,其他的元素都是不能识别的

后来查看资料,原来手游是通过unity3D渲染过的,根本无法定位

刚开始就遇到当头一棒,怎么办呢,不可能放弃吧,只有硬着头皮上。接着就开始各种查阅资料

第一个方法:

发现腾讯有一个开源的GAutomator的开源框架,这个框架可以识别gameObject,但是需要在游戏中集成WeTestSDK,这个集成就需要

找开发帮忙完成,介于开发比较忙,沟通多次也不好一直追问,而且这个框架之前没用过,也不敢保证好用,就只有换方法

第二个方法:

Robotframework+SIKULI,sikuli是一款图像识别自动化工具,据说是能一切自动化都用图像完成,不用写脚本,看着挺牛逼的。而且sikuli

还有专门的library可以导入RF中。当时感觉挺兴奋的,终于有解决的方法了,后来用起来才感觉到,真不是那么好用的,首先截图就要花

一大把时间,而且图像识别的可移植性和可用性都不是很好,还比不上坐标定位

第三个方法:

appium+坐标定位。认真分析后觉得要做的自动化变化不是很大,那就用以前做app最不喜欢的坐标定位方法来做吧


未完待续



<think>嗯,用户问的是在手机软件开发中如何实现组合键功能,需要具体的实现方法。首先,我得回忆下之前提供的引用内容。引用[1]提到了Android 9.0系统如何处理音量键和电源键的组合键,尤其是在PhoneWindowManager.java中的interceptKeyBeforeQueueing方法里处理按键事件。这可能涉及到系统级的按键拦截和处理逻辑。用户可能需要的是应用层面的实现,但系统级的例子也能提供些思路。 接下来,用户可能想知道在应用开发中,比如Android或HarmonyOS,如何监听组合键,比如同时按下音量上键和某个其他键。这时候需要考虑按键事件的监听和处理机制。在Android中,通常通过重写onKeyDown或者使用KeyEvent回调来捕获按键事件。对于组合键,可能需要记录按键的状态,比如判断是否同时按下了两个键。 然后,引用[4]提到了鸿蒙开发中的按钮布局,可能用户对鸿蒙系统也有兴趣。需要查看HarmonyOS的文档,看看他们如何处理组合键,是否有类似Android的机制。比如,使用InputEventConsumer或者其他的事件监听方式。 另外,用户可能需要知道如何区分组合键和单个按键事件,避免误触发。比如,处理延迟,判断两个按键是否在短时间内被按下。或者使用状态变量来跟踪按键是否被按住。 还可能要考虑不同平台的差异,比如Android和HarmonyOS在事件处理上的不同之处。例如,鸿蒙可能使用不同的API或者组件来处理输入事件,需要参考对应的开发文档。 另外,引用[3]提到了音乐播放器的开发,里面用到了Handler和Fragment,这可能涉及到在特定组件中处理按键事件,比如在播放界面中实现音量键和电源键的组合功能。这时候需要注意事件传递的机制,确保按键事件不会被其他组件消费掉。 还需要考虑权限问题,比如某些系统按键可能需要特定的权限才能监听,或者在后台运行时是否能捕获按键事件。比如,Android中对某些按键的限制,或者在鸿蒙中的权限设置。 可能用户还想知道如何测试组合键功能,比如在模拟器中如何模拟组合键的输入,或者真机测试时的注意事项。 最后,总结实现步骤:监听单个按键事件,记录按键状态和时间戳,判断是否满足组合键的条件(如同时按下两个键),然后触发相应的处理逻辑。同时要注意不同平台的具体实现方式和可能遇到的,比如事件冲突、权限问题等。</think>在手机应用开发中实现组合键功能主要涉及按键事件监听和状态管理两个核心环节,以下是具体实现方法和技术要点: ### 、Android平台实现方案 1. **按键事件监听** 在Activity中重写`onKeyDown()`方法实现基础监听: ```java public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getRepeatCount() == 0) { // 防止重复触发 pressedKeys.add(keyCode); checkKeyCombination(); } return super.onKeyDown(keyCode, event); } ``` 2. **组合键状态管理** ```java private Set<Integer> pressedKeys = new HashSet<>(); private static final int VOLUME_UP = KeyEvent.KEYCODE_VOLUME_UP; private static final int POWER = KeyEvent.KEYCODE_POWER; private void checkKeyCombination() { if (pressedKeys.contains(VOLUME_UP) && pressedKeys.contains(POWER)) { // 触发截屏功能(需注意系统权限限制) takeScreenshot(); } } ``` 3. **系统级拦截处理** 对于需要覆盖系统默认行为的场景(如修改截屏组合键),需修改`PhoneWindowManager.java`中的`interceptKeyBeforeQueueing()`方法[^1]: ```java case KeyEvent.KEYCODE_VOLUME_DOWN: if (isPowerKeyPressed) { // 自定义组合键逻辑 return intercepted; } break; ``` ### 二、HarmonyOS实现方案 1. **可视化按键绑定** 在XML布局中声明组合键响应: ```xml <Button ohos:keycode="volume_up+power" ohos:on_click="handleComboKey"/> ``` 2. **低代码事件处理** ```js export default { handleComboKey() { prompt.showToast({message: "组合键触发成功"}) } } ``` ### 三、关键技术要点 1. **时序控制**:设置200-300ms的时间窗口判断组合键 2. **状态清除**:在`onKeyUp()`中及时移除已释放的按键 3. **优先级处理**:使用`event.startTracking()`确保长按事件不被系统拦截 4. **跨平台差异**:Android需处理系统级拦截,鸿蒙可通过分布式能力实现跨设备组合键 ### 四、典型应用场景 1. 游戏应用的技能快捷键(如$A+B$触发必杀技) 2. 工业手持设备的应急操作组合 3. 无障碍功能的多键快捷操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值