最近因为工作需要进行了mac系统下的ios真机自动化测试环境搭建,踩了很多坑,还好最后跑通了。
真机连接效果如下:
设备和主要的软件版本如下:
iphone xs 12.3.1;mac os 10.14.5;xcode 10.2.1;appium-desk 1.13.0;appium 无界面版 1.14.0; node.js 10.16.0;python3.7;JDK12.0.2 。
友情提示:建议每一条命令前添加sudo进行授权,避免permission deny 造成安装失败。
环境搭建
JDK安装
去oracle官网https://www.oracle.com/technetwork/java/javase/downloads/index.html
下载JDK,下面两个都可以,下载需要注册账号。
下载完成后无脑下一步下一步就好。
详细步骤可参考https://www.cnblogs.com/52py/p/8065066.html
安装配置完成后在终端输入 java -verison 如果出现java version "12.0.2" 2019-07-16 字样说明安装成功。
brew
安装homebrew:homebrew 简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,类似于pip、apt-get、yum等神器。
安装命令
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
node.js
可用两种方法安装
1 官网下载后按照提示进行安装
https://nodejs.org/zh-cn/
2 使用brew命令安装
brew install node
安装完成后在终端输入 node -v 如果出现 类似v10.16.0 字样说明安装成功。
依赖插件ibimobiledevice、carthage、ios-deploy、xcpretty
brew install libimobiledevice --HEAD
brew install carthage
npm install -g ios-deploy
gem install xcpretty
Xcode
推荐在App Store中安装,软件一共6.5G左右,请保持网络畅通。
Appium
appium是手机和pc之间的代理服务器,完成两者的通信处理。(没错,它就是个中间商)
appium-desk版本可在官网下载安装http://appium.io/downloads.html
appium-server 无界面版使用npm命令安装,但鉴于部分资源被墙,建议使用淘宝镜像。
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install -g appium #appium@1.13.0可指定安装版本
安装appium-doctor检查appium环境。
cnmp install -g appium-doctor
终端运行appium-doctor --ios
若提示xcode未安装在终端运行命令,设置xcode路径。
xcode-select –switch /Applications/Xcode.app/Contents/Developer
参考http://blog.sina.com.cn/s/blog_68f262210102uz5y.html
WebDriverAgent (wda)
之前查阅了很多资料,说的是appium自带的wda有问题,无法使用inspector进行页面元素定位,但我决定使用appium-desk进行定位就没有单独去下载GIthub上的wda-master。
- 首先是桌面版的wda
- 文件路径:
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent
在终端cd到上述目录,运行命令安装依赖。
./Scripts/bootstrap.sh
安装完成后点击mac右上角的聚焦搜索,粘贴路径敲击回车。
-
右键通过Xcode打开.xcodeproj文件。
- 首先打开Xcode-performance-account登录你的AppleID (我用的公司开发者账户,如果你是个人账户你就百度解决证书的问题)
-
在wdaLib General设置中选择自动签名,选择你的公司team。bundleid 是APP的唯一标识符,直接问开发获得。
确认 wdaLib build setting 中deployment系统的版本
packaging 中的project bundleid 和之前填写的是否一致。
signing签名是否正确
-
在wdaRunner General中设置自动签名,如果报错提示 Try again ,不要着急,先设置build setting。
检查build setting中packaging 的bundleid是否正确
设置签名
-
连接上你的水果机,Scheme选择wdarunner,destination选择你的真机。
-
点击左上角三角形进行构建,首次构建可能会要求你输入访问钥匙的密码,输入你的账户密码即可(我输入的是开机密码),提示build succeeded。然后点击-product-test进行将wda安装到真机。安装完成后在真机的safari浏览器输入 127.0.0.1:8100/status 显示如下则表示安装成功。
- 打开appium-desk ,设置ip端口号,一般保持默认即可,如果你已经开启了无界面版的appium-sever,就把端口修改和前者不同即可,高级设置也保持默认状态,点击start server 开启appim服务。
(mac系统与windows不同,只能打开一个appium-desk,所以你要同时做多台真机的测试那就必须要安装无界面的appium-sever。)
服务开启成功的界面如下图,右上角的三个方框的含义分别是:建立inspector session(用于获取真机页面元素);导出appium运行日志;关闭appium服务。
点击右上角的小问号按钮,弹出连接窗口,填入对应参数,参数具体含义可见
appium接口参数(推荐使用google浏览器,鼠标右键可翻译页面内容)
-
参数填写完成后点击右下角start session 手机上点击信任此电脑,并且开启设置-开发者-enable ui automation ,转跳到爱的魔力转圈圈界面,第一次连接的时间可能会很长。
- 无界面版的appium wda安装
无界面相对桌面版的优势是:可以多开;占用更少的资源;启动更快。
如果已经获取了页面元素就建议使用无界面版跑测试脚本。
路径/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent
同上,cd到目录执行命令后使用xcode构建。
./Scripts/bootstrap.sh
如果之前安装过appium-desk的wda ,xcode会卸载后重新安装,安装过程中如果提示application install failed 就手动卸载真机上的wda。
敲黑板
安装谁的wda就用谁去连接真机。
比如说:我通过xcode构建了appium-desk版的wda到真机上,那么我就只能通过desk版去连接真机,不能通过无界面appium+python连接!
Python
mac 系统自带python2,可通过官网下载并安装python3,在终端输入python3进入python IDE说明安装成功。
pip
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能,目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。
你可以通过以下命令来判断是否已安装:
pip3 --version
安装成功提示如下
如果提示c'ommand not found可以通过如下命令安装
sudo easy_install pip
appium-python-client
appium-python-client 是让 python 连接 appium 服务的一个驱动,也就是一个 python 语言封装和 appium api 通讯的一个库。
安装方法:
pip install Appium-Python-Client
验证:
引入webdriver模块不报错。
测试脚本
至此我们的ios测试环境已经部署的差不多了,接下来就用脚本进行测试吧。
- 通过xcode给真机构建wda
- 启动appium服务(有无界面版均可)
- 编写脚本,通过入口参数连接至appium
- 执行脚本
# coding=utf-8
from appium import webdriver
import time
class Appium:
# 启动app
def __init__(self):
desired_caps = {}
desired_caps['platformName'] = 'iOS' # 设备系统
desired_caps['platformVersion'] = '12.3.1' # 设备系统版本
desired_caps['deviceName'] = 'WANG的 iPhone' # 设备名称
desired_caps['bundleId'] = 'com.xxx.xxx' # 测试app包名
desired_caps['udid'] = 'xxxxxx-xxxxxxxx' #设备id
desired_caps['automationName'] = 'XCUITest' # 测试框架
desired_caps['noReset']='true' # 保留app的登录状态
desired_caps['xcodeSigningId']='iOS Developer'
desired_caps['xcodeOrgId']='aaaaa' # 团队id
desired_caps['newCommandTimeout']=3600
self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 保持端口号和appium服务端口一致
# 使用隐式等待或者显示等待,尽量减少time.sleep强制等待的使用提高脚本执行速度。
self.driver.implicitly_wait(5)
def test(self):
# 点击一个id定位的元素
self.driver.find_element_by_accessibility_id("").click()
# 此处使用time.sleep是为了能让肉眼区分操作。
time.sleep(1)
# 点击一个xpath定位的元素
self.driver.find_element_by_xpath("").click()
time.sleep(1)
# 给输入id定位的输入框传值
self.driver.find_element_by_accessibility_id("").set_value("iostest")
time.sleep(1)
# 截图保存到当前文件
self.driver.save_screenshot('./1.png')
time.sleep(2)
# 关闭app
self.driver.close_app()
if __name__ == '__main__':
a =Appium()
a.test()