Mac 安装 appium 并在 iOS/Android 真机运行备忘
2023-01-05 tech mac appium nodejs opencv ios homebrew python apple-developer 20 mins 44 图 7311 字
做一个 appium 在 Mac M1 下的安装备忘,系统 Ventura 13.0。
一、目前系统环境
官方网站:https://appium.io/
官方的快速安装命令:
> brew install node # get node.js
> npm install -g appium # get appium
> npm install wd # get appium client
> appium & # start appium
> node your-appium-test.js
二、安装通用软件
1. nodejs
可以在官网下载,也可以用homebrew下载。在官网下载 npm install -g
时候会报权限问题,只有用 sudo 才行。为了避免这种问题,我还是使用 homebrew下载了,避免以后可能出现权限问题还需要定位。
官网:https://nodejs.org/zh-cn/download/
• Node.js v18.12.1 to /usr/local/bin/node • npm v8.19.2 to /usr/local/bin/npm ![image-20221129午後55019531](https://cdn.kelu.org/blog/2023/01/image-20221129午後55019531.jpg)
出现权限问题的错误:
改用
homebrew
了:
brew install node
which node
which npm
node -v
npm -v
2. appium
npm install -g appium
3. wd
npm install wd
4. appium-doctor
Appium doctor是一个小型软件,它检查Appium成功运行的所有(几乎所有)前提条件。
npm install -g appium-doctor
5. java
brew install java
再把这部分内容塞到 /etc/profile
文件去。
JAVA_HOME=/opt/homebrew/opt/openjdk
export JAVA_HOME
然后source一下:
source /etc/profile
6. Carthage
Carthage是一个依赖管理器,WebDriverAgent 需要它
brew install carthage
7. appium-desktop 和 appium-inspector
在GitHub上下载安装即可。
接下来我先尝试在iOS上运行出来,warning的内容也在iOS部分解决了。
三、iOS
一定要先安装好 xcode,可以参考我这篇:《iOS 开发环境配置备忘》
检查 iOS依赖有没有安装好
appium-doctor --ios
1. libimobiledevice & ideviceinstaller
下文运行获得一些数据,所以装这两个工具方便获取。
brew install libimobiledevice
brew install ideviceinstaller
idevice_id
instruments -s devices # 列出设备包括模拟器、真机及 mac 电脑本身
ideviceinfo # 可以在返回的数据中找到 udid
ideviceinstaller --list-apps # 列出app
ideviceinstaller -l # 列出app
idevicenotificationproxy -h
2. 自己编译webdriveragent并运行在真机上
首先手机要在 设置> 隐私与安全性 下找到 “开发者模式”开关 开启开发者模式。
我看到有的教程直接使用 appium 自带的 webdriveragent
代码,因为我的xcode版本比较新,使用这些老代码 编译 都不过,所以还是直接使用最新的源码代替了。
去 https://github.com/appium/WebDriverAgent/releases 下载源码
双击 WebDriverAgent.xcodeproj
后打开:
然后修改WebDriverAgentRunner
和 WebDriverAgentLib
证书为自己的证书(在真机上运行需要),新建的话只要登陆我们的apple id即可,不需要付费。
同时修改 Bundle identifier
,把 Facebook
的内容换成自己的。
选择 Product->Scheme->WebDriverAgentRunner
,
选择 Product->Destination
, 运行的设备为本机设备,例如我的设备名叫 とある血衫のiPhone
。
接下来点击三角形▶️先进行编译。
Ps:如果某个开发者账号签名的所有 App 都被删除的话下次再安装又要重新信任才能运行,你可能会遇到这个错误:
在手机上也能看到这样的提示:
在设备上
通用->VPN与设备管理->开发者APP
里选择信任证书即可。
编译OK后运行test:
本机访问 127.0.0.1:8100/status
遇到了诸多问题,记录几个:
ld: cannot link directly with dylib/framework, your binary is not an allowed client arm64
根据一个答案的提示,换了最新的webdriveragent源码:https://developer.apple.com/forums/thread/712039
3. opencv4nodejs(安装失败,搁置了)
着手解决 opencv4nodejs 的 warning。也是尽力而为了,最后只把ffmpeg的warning消掉了(安装opencv自动装好的)
https://appium.io/docs/en/writing-running-appium/image-comparison/
我遇到了好些错误,比如:
npm ERR! info install OPENCV_LIB_DIR is not set, looking for default lib dir npm ERR! info install using lib dir: /usr/local/lib npm ERR! /opt/homebrew/lib/node_modules/opencv4nodejs/install/install.js:45 npm ERR! throw new Error(‘no OpenCV libraries found in lib dir: ‘ + libDir)
查了一些问题:https://github.com/justadudewhohacks/opencv4nodejs/issues/733#issuecomment-988898236
brew install cmake
brew install opencv
npm i -g opencv4nodejs
opencv 要装的依赖还挺多的,等的比较久:
==> Fetching dependencies for opencv: eigen, gflags, glog, metis, gmp, isl, mpfr, libmpc, xz, gcc, openblas, suite-sparse, tbb, ceres-solver, highway, imath, libpng, openexr, webp, jpeg-xl, libvmaf, aom, dav1d, frei0r, bdw-gc, m4, libtool, libunistring, guile, libidn2, libtasn1, nettle, p11-kit, unbound, gnutls, lame, fribidi, pcre2, glib, libxau, libxdmcp, libx11, libxrender, pixman, harfbuzz, libunibreak, libass, libbluray, cjson, cmocka, mbedtls, librist, libsoxr, libvidstab, libogg, libvorbis, libvpx, opencore-amr, openjpeg, opus, rav1e, flac, mpg123, libsndfile, libsamplerate, rubberband, sdl2, snappy, speex, srt, leptonica, libb2, libarchive, pango, tesseract, theora, x264, x265, xvid, libsodium, zeromq, zimg, ffmpeg, numpy, protobuf, sqlite, python@3.11, boost, double-conversion, gl2ps, glew, libaec, hdf5, jsoncpp, netcdf, pugixml, qt@5, pyqt@5, utf8cpp and vtk
四、Android
https://developer.android.com/studio#downloads
点击进入默认会要求下载模拟器
不小心点掉了的话,在 Preference 里搜索 SDK ,点击 edit 可以继续下载:
增加 android 版本:
完成:
再把这部分内容塞到 /etc/profile
文件去。
ANDROID_HOME=/Users/kelu/Library/Android/sdk
export ANDROID_HOME
然后source一下:
source /etc/profile
一些安装相关的问题:
五、试运行
1. 命令行
appium &
能跑了之后先把命令行kill掉,我们改用 gui 运行。
2. Appium Server GUI
其他不用改,选中 Allow CORS
即可,然后 startServer
3. Appium Inspector
安卓的试运行和iOS/android的详细使用方法再开新的文章讲讲,这里简单列一下iOS试运行的配置和结果。
配置参考:Appium Desired Capabilities
Remote Path 要填 /wd/hub
:
可以直接修改右侧的json,填入一下内容:
{
"platformName": "iOS",
"platformVersion": "13.2",
"deviceName": "填写手机的deviceName",
"automationName": "XCUITest",
"udid": "填手机的udid",
"bundleId": "填应用的bundleId",
"xcodeOrgId": "填开发者id",
"xcodeSigningId": "iPhone Developer",
"useNewWDA": false,
"noReset": true,
"newCommandTimeo": "60"
}
具体的参数如下获取:
platformVersion 如上文在本机浏览器访问 127.0.0.1:8100/status
获得。
idevice_id -l # 获取udid
ideviceinfo -k DeviceName # 获取deviceName
ideviceinfo -k ProductVersion # 获取系统版本
ideviceinstaller -l -o list_user # 获取bundleId,也就是应用名
获取xcodeOrgId
,在这个界面下点击那个 Other
就能获取了:
最后的 json:
{
"platformName": "iOS",
"platformVersion": "16.1",
"deviceName": "とある血衫のiPhone",
"automationName": "XCUITest",
"udid": "xxx",
"bundleId": "com.reederapp.5.iOS",
"xcodeOrgId": "xxx",
"xcodeSigningId": "iPhone Developer",
"useNewWDA": false,
"noReset": true,
"newCommandTimeo": "60"
}
Server GUI 显示:
手机显示:
Inspector显示:
六、其它
为了防止你的手机自动锁定,建议可以选择取消自动锁定,在iOS16下层级为:
设置->显示与亮度->自动锁定->永不
python 代码驱动:
pip install appium-python-client
几个代码备忘:
selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: The attribute 'accessibility_id' is unknown. Valid attribute names are: (
UID,
accessibilityContainer,
accessible,
enabled,
focused,
frame,
index,
label,
name,
rect,
selected,
type,
value,
visible,
wdAccessibilityContainer,
wdAccessible,
wdEnabled,
wdFocused,
wdFrame,
wdIndex,
wdLabel,
wdName,
wdRect,
wdSelected,
wdType,
wdUID,
wdValue,
wdVisible
)
Stacktrace:
UnknownError: An unknown server-side error occurred while processing the command. Original error: The attribute 'accessibility_id' is unknown. Valid attribute names are: (
UID,
accessibilityContainer,
accessible,
enabled,
focused,
frame,
index,
label,
name,
rect,
selected,
type,
value,
visible,
wdAccessibilityContainer,
wdAccessible,
wdEnabled,
wdFocused,
wdFrame,
wdIndex,
wdLabel,
wdName,
wdRect,
wdSelected,
wdType,
wdUID,
wdValue,
wdVisible
)