iOS 测试 iOS-minicap + WDA 实现 ios 远程真机测试

water · 2017年09月26日 · 最后由 water 回复于 2019年01月18日 · 4642 次阅读
本帖已被设为精华帖!

感谢论坛上各位大神的技术贴,简单地使用 ios-minicap+wda 实现了 ios 远程真机功能,使用效果还不错,尤其是 minicap 的回显真是非常爽!wda 的速度跟 mac、iOS 配置也有关系。
wda 操控部分参考了论坛大神 @codeskyblue 的帖子:
https://testerhome.com/topics/8890
ios-minicap 的解析参考了易寒大神 @DoctorQ 的帖子:
https://testerhome.com/topics/3115

效果看动图:

实现技术使用的是 JFinal+Tomcat+WebSocket,数据库暂时没有用到,期待大家一起来完善这个项目。
另外感谢 @yxys01 进行了试用并发现了不少的坑,帮助写了个有逼格的 README。

Github 地址:
https://github.com/weamylady2/iOS_remote

配置步骤 (By: @yxys01 ):
https://github.com/weamylady2/iOS_remote/blob/master/README.md

大家一起努力吧💪!

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

来个视频_,另外你 GITHUB 上的 README 格式需要改下

codeskyblue 回复

用啥工具录屏啊?我不会弄哦

codeskyblue 回复

README 改了,视频不知道用啥工具 TAT

water 回复

LICEcap

codeskyblue 回复

好了👌

匿名 #6 · 2017年09月26日

楼主 你又获取手机的 xml 么 source 这个 这个接口好慢差不多要 5 秒 看你的平均一个操作也就 1-2 秒

匿名 #7 · 2017年09月26日

仔细看了下你的代码 原来你是通过坐标来实现所有的操作的 挺好的 这样性能确实会快很多
但是我现在做的步骤是获取 xml,获取鼠标点击坐标然后根据 xml 获取当前元素的所有属性 id,name 啥的
然后调用 findelement 获取 elementid 继续操作 因为我们这边的自动化写作人员 需要知道这些 然后自动填入
控件库

恒温 将本帖设为了精华贴 09月26日 13:49

你做的这个是录制功能吧,这个我感觉用处也不是太大~~

匿名 #10 · 2017年09月26日
water 回复

主要是 自动化编写人员 要知道对应的控件属性 不然他也写不鸟用例 所以只能牺牲一点性能

匿名 #12 · 2017年09月26日
water 回复

我之前也看过这个 我现在做的比这个的功能要多 而且这个项目的关于元素的定位有点问题
WDA 在获取 source 的时候实在是太慢了 但是 xctestwd 很快 所以我现在选的 xctestwd
非常感谢

water #13 · 2017年09月26日 Author

有兴趣的话一起维护这个项目呀,帮忙加一下元素定位页面进来- 3-

匿名 #14 · 2017年09月27日
water 回复

可以呀 但是如果要获取元素的话 那么就要获取手机的 xml wda 这块比较慢 严重的影响性能

碉堡了,马了去实践下!

匿名 #16 · 2017年09月29日

你这个可以输入中文么 老哥

water #17 · 2017年09月29日 Author

还不行啊,一起来维护呀~~ 问题还是很多的,需要大家的力量!

匿名 #18 · 2017年09月29日
water 回复

这里给出两种解决办法 我写到 csdn 上了
1.http://blog.csdn.net/zy841958835/article/details/77371183 第 3 点 这是我第一次尝试

water #19 · 2017年09月29日 Author

XCTestWD 的接口跟 WDA 一样吗?有啥区别?

匿名 #20 · 2017年09月29日
water 回复

两者的编程语言不一样(所以性能不一样)接口都差不多 主要是请求的 url 有点区别 差别不太大
还有一个就是 xctestwd 默认是没有 session 可以建立一个不依赖 app 的 session

water #21 · 2017年09月29日 Author

Xcode9 支持了吗?

匿名 #22 · 2017年10月09日
water 回复

wda 据说已经支持了 xctestwd 应该也支持了 不过我现在还没有升级 xcode

楼主,这个怎么加入多台手机?

感觉这个项目可以用在 ios 手游上的测试,之前在安卓平台搭建过类似程序

water #28 · 2018年01月30日 Author
zhangbp 回复

我们没有手游的需求~所以没试过哦。

water 回复

亲, 你们有没有一台控制多台终端的尝试? 心跳包怎么处理的? 有没有断线重连?

water #30 · 2018年01月31日 Author
zhangbp 回复

试过 ios-minicap 不能支持多台手机,断线重连没有做哦!基本上 ios-minicap 增加一定的延时之后稳定性还行,运行几个小时没问题。

可以连上手机,HOME 有效,可以用 BUNDLE ID 打开 APP 其它的就不能用,是什么原因,怎么解决呀大神

water #32 · 2018年04月12日 Author
LHY 回复

好像遇到过,应该是 session id 没有及时更新?你看看网页有没有报错,另外看看 WDA 的日志有没有收到命令。

XCODE 中的 WDA 的日志可以收到命令,就是可以拿到手机的 IP,那 session id 在哪里更新

我有个疑问,就是进入设备详情才开始启动 wda,minicap,能不能在项目启动的时候事先启动这个,这样进入设备详情以后是不是会快一些

项目不错,除了卡之外。。

执行过程中报如下错,wda 很不稳定 ,总是中途退出,有解决办法吗
org.apache.http.NoHttpResponseException: localhost:8200 failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:124)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at com.demo.ios.HttpClientUtil.sendHttpPost(HttpClientUtil.java:138)
at com.demo.ios.HttpClientUtil.sendHttpPostJson(HttpClientUtil.java:349)
at com.demo.ios.IosController.tap(IosController.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:82)
at com.demo.ios.WebSocketHandler.handle(WebSocketHandler.java:25)
at com.demo.ios.WebSocketHandler.handle(WebSocketHandler.java:25)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:73)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)

water #37 · 2018年07月25日 Author
妞妞 回复

1,看看是否手机锁屏了,把锁屏时间设置成永不
2,用最新的 Xcode 和 WDA 版本,ios 系统也可以考虑升级。

simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44

你好,这个运行一段时间项目就会不知原因的中断,无法响应点击事件。请问是否哪里需要设置呢?还是本身系统就不够稳定?谢谢~

water 回复

更新后好了 ,有木有多设备控制的方案呢?

water #41 · 2018年12月17日 Author
XiMouQiu 回复

嗯,应该是 WDA 断开了,这个需要修改下源码,加一下超时时间的参数。

water #42 · 2018年12月17日 Author
妞妞 回复

多设备控制,你们自己写就好了,用其它的截图方案,minicap 现在只支持一台。

water 回复

好的,谢谢~

water 回复

你好,我查看了 wda 的工程,没找到具体更改的地方,可以指导一下吗?谢谢~

water #45 · 2018年12月18日 Author
XiMouQiu 回复

点不到的时候,你有 WDA 的日志吗


提示我 wda 没运行起来

water 回复


提示 WDA 未运行起来。我这个 WDA 是运行 appium 目录下的 wda 的。

water #48 · 2018年12月18日 Author
XiMouQiu 回复

iOS_remote/src/main/resources/execWDA.sh
你改下这个文件,手动执行下看能启动起来吗

water 回复

你好,这个目录我改动过了,就是将目录替换成 appium 的 wda 所在路径。现在就是运行一段时间之后,我再点击就无法响应提示我 wda 不在运行。所以我怀疑是不是需要哪里进行设置,才能稳定。您有中途运行突然断开的情况吗?

water #50 · 2018年12月18日 Author
XiMouQiu 回复

可能真的是 WDA 稳定性有问题,更新下 Xcode,还有用 WDA github 上最新代码试试吧。
另外是不是设备锁屏了?也会导致 WDA 停掉的。

water 回复

OK,谢谢~设备设置了不息屏,xcode 已经是 10.1 版本的了。我试试看 wda 的 git 最新代码。谢谢~

simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08

请问一下大师们,我的 ios_remote 界面一直不管我怎么点击,都是只会点 Find the Window at {{0.0, 0.0}, {414.0, 736.0}}

WDA 已经更新到最新版本,home button 和 文本输入 都能运作。电话是 iphone7+, 有任何解决方法吗?

可以用浏览器控制台看看日志,看看前端的代码 remot.html,里面有一个 convertPosition 的方法,可以加一些日志信息调试看看。一年多没有维护这个项目了,还存在不少问题可能得自己解决哦!

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册