ATX ATX 系列 - 如何测试网易游戏阴阳师 (Android 篇)

codeskyblue · 2016年10月26日 · 最后由 bianwancheng 回复于 2019年09月07日 · 204 次阅读
本帖已被设为精华帖!

这是一篇教你如何使用 AutomatorX 做游戏测的文章,当然这个自动化测试框架不限定于阴阳师,你可以参考文章提到的方法做其他游戏的测试。为了方便,后面 AutomatorX 我都简称为 ATX。

前言

突然意思到 ATX 还没有出过一篇关于游戏测试的文章,比较讽刺的是 ATX 一开始设计的时候,就是为了游戏而设计的。不多说了,赶紧开写。

看文章之前你需要会的

  • 命令行的简单操作
  • 基础的 Python

准备环境

先准备一台安卓手机,电脑上配置好 Python 环境。
根据 ATX 官方主页上的说明,把环境配置好。 https://github.com/NetEaseGame/AutomatorX

需要用到的 apk 文件直接从阴阳师的官方首页上下载 http://yys.163.com/
打开控制台,接下来我们需要分析安装包的包名以及 activity 名

$ python -matx apkparse onmyoji_netease_1.0.7.apk
{
  "main_activity": "com.netease.onmyoji.Launcher",
  "package_name": "com.netease.onmyoji"
}

接下来有请我们要介绍下有 ATX 团队最新开发的,web-ide 编辑器,有了它,脚本写起来快的可以飞起来。
安装方法参考 https://github.com/openatx/atx-webide

装完之后,cd 到工作目录。
使用命令 python -m atxweb 启动之后,浏览器会自动打开,进入到编辑器界面。如下图所示。

根据图片中的提示选择设备,切换到 Coding 标签。网页版 IDE 编辑的文件,以及截得图片,最终都会保存在 命令行启动所在的目录下。

热身

接下来就可以开始写我们的第一行代码了

import atx

d = atx.connect()
print 'start time:', d.start_app('com.netease.onmyoji', 'com.netease.onmyoji.Launcher')

代码的作用,就是启动阴阳师这个应用,顺便统计出,启动的用时

在 Screen 区域拖动选中要截取的图片。比如

截到的图片会保存到本地

继续添加代码,来用脚本跳过游戏的自动更新

d.click_image(u"确定.1920x1080.png", timeout=8, safe=True)

timeout 代表最多等待 8s,safe=True表示,即使图片没有找到也不报错

登录游戏

自动登录这部分大部分都是 UI 操作,需要用到 uiautomatorview 这个工具。在 platform-tools 这个目录下可以找到,更多的介绍可以看这篇文章:如何测试网易云音乐 (Android 篇),这里不做详细说明了。

下面直接贴出完整的进入游戏的代码

d(text='快速游戏').sibling(className='android.widget.ImageView').click()
d(text='快速游戏').click()
d.click_image(u"进入游戏.1920x1080.png") # 这个需要截图了
d(textMatches='接\s*受').click() # 因为“接受”之间可能会有空格影响

接下来需要输入角色名了,为了方便生成昵称,我们把这段代码加上去

import random, time, string
random.seed(time.time())

def id_generator(size=8, chars=string.ascii_uppercase + string.digits):
  return ''.join(random.choice(chars) for _ in range(size))

接下来,通过这几行代码完成角色的创建

d.click_image(u"random2.1920x1080.png", offset=(1.2, 0))
d.clear_text()
d(text='确定').click()
d.click_image(u"创建角色.1920x1080.png")

代码中用到了 offset,代码具体的实现的流程是,先找到图片的位置,然后向右偏移 1.2 倍的图片长度。

最后点击进入游戏

d.click_image(u'进入游戏.1920x1080.png')

先写到这里了,后面会继续补充

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 33 条回复 时间 点赞

有直接 OCR 获取游戏内的办法吗?
前几天我也在想用 OCR 来解决游戏 app 的自动遍历.

思寒_seveniruby 将本帖设为了精华贴 10月26日 10:55

加精理由: 提供了游戏自动化的一种测试思路. 感谢网易 QA 的贡献.

#1 楼 @seveniruby 还没空搞,不过就目前的技术而已,是可以实现的

#4 楼 @codeskyblue 也就是目前的 d(text='xxx') 是调用 uiautomator 对吧.

#5 楼 @seveniruby 不是,是用 OCR 技术,识别出界面上所有问题出现的位置和内容

#1 楼 @seveniruby OCR 的识别率是关键,目前很难保证到 100%,而且 OCR 基本上都是基于截图的,清晰度和效率也是一个冲突。

学习了

学习了 之前用 uiautomatorviewer 查看游戏(保卫萝卜什么的)的界面,基本啥元素都定位不到

#8 楼 @heyyuyu 好伤心,竟然里面没有提到 AutomatorX

#10 楼 @jamesparagon 保卫萝卜是游戏,本来就没什么图层

不错的分享,是可以识别,只是执行时比较慢。还可以使用 SeeTestAutomation 录制后转换出来,用其他的测试

#13 楼 @jiazurongyu seetest 是啥?

想自己写个脚本,不用那么肝了,还得好好学

和 sikuli 差不多吧,以前用 sikuli 做过 andriod 的游戏测试

一直在关注!希望越做越好!😀 😀 😀

感谢分享 回去下载个试试 :)

OCR 是个好东西;

写脚本练狗粮去了

webide 启动后界面是错乱的,左边菜单点击没反应。 求解 TAT

正在玩游戏,发现了这篇好文章

感觉 sikuli 用起来更简单,我也写了一个脚本干狗粮。😁

有 iOS 端测试的吗?

#23 楼 @sai3300 原理是一样的,ios 端需要使用 WDA:https://github.com/facebook/WebDriverAgent

unity 游戏支持吗?有什么办法

不同分辨率的手机需要分别截图吗?比如我在 iPhone5S 上截得图能测 iPhone6 吗?

—— 来自 TesterHome 官方 安卓客户端

Stepthen 回复

暂时不能

每次运行一直提示 adb is not working 怎么办啊!

codeskyblue ATX 资料快速索引 中提及了此贴 06月21日 11:39

我安装了 1.2.1 的 ATX 之后链接就会报错提示
Traceback (most recent call last):
File "E:/python�ű�/BesideM/12333.py", line 3, in
d = atx.connect()
File "C:\Python27\lib\site-packages\atx_init.py", line 83, in connect
c = cls(connect_url, **kwargs)
File "C:\Python27\lib\site-packages\atx\drivers\android.py", line 95, in __init
_
self.uiauto.healthcheck(unlock=False)
File "C:\Python27\lib\site-packages\uiautomator2__init
_.py", line 460, in healthcheck
raise RuntimeError("Uiautomator started failed.")
RuntimeError: Uiautomator started failed.

然后我退回 1.1.2 版本的 ATX。启动软件可以成功,但是用图片定位时会提示
IOError: uiautomator start failed: Warning: This version of UI Automator is deprecated. New tests should be written using
UI Automator 2.0 which is available as part of the Android Testing Support Library.
See https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html
for more details.
INSTRUMENTATION_RESULT: shortMsg=java.lang.IllegalStateException
INSTRUMENTATION_RESULT: longMsg=UiAutomationService android.accessibilityservice.IAccessibilityServiceClient$Stub$Proxy@1165e8calready registered!
INSTRUMENTATION_CODE: 0

大佬,请问一下,我安装好了 ATX,但是运行 python -m atxweb 或 python -m weditor 会无法连接上设备,adb forward --list 会失败,请问要怎么解决呢;
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\weditor_main.py", line 242, in post
d = u2.connect(device_url)
File "C:\Python27\lib\site-packages\uiautomator2__init
.py", line 159, in connect
return connect_usb(addr)
File "C:\Python27\lib\site-packages\uiautomator2__init
_.py", line 187, in connect_usb
lport = adb.forward_port(7912)
File "C:\Python27\lib\site-packages\uiautomator2\adbutils.py", line 71, in forward_port
forwards = self.forward_list()
File "C:\Python27\lib\site-packages\uiautomator2\adbutils.py", line 59, in forward_list
output = self.execute('forward', '--list')
File "C:\Python27\lib\site-packages\uiautomator2\adbutils.py", line 31, in execute
raise e
CalledProcessError: Command 'adb -s G2W7N15510006993 forward --list' returned non-zero exit status 1

执行"d = atx.connect()
d.click_image("同桌游戏.1080x1920.png", timeout=8, safe=True)"

OSError: Image format error: .\同桌游戏.1080x1920.png
sys:1: ResourceWarning: unclosed

YuanYu 回复

一直没精力处理这个问题

wolfgao 移动客户端 /UI 开源测试框架梳理和大比拼 中提及了此贴 02月27日 13:03

Traceback (most recent call last):
File "D:\Program Files\python\lib\runpy.py", line 193, in run_module_as_main
"
main", mod_spec)
File "D:\Program Files\python\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "D:\Program Files\python\lib\site-packages\atxweb__main
_.py", line 6, i
n
from atxweb import server
File "D:\Program Files\python\lib\site-packages\atxweb\server.py", line 32
print "AutomatorX not installed! Please run pip install --upgrade atx"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Automat
orX not installed! Please run pip install --upgrade atx")?

一直报上面的错,运行 pip install --upgrade atx 后,还是报错

请问 atx 有类似 find_elements() 的方法吗?比如获取一个 div 下的所有 span 标签的 element 元组

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