感谢论坛上各位大神的技术贴,简单地使用 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
大家一起努力吧💪!
可以用浏览器控制台看看日志,看看前端的代码 remot.html,里面有一个 convertPosition 的方法,可以加一些日志信息调试看看。一年多没有维护这个项目了,还存在不少问题可能得自己解决哦!
来个视频_,另外你 GITHUB 上的 README 格式需要改下
楼主 你又获取手机的 xml 么 source 这个 这个接口好慢差不多要 5 秒 看你的平均一个操作也就 1-2 秒
仔细看了下你的代码 原来你是通过坐标来实现所有的操作的 挺好的 这样性能确实会快很多
但是我现在做的步骤是获取 xml,获取鼠标点击坐标然后根据 xml 获取当前元素的所有属性 id,name 啥的
然后调用 findelement 获取 elementid 继续操作 因为我们这边的自动化写作人员 需要知道这些 然后自动填入
控件库
我之前也看过这个 我现在做的比这个的功能要多 而且这个项目的关于元素的定位有点问题
WDA 在获取 source 的时候实在是太慢了 但是 xctestwd 很快 所以我现在选的 xctestwd
非常感谢
有兴趣的话一起维护这个项目呀,帮忙加一下元素定位页面进来- 3-
碉堡了,马了去实践下!
你这个可以输入中文么 老哥
这里给出两种解决办法 我写到 csdn 上了
1.http://blog.csdn.net/zy841958835/article/details/77371183 第 3 点 这是我第一次尝试
两者的编程语言不一样(所以性能不一样)接口都差不多 主要是请求的 url 有点区别 差别不太大
还有一个就是 xctestwd 默认是没有 session 可以建立一个不依赖 app 的 session
XCTestWD 的接口跟 WDA 一样吗?有啥区别?
楼主,这个怎么加入多台手机?
感觉这个项目可以用在 ios 手游上的测试,之前在安卓平台搭建过类似程序
试过 ios-minicap 不能支持多台手机,断线重连没有做哦!基本上 ios-minicap 增加一定的延时之后稳定性还行,运行几个小时没问题。
可以连上手机,HOME 有效,可以用 BUNDLE ID 打开 APP 其它的就不能用,是什么原因,怎么解决呀大神
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)
你好,这个运行一段时间项目就会不知原因的中断,无法响应点击事件。请问是否哪里需要设置呢?还是本身系统就不够稳定?谢谢~
iOS_remote/src/main/resources/execWDA.sh
你改下这个文件,手动执行下看能启动起来吗
提示我 wda 没运行起来
你好,这个目录我改动过了,就是将目录替换成 appium 的 wda 所在路径。现在就是运行一段时间之后,我再点击就无法响应提示我 wda 不在运行。所以我怀疑是不是需要哪里进行设置,才能稳定。您有中途运行突然断开的情况吗?
可能真的是 WDA 稳定性有问题,更新下 Xcode,还有用 WDA github 上最新代码试试吧。
另外是不是设备锁屏了?也会导致 WDA 停掉的。
请问一下大师们,我的 ios_remote 界面一直不管我怎么点击,都是只会点 Find the Window at {{0.0, 0.0}, {414.0, 736.0}}
WDA 已经更新到最新版本,home button 和 文本输入 都能运作。电话是 iphone7+, 有任何解决方法吗?
还不行啊,一起来维护呀~~ 问题还是很多的,需要大家的力量!
Xcode9 支持了吗?
你做的这个是录制功能吧,这个我感觉用处也不是太大~~