Docker Docker 实践笔记 (1) — xwalkdriver (webdriver for crosswalk)

陈恒捷 · 2015年06月22日 · 最后由 小胖。 回复于 2017年12月05日 · 2678 次阅读
本帖已被设为精华帖!

前面学习了一些 docker 建立 container,image 的基础知识,然后当然要实践一下啦。加上之前研究 crosswalk 时找到它的 webdriver 执行文件只能在 linux 环境下跑,所以就拿它来练手了。

前言

在 Docker 的学习中可以发现它的一大好处是能比较方便地把本来只能在 linux 上跑的程序拿到非 linux 系统中跑(当然实际上还是在 linux 中跑的),因此我在实践时就选用了本来只能在 linux 下跑的 crosswalk 的 webdriver : xwalkdriver。

下载地址及使用方式

镜像已上传到 docker hub ,因此在 docker 中直接 run 时就会自动下载镜像了。
此镜像及下面的说明仅针对真实设备,模拟器的连接后面还需要继续研究。

Linux 系统

  1. 安装 docker,可参考官方文档:https://docs.docker.com
  2. 运行命令 docker run -d -p 5037:5037 -p 5554:5554 -p 5555:5555 -p 9515:9515 -v /dev/bus/usb:/dev/bus/usb --privileged chenhengjie123/xwalkdriver
  3. 在你的脚本中把 xwalkdriver 地址设置为 127.0.0.1:9595

非 Linux 系统

  1. 在电脑上装好 docker,boot2docker,virtualbox,可参考官方文档:https://docs.docker.com
  2. 先把你的手机通过 USB 连接到电脑,然后在 virtualbox 中设置把 usb 设备分配给 boot2docker-vm 这台虚拟机。
  3. 启动并进入 boot2docker 的 shell 界面。
  4. 运行命令:docker run -d -p 5037:5037 -p 5554:5554 -p 5555:5555 -p 9515:9515 -v /dev/bus/usb:/dev/bus/usb --privileged chenhengjie123/xwalkdriver
  5. 在测试脚本中把 xwalkdriver 地址设置为 [boot2docker的ip地址]:9595,其中 boot2docker 的 ip 地址可以通过 boot2docker ip 命令获得。

xwalkdriver 脚本大致如下 (python):

# -*- coding:utf-8 -*-
import unittest

from selenium import webdriver

class TestCrossWalk(unittest.TestCase):
    def setUp(self):
        capabilities = {
          'xwalkOptions': {
            # App infos. 
            # The app MUST already installed on device
            'androidPackage': 'com.HCCB.score',
            'androidActivity': '.MainActivity',
            'adb-port': 5037,
      }
    }
        # use boot2docker, so set ip address to boot2docker ip
        self.driver = webdriver.Remote('http://192.168.59.103:9515', capabilities)

    def tearDown(self):
        # end the session
        self.driver.quit()

    def test_login(self):
        # sample for my own app. Please modify them before use.
        print self.driver.page_source
        self.driver.find_element_by_id("offlineBtn").click()
        print self.driver.page_source


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(TestCrossWalk)
    unittest.TextTestRunner(verbosity=2).run(suite)

制作过程

难点分析

首先,要确认一下 xwalkdriver 的官方要求的依赖项:

  • adb,且保证 adb 能连接到被测设备

阅读了这篇博文: adb client, adb server, adbd 原理浅析(附带我的操作过程) 后可以看出, adb 与真实设备/虚拟机进行连接使用的是 usb 和 tcp 连接。

而从官方的脚本例子可以看出,xwalkdriver 是以 server 形式存在的,脚本只要能连接到这个 server 就可以使用它了。从之前的学习看出端口映射这一部分 docker 已经简化到一个参数就能搞定了,所以难点主要在它的依赖项——adb——部分

简单总结下,主要难点是:

  1. 如何让 container 内的 adb 能够连接到真实设备?
  2. 如何让 container 内的 adb 能连接到物理机的模拟器(container 没有 GUI 界面,所以模拟器需要在物理机运行)

其中第二个难点目前还没搞定,所以下面的说明主要针对第一个难点。

实际步骤

  1. 要让 container 连接到真实设备,需要把真实设备直接连接到 container 中。由于所有设备在 Linux 中其实都是文件,所以我们可以使用 -v 参数来把 usb 设备映射到 container 中:-v /dev/bus/usb:/dev/bus/usb。但由于 boot2docker 本身也是个 virtualbox 里面的虚拟机,所以还需要在 virtualbox 中把 usb 设备分配给虚拟机。

  2. 为了使用 adb ,我们需要一个装有 android sdk 的 image 。由于这个是普遍需求,所以 docker hub 上面有现成的可以使用。这里选用 webratio/android-sdk,里面包含了 adb,一些 build tool 以及 platform tool。具体有什么可以查看它的 Dockerfile

  3. 我们需要使用 git 来从 github 下载 crosswalk-web-driver ,并,因此需要安装 git :apt-get install git

  4. 为了方便在 container 中调试 usb 设备是否成功显示,因此安装 usbutils :apt-get install usbutils(仅为了调试,实际使用可以不需要安装)

  5. 由于 docker 提供的 ubuntu 基本镜像里面缺少了很多动态链接库 ,导致调试过程中总是出现缺少 xx.so 文件的错误。随着不断地 google -> 添加文件 -> 新错误 -> google... ,终于把需要的 lib 补齐了:apt-get install libglib2.0-0 libnss3 libxi6 libgconf-2-4

至此,一个能够跑 xwalkdriver 的 container 已经搞定了。为了方便以后更改和版本化管理,我建立了一个 Dockerfile :

# Set the base image to ubuntu
FROM webratio/android-sdk
# File Author / Maintainer
MAINTAINER chenhengjie <chenhengjie123@gmail.com>

# Install git
RUN apt-get update
RUN echo y | apt-get install git

# Install lsusb
RUN echo y | apt-get install usbutils

# Install share libraries for xwalkdriver
RUN echo y | apt-get install libglib2.0-0 libnss3 libxi6 libgconf-2-4

# Install xwalkdriver
ENV XWALKDRIVER_URL https://github.com/crosswalk-project/crosswalk-web-driver.git

RUN cd /opt && \
    git clone ${XWALKDRIVER_URL} && \
    ls

# port expose
EXPOSE 9515 5037 5554 5555

# start adb server and check devices
# start xwalkdriver server and accept all ips
CMD adb devices && /opt/crosswalk-web-driver/bin/xwalkdriver64_release --verbose --whitelisted-ips 0.0.0.0

这里的命令用处大致如下:

命令 用处
FROM 从什么镜像开始执行后面的操作
MAINTAINER 维护者信息
RUN 运行命令。这个命令只有在 build 时会运行
EXPOSE 需要映射的端口。在启动 container 时加入 -P 就会自动对这些端口进行映射
CMD 运行命令。这个命令会在 run container 时运行

启动方式

使用

docker run -d -p 5037:5037 -p 5554:5554 -p 5555:5555 -p 9515:9515 -v /dev/bus/usb:/dev/bus/usb --privileged chenhengjie123/xwalkdriver

命令启动。其中各参数的用处大致如下:

参数 用处
-d 以守护进程 (daemon) 形式运行
-p 5037:5037 端口映射。把 container 的 5037 端口映射到物理机(非 linux 系统则是 boot2docker 虚拟主机)的 5037 端口
-v /dev/bus/usb:/dev/bus/usb Mount 外部资源。这里是把物理机的 /dev/bus/usb 映射到 container 的 /dev/bus/usb 。由于 linux 系统中这个文件代表的就是所有 usb 资源,因此这样可以让虚拟机连接到物理机的 usb 设备
--privileged 允许 container 连接物理设备。

自我总结

如果使用 linux 虚拟机,也能以类似的方式实现 xwalkdriver ,但估计等待 android sdk 下载的时候这个 container 都已经可以跑起来了。由此可以看出 docker 面向交付的特点,让用户不用重复繁琐的环境搭建步骤,以最简便的方式完成环境配置。

这次虽然终于搞出来了,但还留了一些坑,如连接模拟器、Dockerfile 各命令具体用法。后续的学习需要把这些坑填掉,把 docker 的 container 间通讯、Dockerfile 用法、linux 容器的基本知识掌握。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 11 条回复 时间 点赞

docker 测试分享不错,👍。

最近好几个公司的客户也在用 docker, 有时候会让我们 QA 支持, 恒捷学的好认真啊

不错,还没用,先学习下。

运行后报 xwalk not reachable,楼主遇到了么

#4 楼 @heyyuyu 能说下详细步骤不?

#5 楼 @chenhengjie123 我在 Ubuntu32 位上部署的 xwalkdriver,https://testerhome.com/topics/6023 刚发帖在这了。

@chenhengjie123 adb 访问同时只能有一个主机 or 容器访问,那如果在多台机器多个容器下 怎么能同时用 adb 连接到手机,用--device 事先分配好 usb 口么?

小胖。 回复

不好意思,没有这么做过,不是很清楚。建议你单独发一个贴询问下,或者自己尝试一下?

陈恒捷 回复

您那边有做过云测平台相关开发么?

小胖。 回复

做过基于 stf 的二次开发

陈恒捷 回复

好的,谢谢了~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册