docker+appium+android+ios远程环境环境搭建

基础镜像

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的,听说这个不需要支持硬件加速就可以启动成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值