基于 DOCKER 构建 APPIUM2 运行环境
前言:
关键字:APPIUM II;
本博文为原创博文,欢迎转载,但请请注明出处;
最近研究了一下关于手机自动化的一些东西,从博主从网上搜索的结果来看,APPIUM现在应该算是比较热门的自动化工具;花了点时间去简单学习了一下,看了一些相关的视频教程,不好用,博主是还没有开始学那些自动化的库,就已经给环境部署这块给卡住了。于是,不得不跑GITHUB与GOOGLE文档查了一通资料。结论是,官方更新了[主要是AUPIUM与ANDROID SDK的更新],造成了那些教程的部署方法不再适用于最新的APPIUM版本~
想部署并使用最新版本的APPIUM,无论是从国内还是从国外查资料都很零散,包括你现在看到的这篇博文。为什么说这篇博文零散?因为博主觉得这篇博文的通用性并不能说特别的高;以往的博文,大部分情况下,读者只需要按着顺序一步一步的复制命令并执行,一般就能得到一个与读者期望环境相差不大的环境,读者甚至不需要真正的知道命令做了什么,但这篇博文好像做不到这样。如果对安卓的开发环境的一些概念缺失的话,看这篇博文会很难受。
对于APPIUM的开发/运行环境搭建,是博主做过的环境搭建中相对比较复杂的一个了。假若你在WIN上希望使用PYTHON来写自动化测试代码的情况下,部署一个基于APPIUM的自动化测试环境[APPIUM II],你需要安装JAVA、NODEJS、PYTHON、AndroidSDK、Chromedriver,而这些都是最基本的。当然,如果只是安装还好,很可惜,你还得考虑它们之间的依赖关系,例如:
*、AndroidSDK_"cmdline-tools"与JAVA之间的版本适配关系
*、AndroidSDK_"build-tools"与ANDROID_OS之间的版本适配关系
*、NODEJS与APPIUM之间和版本适配关系
*、Chromedriver与手机中浏览器/APP之间的版本适配关系
*、......
写这篇博文的时间是"2023-11-20",如果你希望使用现在最新版本的"APPIUM II",这篇博文只能说能给你一点帮助;博主本想从JAVA最基本的安装开始说起的,但是,想了一下,如果那样写,要截的图实在太多了,如果再加上测试其可用性与正确性,那要花费的时间将更多,所以这里我只提供一个DockerFile的参考,这是本人现在正在使用的,确定可用的方式。为什么选择这个方式?主要是除了写起来简单外,这种方式能立即以最快的方法给你提供一个确切可用的示例,让你看得见摸得着;另外,假如你的实际 开发环境与博主的不一样,读者也只需要修改其中的几个变量,就能实现适配自己的开发环境。当然,这种方式还有一个好处,就是读者不再需要考虑网络环境的问题,博主已经在DOCKERFILE中顺便优化了,使其更适应国内的网络环境。
对于博文中的DOCKERFILE,博主会尽量将那些你需要注意的事,写在DOCKERFILE的注释中。这篇博文的写法就是这样了,有使用的上的问题留言吧~
特别提示:如果你在实验过程中,直接复制本博客任意博文中的配置/代码,"空格"字符的前面将可能产生不可见的字符"M-BM-",从而造成文件不可用,这是字符编码的问题~若必需使用复制粘贴方式,请务必手动替换掉配置项中的所有空格!!!或尝试使用以下命令过滤掉所有"M-BM-"字符~
1 2 3 4 |
sed -i 's/\xc2\xa0/ /g' [文件名称] # LINUX下可使用以下命令查看不可见字符的情况 cat -A [文件名称] |
一、测试/环境/目录结构
1、本教程在以下环境下测试通过!由于博主的测试的安卓手机已另作它用,未实测"demo.py"的正确性,该DEMO来源于官方资料,你可以至官方文档查找对应的DEMO进行测试;
-
硬 件 :VM
-
操作系统 :DEBIAN 12
-
依 赖 :docker + docker-compose
-
测试日期 :2023年11月20日
2、下载地址:百度网盘【 https://pan.baidu.com/s/1LvolQaIuUToWReQfwhK6HA 】 | 提取码:7s4q
3、下载文件解压后目录结构示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ tree appiumsvr appiumsvr/ |-- DockerFile/ | |-- DockerFile # DockerFile文件 | `-- Files/ | `-- bashrc # 优化终端显示效果的文件(没什么用) |-- androidData/ # 这个目录主要用于保存"ADB"连接手机时使用的密钥对 | |-- adb.5037 # 例如这个样子(连接自动生成) | |-- adbkey | `-- adbkey.pub |-- docker-compose.yaml # .... |-- readme.txt `-- working/ # 只是将代码放这了 `-- demo.py |
二、DOCKER-COMPOSE 说明
这是关于DOCKER-COMPOSE的说明,其实没什么可以说的,基本上都是一些最常用的配置项,本处只是着重的说明一下,关于容器挂载项的用途,见代码中的说明~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
version: '3.7' services: appiumsvr: build: context: ./DockerFile dockerfile: DockerFile image: appiumsvr:build container_name: appiumsvr environment: - TZ=Asia/Shanghai volumes: - /dev/bus/usb:/dev/bus/usb # 将宿主机上的USB影射至容器中 - ./androidData:/root/.android # 保存"ADB"连接时生成的密钥对 - ./working:/root/working # 代码存放目录 expose: - "4723" networks: - appiumsvr_network restart: unless-stopped privileged: true working_dir: /root/working stdin_open: true tty: true networks: appiumsvr_network: name: appiumsvr_network driver: bridge ipam: config: - subnet: 192.168.72.0/24 external: false |
三、DOCKERFILE 说明
本处是这篇博文中最重要的部分了,这是一份考虑了最终使用环境的DOCKERFILE;基本上,如果你希望构建一个基于DOCKER的APPIUM II的开发/测试环境,这个DOCKERFILE包含了你所需要的所有准备工作,以下是关于这个DOCKERFILE的说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
FROM debian:12 # [NOTE]--- # 基础镜像,方便安装新版本的开发环境软件而已;但也不是乱选的,DEBIAN12中软件源中的 # JAVA、NODEJS版本符合APPIUM与AndroidSDK的一些最新要求;例如AndroidSDK的最新版本就 # 要求JAVA的版本必须是"11"以上; # --------- #===================================================================================== # Running ENV # * Install OpenJDK 17 # * Install NodeJS 18 # * Install Python 11 #===================================================================================== # [NOTE]--- # 1、修改使用默认的国内软件源(解决国内下载问题) # 2、安装了一些基础依赖包(你可以顺便安装一些其它工具,例如"busybox") # 3、安装JAVA\NODEJS\PYTHON等(DEBIAN12软件源中的软件版本见上) # --------- RUN echo "" > /etc/apt/sources.list && \ sed -i '$a deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware' /etc/apt/sources.list && \ sed -i '$a deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware' /etc/apt/sources.list && \ sed -i '$a deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware' /etc/apt/sources.list && \ sed -i '$a deb http://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware' /etc/apt/sources.list && \ rm /etc/apt/sources.list.d/* && \ apt-get -qqy update && apt-get dist-upgrade -y && \ apt-get -qqy --no-install-recommends install ca-certificates curl gnupg \ libgconf-2-4 libqt5webkit5 sudo tzdata unzip wget xvfb zip \ openjdk-17-jdk nodejs npm python3 pip python3.11-venv busybox htop -y #=================================================================================== # $ENV # https://registry.npmmirror.com/-/binary/chromedriver/91.0.4472.101/chromedriver_linux64.zip # https://registry.npmmirror.com/-/binary/chromedriver/114.0.5735.90/chromedriver_linux64.zip #=================================================================================== # [NOTE]--- # 环境变量定义,这里可以定义你希望使用的各种工具的版本,修改此处一般就可以适配你实际的开发/测试环境 # SDK_URL AndroidSDK的下载链接地址(不同AndroidSDK版本对JAVA版本的要求不同,使用方法也可能不同) # CHROMEDRIVER_URL Chromedriver的下链接地址(大部分情况,你应该适配APP中所使用的CHROME版本) # JAVA_HOME JAVA_HOME(DOCKERFILE中定义的路径,是DEBIAN12安装JAVA17后的路径) # ANDROID_HOME ANDROID_HOME(这个定义很重要,"sdkmanager"命令下载的东西保存在那与这个有关) # ANDROID_BUILD_TOOLS_VERSION 构建工具的版本(这个与手机上的安卓系统的版本有关) # APPIUM_VERSION APPIUM的版本 # APPIUM_DRIVER_UIAUTOMATOR2_VERSION UIAUTOMATOR2驱动的版本(用于安卓系统的驱动) # APPIUM_SKIP_CHROMEDRIVER_INSTALL=1 禁止在安装UIAUTOMATOR2期间自动安装"chromedriver"(CHROMEDRIVER已 # 自定义安装,不禁用默认会从GITHUB下载CHROMEDRIVER,这对于国内用户 # 非常不合适,会导致镜像构建失败) # CHROMEDRIVER_PATH CHROMEDRIVER的安装路径 # PYTHON_VENV_PATH 定义一个PYTHON的虚拟环境 # --------- ENV DEBIAN_FRONTEND="noninteractive" \ SDK_URL="https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip" \ CHROMEDRIVER_URL="https://registry.npmmirror.com/-/binary/chromedriver/91.0.4472.101/chromedriver_linux64.zip" \ JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64" \ ANDROID_HOME="/opt/android" \ ANDROID_BUILD_TOOLS_VERSION="31.0.0" \ APPIUM_VERSION="2.2.1" \ APPIUM_DRIVER_UIAUTOMATOR2_VERSION="2.32.3" \ APPIUM_SKIP_CHROMEDRIVER_INSTALL=1 \ CHROMEDRIVER_PATH="/usr/local/sbin" \ PYTHON_VENV_PATH="/opt/pythonVENV" #=================================================================================== # $PATH #=================================================================================== # [NOTE]--- # 修改镜像的PATH环境变量 # *、你可以将其合并到一行,博主这样写只是方便查看而已 # *、与"ANDROID_HOME"有关的目录结构很复杂?没办法,最新版本的AndroidSDK官方建议的就 # 是这种目录结构,其实关于AndroidSDK的目录结果,都可以写一篇简单的博文了,你可从 # "https://developer.android.google.cn/studio/command-line?hl=zh-cn#tools-sdk"了解; # 另外,博主也不确认以后会不会又变~ # --------- ENV PATH=$PATH:$JAVA_HOME/bin ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest:$ANDROID_HOME/cmdline-tools/latest/bin ENV PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools #=================================================================================== # Mirror # * NPM # * PIP #=================================================================================== # [NOTE]--- # 调整"npm"与"pip"命令使用国内源 # --------- RUN npm config set --global registry "https://registry.npmmirror.com" && \ pip config --global set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \ pip config --global set install.trusted-host mirrors.aliyun.com #=================================================================================== # Android SDK # * Install cmd-line-tools # * Install platform-tools # * Install buid-tools #=================================================================================== # [NOTE]--- # 1、下载"cmdline-tools"、解压、修改权限(下载URL见变量定义) # 2、安装"PLATFORM_TOOLS" # 3、安卓"BUILD_TOOLS"(版本见变量定义) # --------- RUN wget -O cmdline-tools.zip ${SDK_URL} && \ unzip cmdline-tools.zip && rm cmdline-tools.zip && \ mv cmdline-tools latest && \ mkdir -p ${ANDROID_HOME}/cmdline-tools && \ mv latest ${ANDROID_HOME}/cmdline-tools && \ chmod a+x ${ANDROID_HOME}/cmdline-tools/latest/bin && \ echo y | sdkmanager "platform-tools" && \ echo y | sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" #=================================================================================== # Appium # * Install Appium 2 > npm view appium versions # * Install Uiautomator2 > npm view appium-uiautomator2-driver versions # * Install Chromedriver > https://registry.npmmirror.com/binary.html?path=chromedriver/ #=================================================================================== # [NOTE]--- # 1、全局安装APPIUM II(NODEJS) # 2、安装"uiautomator2"(安卓驱动) # 3、安装"chromedriver"(下载URL见变量定义) # --------- RUN npm cache clean --force && npm install -g appium@${APPIUM_VERSION} RUN appium driver install --source=npm appium-uiautomator2-driver@${APPIUM_DRIVER_UIAUTOMATOR2_VERSION} RUN wget -O chromedriver.zip ${CHROMEDRIVER_URL} && \ unzip chromedriver.zip chromedriver -d ${CHROMEDRIVER_PATH} && rm chromedriver.zip && \ chmod 755 ${CHROMEDRIVER_PATH}/chromedriver #=================================================================================== # Python # * Install Appium-Python-Client # * Install workalendar #=================================================================================== # [NOTE]--- # 1、"bashrc"美化终端 # 2、在"bashrc"中增加自动激活PYTHON虚拟环境 # 3、安装"Appium-Python-Client"("workalendar"这个包与本博文无关,只是博主自己的东西中用到的一个包) # --------- COPY ./Files/bashrc /root/.bashrc RUN ln -s /usr/bin/python3 /usr/bin/python && \ python -m venv ${PYTHON_VENV_PATH} && \ . ${PYTHON_VENV_PATH}/bin/activate && \ sed -i '$a \. ${PYTHON_VENV_PATH}/bin/activate' /root/.bashrc && \ pip install Appium-Python-Client workalendar #=================================================================================== # Clean #=================================================================================== # [NOTE]--- # 清理一下缓存缩减一下镜像大小 # --------- RUN npm cache clean --force && \ apt-get autoremove --purge -y && apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* #=================================================================================== # Other # * Set Timezone #=================================================================================== # [NOTE]--- # 1、时区修改 # 2、 # 3、启动APPIUM # --------- RUN echo "CST" > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata ENV DEBIAN_FRONTEND="" EXPOSE 4723 CMD appium |
四、使用(基于提供的下载文件)
以下为一些简单的使用说明,以及一些测试过程中的截图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# [NOTE]--- # *、本处已经假设你已经安装了DOCKER与DOCKER-COMPOSE了。 # *、连接你的手机至宿主机;注意,不要在宿主机上启用ADB服务, # 否则在容器中使用"adb devices"可能会出错 # *、简单的测试"demo.py" # --------- # 解压 tar -zxf appiumsvr.tgz # 进入"appiumsvr"目录 cd ./appiumsvr # 构建镜像 docker-compose build # 启动APPIUM服务 docker-compose up -d # 进入容器环境 docker exec -it appiumsvr bash # > 启动ADB服务(确认能正确连接至手机/安卓系统) CT> adb devices # > 基于"adb devices"命令获取到的设备编码来修改"demo.py" CT> busybox vi demo.py # 修改"demo.py"中的"deviceName" # > 执行"demo.py"来验证APPIUM服务可用性 CT> python demo.py # 测试代码 |
结、
没什么想说~
很详细。就是不知道win下起的docker,应该怎样映射usb
2024-04-15 下午12:25嗯~这个真不太清楚,话说这么久了,我从没直接在WIN下使用过DOCKER...遇到你说的情况,我一般是使用VM创建LINUX虚拟机再使用再DOCKER;
2024-04-27 下午10:34好吧。最终使用adb connect网络连接了
2024-04-28 上午9:44感谢,很完善,很仔细
2024-04-15 下午12:24