appium + java + iOS真机环境搭建

最近开始写iOS真机UI自动化测试的项目,搭建环境过程中找来找去也没找到一个正确的教程。最后自己按照官方文档,一步步摸索出来才搭建成功。在这里记录下。注意:Windows系统无法做iOS自动化测试

环境准备

需要安装的环境(我这里只标注下我用的版本号,具体安装教程网上很多,不累述):

  1. intelliJ IDEA
  2. Java JDK(1.8.0_191)
  3. homebrew
  4. node(11.1.0)
  5. npm
  6. appium(npm安装的,1.15.1)
  7. appium desktop(安装包安装的)
  8. usbmuxd
  9. libimobiledevice
  10. ios-deploy
  11. xcode(11.2.1 )

开始配置

WDA重签名:全称WebDriverAgent, 它安装在手机端扮演一个 REST 服务的角色,接收外部 API 请求,然后传递给被测应用的原生 XCTest 调用;下面开始操作
进入WDA文件夹下,如果您的appium版本和我一样,则文件夹路径为/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent
在这里插入图片描述
执行命令:./Scripts/bootstrap.sh -d
等一会,成功后,打开我们的项目
双击它即可
在这里插入图片描述
整一个苹果账号,先选择WebDriverAgentLib,然后设置下bundle ID,这个ID可以随便设置,但是注意不要和别人重复
在这里插入图片描述
然后选择team,用个人开发者账号就行,选择完会自动生成证书
在这里插入图片描述
接下来选择WebDriverAgentRunner,也像WebDriverAgentLib一样设置,不累述
在这里插入图片描述
在这里插入图片描述
好,现在拿出你的iOS原装数据线(划重点了啊,一定要原装数据线,这个问题我调了很久。),连接上你的iPhone
在这里选择自己的手机
在这里插入图片描述
在这里插入图片描述
然后进入Product-Scheme,选择WebDriverAgentRunner
在这里插入图片描述
点击Product-Test
在这里插入图片描述
过程中可能需要输入多次电脑密码,输入即可,然后这时候会失败,需要去手机里面进行如下操作:设置——通用——描述文件与设备管理——开发者应用,信任自己对应的开发者
再次点击 “Test”,这次应该是成功的
然后在手机浏览器输入localhost:8100/status
应该展示如下,说明服务起来了
在这里插入图片描述
这时候在手机上的服务是已经起来了,我们怎么用电脑访问呢
命令行运行 iproxy 8100 8100 + UDID(真机的UDID,获取方法自行百度),iproxy是usbmuxd自带的端口转发工具,如果没有,可以自行安装
端口转发成功后,打开浏览器访问localhost:8100/status,应该会显示一个和刚才手机一样的页面。
至此,WDA重签名完成

实例

在写代码之前,我们需要知道元素的属性,如accessibility id
我们这里使用appium-desktop来获取
启动服务
在这里插入图片描述
点击这个“start inspector session”
在这里插入图片描述
接下来按照我这个设置
在这里插入图片描述
解释下各个参数的意义:
deviceName真机的名字
deviceVersion真机的系统版本号
udid真机的UDID
bundleId要打开应用的bundleId,不知道的问下APP开发
其余参数填写和我一样即可
接下来,把刚才打开的iproxy进程杀掉
点击右下角的“start session”,启动session
等一会会看到一个类似于uiautomatorviewer的界面(左边的APP界面我没截)
在这里插入图片描述
咱们需要的是accessibility id或者xpath,这个的原理和Android都是一样的,同理xpath是不推荐的,因为它慢到肉眼可见。如果没有accessibility id,可以让开发添加,只不过工程量很大,比如我们的APP,基本都没有。拿到这个accessibility id,接下来我们就可以写代码了
关于Appium 服务器初始化参数(Capability)
官网有详细介绍
我们这里用到的参数如下

DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(IOSMobileCapabilityType.XCODE_ORG_ID, "XXXXXXXXXX");
        capabilities.setCapability(IOSMobileCapabilityType.XCODE_SIGNING_ID, "iPhone Developer");
        capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhoneForAppium");
        capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
        capabilities.setCapability(MobileCapabilityType.NO_RESET, true);
        capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.IOS_XCUI_TEST);
        capabilities.setCapability(MobileCapabilityType.UDID, "XXXXXXXXX");
        capabilities.setCapability(IOSMobileCapabilityType.BUNDLE_ID, "XXXXXXXX");
        capabilities.setCapability(IOSMobileCapabilityType.WDA_LOCAL_PORT, "8100");
        capabilities.setCapability(IOSMobileCapabilityType.USE_NEW_WDA, false);
        capabilities.setCapability(IOSMobileCapabilityType.WEB_DRIVER_AGENT_URL, "http://localhost:8100");

        capabilities.setCapability(IOSMobileCapabilityType.UPDATE_WDA_BUNDLEID, "XXXXXXXX");

下面说明下各个参数的作用,未特殊说明的,和我写一样就行
IOSMobileCapabilityType.XCODE_ORG_ID:开发者团队标识符字符串,是一个十位的字符串,最简单的方式就是去xcode的这里获取
在这里插入图片描述
后面括号里面就是
IOSMobileCapabilityType.XCODE_SIGNING_ID:和我填写一样即可
MobileCapabilityType.DEVICE_NAME:你手机的名字
MobileCapabilityType.PLATFORM_NAME:和我填写一样
MobileCapabilityType.NO_RESET:在当前 session 下不会重置应用的状态。按需自己设置
MobileCapabilityType.AUTOMATION_NAME:和我一样就好
MobileCapabilityType.UDID:设备的UDID,自己查一下
IOSMobileCapabilityType.BUNDLE_ID:应用的bundle id,不知道的问下开发
IOSMobileCapabilityType.WDA_LOCAL_PORT:和我填写一样就好
IOSMobileCapabilityType.USE_NEW_WDA:是否弃用现有WDA,启动新的,咱们这里选择复用现有的
IOSMobileCapabilityType.WEB_DRIVER_AGENT_URL:若提供了 URL,Appium 将在这 URL 上连接现有的 WebDriverAgent 实例,而不是重新启动一个。和我写一样就好
IOSMobileCapabilityType.UPDATE_WDA_BUNDLEID:对WDA重签名使用的bundle id
其他基本就没什么了,new一个driver后,像Android一样操作就行了,不再累述


版权声明:本文为weixin_43557826原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。