如何在Docker中使用安卓模拟器+Appium

 

如何在Docker中使用安卓模拟器+Appium

如何在Docker中使用安卓模拟器+Appium

前言
本篇文章会给大家讲解如何在Docker中使用安卓模拟器+Appium

模拟器部署Docker好处有以下几点:

  • 满足将Appium+安卓模拟器部署带服务器的特殊需求
  • 不需要winserver服务器,同时对显卡等硬件无硬性要求,普通服务器就可以运行
  • 减少内存占用和性能消耗
  • 可以实现长时间稳定的运行
  • 虽说在Docker中是无界面的,但可以通过映射端口在宿主机访问图形化界面,方便查Bug和进行一些基本操作

此镜像是个人开源项目,目前还是存在一些问题的,若要上生产环境请三思,以下目前发现的问题:

  • 模拟器仅能运行支持X86框架的App安装包,Arm的运行不起来,虽说大神也开发了Arm框架的镜像,但是好像不能用.手机开机1个小时还在开机页面.
  • 强行关闭Docker后,下次启动有几率直接挂掉,挂掉后不要用重启(restart)容器命令,需要先关闭(stop),再启动(start),如果还不行就删掉容器,重新开启一个
  • 目前仅能手动安装抓包工具证书,也就是说,如果你要部署服务器可以,但要用抓包工具比如Mitmproxy抓Https有点难度,因为无法通过命令安装Mitmproxy的证书,需要将证书哈希,再经过一系列命令操作才能安装,谷歌搜到的解决方案:Install User Certificate Via ADB,大家有兴趣可以试下.
  • 建议用Linux系统上的Docker来进行操作,兼容性更好,否则会有莫名其妙的问题

针对兼容性问题,目前有三个解决方案:

  • 1.祈祷你的App兼容X86,这个看概率,也看App开发者心情.
  • 2.找公司Android大神帮你改下App兼容配置,然后重新打包.
  • 3.使用强大的Genymotion ,点击传送官网,支持和DockerAndroid交互,支持云服务,缺点是收费,而且还不便宜.

Appium和模拟器环境butomo大神已经搞好Docker镜像,我们拉下来就好了,我们只需要执行业务逻辑相关的东西就可以.

 

以下是butomo大神的镜像GitHub,不稳定的传送门:

butomo1989/docker-android​github.com


正片开始

首先是拉镜像

寻找自己要拉的镜像版本:

红框Image代表:不同安卓版本的镜像名

橘色框代表:控制真机的镜像名

绿色框代表:控制genymotion的镜像名(genymotion也是一款强大的安卓模拟器,也就是上边我说的那款,可以免费试用,大家可以试一试)

此信息在GitHub链接的ReadMe中有,可以直接复制

以下是机型列表,除了最后一个是平板,其他都是手机

此信息在GitHub链接的ReadMe中有,可以直接复制

现在有了这两个参数,我们就可拉镜像了.

因为在Docker中,我们直接执行run命令,镜像不存在它会直接帮我们拉,所以我们可以直接执行run命令,就可以了

 docker run --privileged -d -p 6080:6080 -p 5554:5554 -p 5555:5555 -e DEVICE="Nexus 5" --name android-container butomo1989/docker-android-x86-7.1.1

在上边这条指令中:

DEVICE:设备型号,详见我上边提供的List of Devices表

--name:后边跟容器名,自己随便起一个就好啦

最后butomo1989开头的那串:是镜像名,同样从我上边给出的镜像列表选一个就好了

以上命令代机型为Nexus 5 安卓版本为7.1.1

命令讲解完毕后,我们来在终端执行它,开始下载镜像:

之后执行:docker ps -a 查看正在运行的容器,我们可以看到容器状态是healthy,说明容器正常启动啦

 

然后我们就成功的Docker中启动了一个安卓版本为7.1.1的安卓模拟器~


可能会有人问:???这就完了??我咋用啊???

哈哈,别着急,虽然在Docker中运行的东西是没有图形化界面的,但是注意到我们的启动命令里有个-p6080:6080没,这个指令将容器6080端口映射到了宿主机的6080端口。

我们在浏览器中输入:http://docker-host-ip-address:6080, 所以直接在浏览器访问本机IP+端口0.0.0.0:6080 ,效果如下 :

这个界面里的手机,是可以直接进行操作的,和正常模拟器没什么差别。

但是如果我们真的要在服务器中部署安卓模拟器的话,肯定不能手动点击操作,否则为什么不用Winserver呢?

所以此次我们主要用图形界面来观察任务执行情况


我们需要通过命令行指令进行操作

首先先进入此容器内部,我们使用:

docker exec -i -t 容器名或容器ID /bin/bash

这样就进入容器的内部终端命令行了,其实这个镜像也是一个Linux系统,只不过好多所需配置如:Appium,JDK,SDK,模拟器这些都已经自带了!!!没错,不用你去手动配置。

 

我们查看下python版本

再看看Appium,Java,Adb版本

注意:容器没有安装pip和pip3,我们可以执行以下指令安装.

如果要部署服务器的话,写DockerFile命令里也行:

curl "https://bootstrap.pypa.io/3.2/get-pip.py" -o "get-pip.py"

sudo python3 get-pip.py

我们再执行adb devices ,显示如下,设备已链接


至此我们可以看到,其实这个镜像基本把我们需要的所有东西准备的差不多了,我们需要做的只有:

  1. 安装依赖包
  2. 安装App到模拟器
  3. 执行你的代码

 

首先我们把代码,App包和requirements.txt 放在同一个项目目录下

在终端执行(注意不是Docker容器的终端,是你电脑的终端

docker cp 本地文件路径 容器名或者ID:容器路径
如:将本地当前路径下via_test文件夹移动到名字为'android-container'的镜像的root文件夹下
docker cp  via_test/ android-container:/root

之后,我们再次进入容器内部, cd到项目文件夹内。

 

如果安装依赖包,执行:

pip install -r requirement.txt

这个应该大家都会用,就不细说了。

如果安装App应用,执行,此处我安装的是Via浏览器

adb install 安装包

出现success代表成功,我们来看一下模拟器里有没有

可以看到倒数第二排倒数第一个就是我们刚刚安装的App

最后,我们启动Appium,在命令行输入apium 即可

 

最后在容器内部的命令行用python执行你的Appium脚本就可以用Appium在Docker中控制安卓模拟器啦.

 

关于Appium脚本,我之前帖子有讲过怎么写,不会写的小伙伴可以传送参考,不稳定的传送门

程序员小景:抖音无水印视频抓取(Appium自动版)​zhuanlan.zhihu.com图标

 


如果想将这一套部署到Docker,只需继承这个镜像,再将以上指令编写成DockerFile指令就可以了,具体我也在研究阶段,没上过生产环境,所以还是需要测试.

 

这篇文章中未解决的问题,如果以后找到好的解决办法,我会尽快更新,大家在使用中发现什么问题或者好的解决方法也可以在评论区分享,大家一起讨论~

 

今天就到这里,欢迎大家订阅点赞,如更能加个关注那就更好啦,在此谢过~

 

https://zhuanlan.zhihu.com/p/50683232

https://zhuanlan.zhihu.com/appium

 

https://blog.csdn.net/zhugeaming2018/article/details/94596081?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值