iOS 测试 iOS-remote 安装篇之 iOS-remote 安装使用完全指南

烟消云散 · 2017年10月16日 · 最后由 ZhiningHe 回复于 2020年11月27日 · 7646 次阅读
本帖已被设为精华帖!

iOS-remote 使用指南

简介

iOS-remote 是结合WebDriverAgentios-minicap 开源项目做出来的基于 JAVA 的 iOS 远程真机控制的项目。

平台

仅限 Mac 使用

特点

  • [√] 启动项目时运行 iproxy
  • [√] 为 WDA 服务创建 http 代理
  • [√] 添加缺失的索引页
  • [√] 支持包管理 API
  • [√] 支持 WDA 运行
  • [√] iOS 远程真机控制
  • [√] 基于 Java 开发

功能

  • [√] iOS 远程真机控制(点击拖拽)
  • [√] HOME 键功能
  • [√] iPhone 输入框添加文字(中英文 -- 中文还在修复中)
  • [√] 设备信息显示
  • [√] 从本地安装 ipa 文件到 iPhone 真机里
  • [√] 卸载已安装 APP
  • [√] 截图功能

安装要求

  • 用 brew 安装 libjpeg-turbo (要求版本 1.5 及以上)
  • Xcode (要求版本 8 及以上,注:9 有一定无法使用的风险)
  • cmake(最好通过 brew 安装)
  • OS X Yosemite (要求版本 10.9 及以上)
  • iOS(要求版本 8 及以上)
  • Lightning cable. 查看设备列表.
  • Carthage 获取所有依赖项
  • npm建立 Inspector bundle
  • Eclipse IDE for Java EE Developers
  • JavaSE (要求版本 1.6 及以上)
  • Tomcat (要求版本 7 及以上)
  • libimobiledevice
  • ideviceinstaller
  • usbmuxd

其他帮助文档

How to install ios-minicap

How to install WebDriverAgent

WebDriverAgent Q&A

Eclipse Import Maven Project

Configure Tomcat9 In Mac

安装

1、安装 Xcode

Xcode 这个可以去官网安装或者去我的网盘下载 Xcode8.3.3.xip

链接:http://pan.baidu.com/s/1hszRESW 密码:yogw

下载好 Xcode,还要下载 Command Line Tools

  1. 打开 mac 终端
  2. 在终端中输入以下命令:xcode-select --install ,按回车。

然后一路点确定安装即可

详情可见:http://blog.csdn.net/yxys01/article/details/73456973

2、安装 Homebrew

Homebrew 的安装很简单,只需在终端下输入如下指令:

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew 安装成功后,会自动创建目录 /usr/local/Cellar 来存放 Homebrew 安装的程序。 这时你在命令行状态下面就可以使用 brew 命令了.

详情可见:http://blog.csdn.net/yxys01/article/details/77452318

3、安装 node 和 npm

直接打开终端输入如下指令:

$ brew install node

执行完上面的命令,你就安装好了 nodejs 和 npm

4、安装前准备工作

(1) 需要安装 usbmuxd 以便于通过 USB 通道测试 iOS 真机,不需要测试真机则不用安装

$ brew install usbmuxd

(2) 请安装 carthage 来构建 WebDriverAgent.

$ brew install carthage

(3) 安装 libimobiledevice 和 ideviceinstaller

$ sudo brew update
$ sudo brew install libimobiledevice
$ sudo brew install ideviceinstaller

5、安装 ios-minicap

(1) 打开终端,clone 该项目:

$ git clone https://github.com/openstf/ios-minicap 

(2) 安装 libjpeg-turbo

$ brew install libjpeg-turbo 

(3) 安装 cmake

$ brew install cmake

(4) 启动 ios-minicap

详情可见:http://blog.csdn.net/yxys01/article/details/76442135 或者 https://testerhome.com/topics/10456

6、安装 WebDriverAgent

安装步骤详情可见:https://testerhome.com/topics/10463

(1) 打开终端,clone 该项目:

$ git clone https://github.com/facebook/WebDriverAgent

(2) 运行初始化脚本

$ cd /Users/yourname/WebDriverAgent

$ mkdir -p Resources/WebDriverAgent.bundle

$ sh ./Scripts/bootstrap.sh

该脚本会使用 Carthage 下载所有的依赖,使用 npm 打包响应的 js 文件

执行完成后,直接双击打开 WebDriverAgent.xcodeproj 这个文件。

(3) 安装中遇到一些问题,解决方案可见:

http://blog.csdn.net/yxys01/article/details/77045359

7、安装 iOS-remote

(1) 打开终端,clone 该项目:

$ git clone https://github.com/weamylady2/iOS_remote

or

$ git clone https://github.com/yxys01/iOS_remote

(2) 在 Eclipse 中打开 iOS_remote

打开 Eclipse

Import->Maven->Existing Maven Projects->Next->Browse(iOS_remote's path)->Finish

更改 iOS_remote 中的一些设置

Java Resources->src/main/resource->config.properties

在 config.properties 中改三个参数:minicapPath、wdaPath、bashPath

minicapPath=/Users/yourname/ios-minicap-master
wdaPath=/Users/yourname/WebDriverAgent
bashPath=/Users/yourname/ios_remote/src/main/resources
wdaPort=8200
minicapPort=12345

(3) 重新构建 ios-minicap

为了减少 MAC 的压力,我们需要减少从 minicaps 中发送 imgs 的频率。

在 ios-minicap 的文件夹中,编辑 src/minicap.cpp

添加一个方法:

static void sleep_ms(unsigned int secs)
{
struct timeval tval;
tval.tv_sec=secs/1000;
tval.tv_usec=(secs*1000)%1000000;
select(0,NULL,NULL,NULL,&tval);
}

然后在 main 中添加sleep_ms(50);

while (gWaiter.isRunning() and gWaiter.waitForFrame() > 0) {
client.lockFrame(&frame);
encoder.encode(&frame);
client.releaseFrame(&frame);
putUInt32LE(frameSize, encoder.getEncodedSize());
if ( pumps(socket, frameSize, 4) < 0 ) {
break;
}
if ( pumps(socket, encoder.getEncodedData(), encoder.getEncodedSize()) < 0 ) {
break;
}
sleep_ms(50);
}

重新构建 ios-minicap, 运行build.sh在 ios-minicap 文件夹中:

$ ./build.sh 
mkdir: build: File exists
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/waterhuang/Downloads/ios-minicap-master/build
[100%] Built target ios_minicap

8、运行 iOS_remote

(1) 新建一个终端,打开 iproxy

$ iproxy 8200 8100

(2) 再打开一个终端

$ cd /Users/yourname/iOS_remote
$ mvn tomcat7:run-war

(3) 打开浏览器,输入网址:http://localhost:8080/ios/ 即可

iOS-remote 安装篇

iOS-remote 安装篇之 ios-minicap 安装使用完全指南

iOS-remote 安装篇之 WebDriverAgent 安装使用完全指南

iOS-remote 安装篇之 iOS-remote 安装使用完全指南

参考文献

iOS-minicap + WDA 实现 ios 远程真机测试 https://testerhome.com/topics/10262
基于 WebDriverAgent 的 iOS 远程控制 https://testerhome.com/topics/8890
iOS 远程真机 (仅限屏幕查看) https://testerhome.com/topics/6470
WebDriverAgent 简介 https://testerhome.com/topics/4904
iOS 真机如何安装 WebDriverAgent https://testerhome.com/topics/7220
WebDriverAgent 天坑记 https://testerhome.com/topics/9666
STF 框架之 minicap 工具 https://testerhome.com/topics/3115

致谢

@codeskyblue
@weamylady

欢迎使用以及提出宝贵意见

@seveniruby
@Lihuazhang
@xdf
@chenhengjie123

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 36 条回复 时间 点赞
烟消云散 iOS 远程真机实现讨论帖!! 中提及了此贴 10月16日 18:44
思寒_seveniruby 将本帖设为了精华贴 10月16日 23:39

其实有试用 XCTestWD,可见该帖:https://testerhome.com/topics/10334

目前已加入了: App 安装、App 卸载、设备信息显示、截图等功能。
我们急需一个前端来帮忙美化页面 TAT...
GitHub: https://github.com/weamylady2/iOS_remote

匿名 #38 · 2017年10月17日

$ iproxy 8200 8100 这个也可以在 java 端做
如果一台 mac 连接多台手机 有两处地方需要修改
目前我在做的时候还遇到一个问题就是 就算停掉了启动 wda 的那个进程 127.0.0.1:8100/status 仍然能返回结果造成的影响就是再次启动 wda 报错 尝试在新建 wda 的时候获取到进程 id 然后再次启动之前杀掉这个进程 结果仍然是无效 不知道哪位大神遇到过

kill -9 $(ps -ef|grep xcodebuild |awk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')
我用这个 kill 掉 WDA 之后可以重新启动,没有问题哦!
ios-minicap 貌似不支持多台手机连接,所以无法一台 mac 接多台电脑,

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

有个问题 object-c 怎么读取 xcode 的 user-defined 选项中的某个值呀

不懂,你要问问这个大神:@codeskyblue

匿名 #12 · 2017年10月17日
water 回复

@codeskyblue 求不吝赐教

我 oc 只停留在看懂的阶段

匿名 #14 · 2017年10月17日
codeskyblue 回复

翻阅苹果文档中。。。

不错呀,这两天抽空搭建一下试试。

另外,如果正文能加上演示的 gif 动图会更直观哦。

@yxys01 楼主大大,用 mvn tomcat7:run-war 这个启动项目很慢很慢,一直在下载 maven 依赖插件咋的,而且还下载失败了 build failure 了;
所以我换成自己下载一个 tomcat7,然后将 ios.war(配置修改后打成 war) 放到 webapps,启动 tomcat,端口改为 28080
但是,页面打开有点问题

ios-minicap 已经能正常截图展示了!WebDriverAgentRunner 已经装上手机了!

蓝蓝 回复

请同步最新 github 上面的代码哦!https://github.com/weamylady2/iOS_remote

water 回复

最新代码也是一样,手机页面展示不出来,已经等待几分钟了

我是打成 ios.war,然后打开地址是http://localhost:28080/ios/ios/ios.html
0:0:0:0:0:0:0:1 - - [26/Oct/2017:13:58:37 +0800] "GET /websocket HTTP/1.1" 404 -
0:0:0:0:0:0:0:1 - - [26/Oct/2017:13:58:37 +0800] "GET /fonts/glyphicons-halflings-regular.woff HTTP/1.1" 404

蓝蓝 回复

wda 没启动起来吧。。。现在 index 入口是 remote.html,过段时间会重构代码,弄完 web 页面后我会重新写一下指南

蓝蓝 回复

你重新 git Clone 一下吧,有些代码没有更新下来。

烟消云散 回复

wda 我再看下哪里不对;期待你的优化😀

water 回复

git clone 好久才下下来,我再试一下吧,谢谢

23楼 已删除

iPhoneX 只有一台,需要共用,终于抽出时间搭建起来了。

非常感谢楼主的辛勤劳动和开源精神,iOS 远程控制一直都是一个空白的区域,虽然有不少商业方案,技术工具也比较丰富,但做到一站式且开源的仅此一家。

文档写得很细,过程中基本上按照文档走就行了。不过还是有些小坑,在此分享下解决方法:

  1. 如果按文中要求使用 WDA 仓库内容,有很大可能会由于没有配置好开发者账户导致 wda 启动失败。建议增加这方面的说明,或者让大家都去使用 appium 自带的 WDA
  2. 修改端口号略为不便,在代码中、pom 文件中均需要同步调整对端口的定义。建议把配置统一至一处。
  3. 点击事件坐标获取存在 bug ,永远获取到的都是 0,0 。已提交 pr :https://github.com/weamylady2/iOS_remote/pull/16
  4. clone 耗时较长,原因是 git 提交历史有 37M 大,建议通过 rebase 消除掉以往一些不需要的提交历史,缩短 clone 时间。

你一台 mac 连接多机,根据 uuid 来控制不同的手机,实现了么

匿名 #26 · 2018年04月10日
heygrl 回复

嗯 早已实现了

怎么实现的,获取图像部分是用的 ios_minicap 吗?

@yxys01
1、initWDA 方法中,desiredCapabilities 中 bundleId:com.apple.Preferences,是否只能操作 “设置” 和其他系统自带的应用,能否实现第三方应用间的跨应用操作?
2、如可以跨应用,大神有没有出现过 minicap、wda 启动都没有问题,从桌面点开应用后,该应用内的按钮点击了没反应。我这里启动 10 次,有 50% 左右的概率出现打开应用后,点击控件坐标无响应。

匿名 #24 · 2018年06月25日
heygrl 回复

是自己调用的 WDA 的 restful 接口

运行过程中 页面会花屏 大家都遇到过吗?求解决,一直报错
@yxys01
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)

仅楼主可见

@pliue 能请教一些问题么 关于一台 mac 连接多个 iPhone 的

执行 mvn tomcat7:run-war, 出现下面依赖下载不到的问题:
[WARNING] Failed to retrieve plugin descriptor for org.mortbay.jetty:iOS_remote:8.1.8.v20121106: Plugin org.mortbay.jetty:iOS_remote:8.1.8.v20121106 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.mortbay.jetty:iOS_remote:jar:8.1.8.v20121106

35楼 已删除

你好,请问怎么自定义 localhost 的 web 页面?想自定义一些控制可以吗?

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

能否提供一下远程控制多台 iPhone 设备的教程?谢谢

为什么总是报这个错误。难道我下载 iOS_remote 的文件少了吗?烦请指点一二。万分感谢。

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

请问楼主你们是如何实现连接多机的?

楼主,你这架构支持 Xcode10.3 吗?

非常感谢楼主的分享,给我涨了见识,谢谢。

sunguangshou 回复

大佬有没有解决,遇到了同样的问题 谢谢🙏

请问 clone 的代码,这里一直飘红,还提示 httppost 里没有 getconfig 方法,是什么原因呢?求告知~~~十分感谢

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