基础镜像
infrastlabs/docker-headless
运行镜像
docker run -itd --shm-size 1g -e VNC_OFFSET=20 -e L=zh_CN --privileged --net=host infrastlabs/docker-headless
该镜像自带vnc,可直接访问'http://<ip>:10081'访问
进入后打开命令行工具操作
安装pip
sudo apt install python3-pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
配置apt源,编辑/etc/apt/source.list,新增一条记录
deb http://mirrors.aliyun.com/ubuntu/ jammy main
apt更新及安装所需包
sudo apt update
sudo apt install python3-pip libc6 libimobiledevice-utils libimobiledevice6 usbmuxd usbutils openjdk-17-jdk -y
配置pip源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装nodejs(安装appium需要nodejs版本在16以上,这里安装的是18.20.4)
wget https://nodejs.org/dist/v18.20.4/node-v18.20.4-linux-x64.tar.xz
tar xf node-v18.20.4-linux-x64.tar.xz
sudo mv node-v18.20.4-linux-x64 /opt/
sudo ln -s /opt/node-v18.20.4-linux-x64/bin/npm /usr/bin/
sudo ln -s /opt/node-v18.20.4-linux-x64/bin/node /usr/bin/
安装appium(时间比较长,需要耐心等待;建议科学上网)
sudo npm install -g appium
安装go-ios(时间比较长,需要耐心等待;建议科学上网)
sudo npm install -g go-ios
安装android studio命令行工具
cd ~
wget https://googledownloads.cn/android/repository/commandlinetools-linux-11076708_latest.zip
sudo unzip commandlinetools-linux-11076708_latest.zip
mv cmdline-tools/ /opt/
cd /opt/cmdline-tools/
sudo mkdir latest
sudo mv * latest/
sudo ln -s /opt/cmdline-tools/latest/bin/sdkmanager /usr/bin/
sudo ln -s /opt/cmdline-tools/latest/bin/avdmanager /usr/bin/
配置环境变量
export ANDROID_HOME=/opt/
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools
export NODE_HOME=/opt/node-v18.20.4-linux-x64
export PATH=$NODE_HOME/bin:$PATH
export ANDROID_ADB_SERVER_ADDRESS=host.docker.internal
## 后续制作成镜像的时候,加入环境变量
至此环境都装好了。可以依次执行下方命令确保所有东西都正确安装
pip -V
node -v
npm -v
appium -v
java --version
sdkmanager --help
avdmanager --help
ios --help
idevicepair --help
usbmuxd --help
lsusb --help
至此包安装完成
持久化相关
安装appium驱动
appium driver list # 查看所有驱动
appium driver install uiautomator2 # 安装安卓自动化驱动程序
appium driver install xcuitest # 安装ios自动化驱动
安装成功后会显示已安装
复制家目录下的.appium目录至宿主机后续将要挂载的目录
宿主机执行
docker cp {{容器id}}:/home/headless/.appium /opt/
android相关的包想做持久化,也可以复制出去,后续直接挂载就行
安装android studio相关请自行查阅sdkmanager相关命令
至少挂载一个build_tool和platform-tools
修改启动脚本命令;这个基础镜像的启动脚本会直接覆盖我们之前所有配置的环境变量,所以需要修改一下
vi /entry.sh
找到 export PATH行,添加$PATH
至此镜像需要安装的东西已经安装,可以通过docker commit将容器打成自己的镜像(打包前可以删除已将复制出去准备做持久化的文件)
宿主机安装usbip
ubuntu安装(这个不一定准确,一般ubuntu是自带usbip的,没有时情况安装,可尝试apt install usbip)
sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20
centos安装
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum -y install kmod-usbip usbip-utils
modprobe usbip-core
modprobe vhci-hcd
modprobe usbip-host
检查是否安装成功
usbip help
安装adb,如果直接走容器adb会导致devices不稳定,拿不到设备。这里容器做客户端,宿主机做服务端
下载adb并执行
注意**最新版的platform-tools里面的adb已升级到支持libusb 1.0.27,但国内大部分云厂商并不支持,要么自己安装libusb 1.0.27,要么安装低版本的platform-tools
宿主机执行
cd ~
curl -O https://dl.google.com/android/repository/platform-tools-latest-linux.zip
unzip -q platform-tools-latest-linux.zip
cd platform-tools/
./adb -a nodaemon server start &>/root/adb_server.log &
将platform-tools拷贝至容器/opt/cmdline-tools/
在容器中执行adb devices没有出现启动adb的过程,直接显示的设备列表,表明配置成功
本地电脑(win)安装usbip-win
以管理员身份运行PowerShell,并执行
winget install usbipd
查看链接的usb设备
usbip list --local
将设备共享至远程
usbipd bind --busid 设备id
因为远程机器想要连接本地的usb设备,需要知道本地的ip地址,但我们一般时没办法自己本地的公网ip,这里通过ssh隧道转发,将本地usbip端口事件转发至远程机器
ssh -Nf -R 3240:localhost:3240 root@远程宿主机ip
3240为usbip指定的端口号,一般无需修改。输入密码后,没有报错和退出,说明已正常转发
远程机器查看可连接设备并连接
usbip list --remote 127.0.0.1
usbip attach --remote=127.0.0.1 --busid=1-3
现在就可以开始测试了
停掉刚才的容器,用刚打好的镜像启动新容器
# --add-host用作adb做tcp转发 /opt/android_tool/build-tools/33.0.0为指定版本的build_tools,安卓测试时这个路径必须有 /opt/android_tool/licenses 为sdkmanager的包管理信息 /opt/android_tool/platform-tools adb一类的工具,也可直接打进包里,这个不必做持久化,需要与宿主机的这个包保持一致
docker run -itd --shm-size 1g -e VNC_OFFSET=20 -e L=zh_CN --privileged -p 10081:10081 -p 4723:4723 --add-host=host.docker.internal:host-gateway -v /dev/bus/usb:/dev/bus/usb -v /opt/.appium/:/home/headless/.appium -v /opt/android_tool/build-tools/33.0.0:/opt/cmdline-tools/build-tools -v /opt/android_tool/licenses:/opt/licenses -v /opt/android_tool/platform-tools:/opt/cmdline-tools/platform-tools {{新打的镜像id或名称:tag}} appium
在本地安装appium inspector,下载链接
安卓机打开调试模式,就可以连接了;记得容器启动qppium
注**如果appium报缺少aapt2,请通过sdkmanager命令下载符合自己安卓版本的build_tools,复制aapt2和aapt至容器的/opt/cmdline-tools/platform-tools目录
python连接代码
from appium import webdriver
from appium.options.android import UiAutomator2Options
desired_caps = {
"platformName": "Android",
"appium:Android": 12,
"appium:automationName": "UiAutomator2",
"appium:deviceName": "ELS_AN10",
"appium:appPackage": "com.galaxy.galaxyandroid",
"appium:appActivity": "com.galaxy.galaxyandroid.SplashActivity",
"appium:remoteAdbHost": "{{宿主机的ip}}",
# "appium:remoteAdbPort": "{{宿主机adb启动服务端端口}}", 为5037时可不填
}
driver = webdriver.Remote('http://192.168.11.185:4567')
options=UiAutomator2Options().load_capabilities(desired_caps))
ios稍复杂一些
首先需要确保ios已通过mac安装了webdriveragent,这个安装自行查阅处理吧;没有认证的webdriveragentId只有7天有效期,超过7天需要重新安装
确定usb已远程分享至宿主机时,容器内执行
idevicepair pair
如果显示success说明正常连接,否则执行
sudo usbmuxd -f -v
这时候苹果会弹出信任,选择是即可
依次执行
ios tunnel start --userspace
ios runwda --bundleid={{mac安装ios webdriveragent时的id}}.xctrunner --testrunnerbundleid={{mac安装ios webdriveragent时的id}}.xctrunner --xctestconfig=WebDriverAgentRunner.xctest
ios forward 7777 8100&
就可以连接了,python连接代码
from appium import webdriver
from appium.options.android import UiAutomator2Options
desired_caps = {
"platformName": "iOS",
"appium:bundleId": "com.intelligence.galaxy",// 项目的id
"appium:automationName": "XCUITest",
"appium:uid": "auto",
"appium:deviceName": "iPhone15 max pro",
"appium:udid": "00008130-000415D40CE0001C", // 机器的uuid
"appium:usePrebuiltWDA": true,
"appium:startIWDP": true,
"appium:webDriverAgentUrl": "http://localhost:7777"
}
driver = webdriver.Remote('http://192.168.11.185:4567', options=UiAutomator2Options().load_capabilities(desired_caps))
目前还没解决/确认的问题
ssh隧道转发,宿主机同一端口一次只能转一个,这导致台机器连接时会有问题
andriod studio在容器中启动andriod虚拟机时,由于部署验证的时候用的是x86架构的包,要求机器必须支持硬件加速。所以并没启动成功。后续尝试下arm的,听说这个不需要支持硬件加速就可以启动成功