目錄css
瞭解需求後便開始在網絡上查看資料,大部分都是自動化工具的,關於設備管理平臺的介紹不多。多番查閱之下,發現業內目前的移動端設備主要有如下幾種:python
STFandroid
atx servergit
這個是在TesterHome上看到的,感受不錯決定試一試,感謝做者。github地址以下:
https://github.com/openatx/atxserver2github
Android VNC Server多年不更新,Android 5.x因爲Pie的限制用不了,須要從新編譯,過程略複雜,做爲安卓未入門級選手果斷直接放棄。web
好比美團點評的雲真機平臺,知乎的雲測試平臺,這種的通常都是投入一個團隊在研發,成本大。docker
我使用的機器是Ubuntu18,Windows平臺推薦用源碼安裝。ubuntu
官方安裝手冊地址:https://www.rethinkdb.com/docs/install/ 。根據平臺選擇對應的安裝方法。官方給出的ubuntu安裝方法以下:vim
source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add - sudo apt-get update sudo apt-get install rethinkdb
沒法定位到rethinkdb,有的網友說是http改爲了https,修改後從新安裝也不行。通過查閱資料,rethinkdb不支持ubuntu18,因而嘗試用deb的包安裝。下載倒數第四個。
瀏覽器
下載地址:https://github.com/srh/rethinkdb/releases/tag/v2.3.6.srh.1
安裝方法:
Run sudo dpkg -i foo.deb to install a deb package. If you get a message about missing some dependencies, run sudo apt-get install -f to install them. Then run rethinkdb --version to test that installation succeeded.
clone代碼到本地
git clone https://github.com/openatx/atxserver2.git
安裝curl工具
sudo apt install curl
安裝docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
將當前用戶假如docker組
sudo gpasswd -a ${USER} docker
編輯/etc/default/docker文件
加入以下配置
DOCKER_OPTS="-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock"
重啓docker或重啓機器
service docker restart
退出命令行,切換到代碼docker-compose.yml所在目錄,執行
docker-compose up
啓動日誌以下:
stephen@stephen-K55VD:~/atx-server/atxserver2$ docker-compose up Creating network "atxserver2_default" with the default driver Pulling rethinkdb (rethinkdb:2.3.6)... 2.3.6: Pulling from library/rethinkdb 9811207f4eba: Pull complete d7c48489ee79: Pull complete bd3fe89ae346: Pull complete 1914a1a7f89d: Pull complete bf26223d4854: Pull complete Digest: sha256:37340d5fcc7b0e83eed0e699a6af5362a3d8ff19cf3f80819dcf75d6c5ebcc18 Status: Downloaded newer image for rethinkdb:2.3.6 Building web Step 1/6 : FROM python:3.6 3.6: Pulling from library/python 6f2f362378c5: Pull complete 494c27a8a6b8: Pull complete 7596bb83081b: Pull complete 372744b62d49: Pull complete 615db220d76c: Pull complete 1865698adfb0: Pull complete 7159b3304cc0: Pull complete ad0713808ef6: Pull complete 7ba593904573: Pull complete Digest: sha256:904bc648c46a22d0bca62340785da841eaeb7099addb2fc4941a5a8b878c5ce7 Status: Downloaded newer image for python:3.6 ---> 48c06762acf0 Step 2/6 : ADD . /app ---> abff59a2fca3 Step 3/6 : WORKDIR /app ---> Running in cc16e0af3f06 Removing intermediate container cc16e0af3f06 ---> 61b746c8516d Step 4/6 : RUN pip install -r requirements.txt ---> Running in 8faf64de476a Collecting six (from -r requirements.txt (line 1)) Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl Collecting bunch (from -r requirements.txt (line 2)) Downloading https://files.pythonhosted.org/packages/ef/bf/a4cf1779a4ffb4f610903fa08e15d1f4a8a2f4e3353a02afbe097c5bf4a8/bunch-1.0.1.tar.gz Collecting logzero (from -r requirements.txt (line 3)) Downloading https://files.pythonhosted.org/packages/97/24/27295d318ea8976b12cf9cc51d82e7c7129220f6a3cc9e3443df3be8afdb/logzero-1.5.0-py2.py3-none-any.whl Collecting tornado>=5.0 (from -r requirements.txt (line 4)) Downloading https://files.pythonhosted.org/packages/03/3f/5f89d99fca3c0100c8cede4f53f660b126d39e0d6a1e943e95cc3ed386fb/tornado-6.0.2.tar.gz (481kB) Collecting requests (from -r requirements.txt (line 5)) Downloading https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl (57kB) Collecting apkutils-patch<=0.6.0,>=0.5.4 (from -r requirements.txt (line 6)) Downloading https://files.pythonhosted.org/packages/d0/e3/fd4d547044b9fcf0af7eca25c055dc1169aadc47a3677eb5951426c9a66a/apkutils-patch-0.5.4.tar.gz (60kB) Collecting rethinkdb==2.4.2.post1 (from -r requirements.txt (line 7)) Downloading https://files.pythonhosted.org/packages/98/4b/b22065b2686f440f8eaa8a7326e96a442ce98b7b637d28529958b83b2128/rethinkdb-2.4.2.post1-py2.py3-none-any.whl (155kB) Collecting certifi>=2017.4.17 (from requests->-r requirements.txt (line 5)) Downloading https://files.pythonhosted.org/packages/60/75/f692a584e85b7eaba0e03827b3d51f45f571c2e793dd731e598828d380aa/certifi-2019.3.9-py2.py3-none-any.whl (158kB) Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests->-r requirements.txt (line 5)) Downloading https://files.pythonhosted.org/packages/e6/60/247f23a7121ae632d62811ba7f273d0e58972d75e58a94d329d51550a47d/urllib3-1.25.3-py2.py3-none-any.whl (150kB) Collecting idna<2.9,>=2.5 (from requests->-r requirements.txt (line 5)) Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB) Collecting chardet<3.1.0,>=3.0.2 (from requests->-r requirements.txt (line 5)) Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB) Collecting pyelftools (from apkutils-patch<=0.6.0,>=0.5.4->-r requirements.txt (line 6)) Downloading https://files.pythonhosted.org/packages/fa/9a/0674cb1725196568bdbca98304f2efb17368b57af1a4bb3fc772c026f474/pyelftools-0.25.tar.gz (499kB) Collecting cigam (from apkutils-patch<=0.6.0,>=0.5.4->-r requirements.txt (line 6)) Downloading https://files.pythonhosted.org/packages/3c/d0/19ff49c1938aea4e0076ee084ca23845408cffb51582b2be975f926533b5/cigam-0.0.3-py3-none-any.whl Collecting xmltodict (from apkutils-patch<=0.6.0,>=0.5.4->-r requirements.txt (line 6)) Downloading https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl Building wheels for collected packages: bunch, tornado, apkutils-patch, pyelftools Building wheel for bunch (setup.py): started Building wheel for bunch (setup.py): finished with status 'done' Stored in directory: /root/.cache/pip/wheels/56/0f/19/fbbf81e5764e6d8b74501c4357a88c14c94466ec777c03734c Building wheel for tornado (setup.py): started Building wheel for tornado (setup.py): finished with status 'done' Stored in directory: /root/.cache/pip/wheels/61/7e/7a/5e02e60dc329aef32ecf70e0425319ee7e2198c3a7cf98b4a2 Building wheel for apkutils-patch (setup.py): started Building wheel for apkutils-patch (setup.py): finished with status 'done' Stored in directory: /root/.cache/pip/wheels/43/70/ff/194b6150b109c3143bf17d8821a21cb7060de738038b920c64 Building wheel for pyelftools (setup.py): started Building wheel for pyelftools (setup.py): finished with status 'done' Stored in directory: /root/.cache/pip/wheels/55/2f/15/4ce6885a52f475de68c16f3116a94d2156d588390cdb6c507c Successfully built bunch tornado apkutils-patch pyelftools Installing collected packages: six, bunch, logzero, tornado, certifi, urllib3, idna, chardet, requests, pyelftools, cigam, xmltodict, apkutils-patch, rethinkdb Successfully installed apkutils-patch-0.5.4 bunch-1.0.1 certifi-2019.3.9 chardet-3.0.4 cigam-0.0.3 idna-2.8 logzero-1.5.0 pyelftools-0.25 requests-2.22.0 rethinkdb-2.4.2.post1 six-1.12.0 tornado-6.0.2 urllib3-1.25.3 xmltodict-0.12.0 Removing intermediate container 8faf64de476a ---> 1fa1eb974541 Step 5/6 : ENTRYPOINT [ "scripts/wait-for-db.sh" ] ---> Running in 38527f1e1551 Removing intermediate container 38527f1e1551 ---> b107d738e458 Step 6/6 : CMD ["python", "main.py"] ---> Running in 2c4b41cc5b10 Removing intermediate container 2c4b41cc5b10 ---> 41a3cc6d72f4 Successfully built 41a3cc6d72f4 Successfully tagged atxserver2_web:latest WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating atxserver2_rethinkdb_1 ... done Creating atxserver2_web_1 ... done Attaching to atxserver2_rethinkdb_1, atxserver2_web_1 rethinkdb_1 | Recursively removing directory /data/rethinkdb_data/tmp rethinkdb_1 | Initializing directory /data/rethinkdb_data rethinkdb_1 | Running rethinkdb 2.3.6~0jessie (GCC 4.9.2)... rethinkdb_1 | Running on Linux 4.15.0-34-generic x86_64 rethinkdb_1 | Loading data from directory /data/rethinkdb_data rethinkdb_1 | Listening for intracluster connections on port 29015 rethinkdb_1 | Listening for client driver connections on port 28015 rethinkdb_1 | Listening for administrative HTTP connections on port 8080 rethinkdb_1 | Listening on cluster addresses: 127.0.0.1, 172.18.0.2 rethinkdb_1 | Listening on driver addresses: 127.0.0.1, 172.18.0.2 rethinkdb_1 | Listening on http addresses: 127.0.0.1, 172.18.0.2 rethinkdb_1 | Server ready, "32b5db1e779c_vxj" d1530d1a-a1e6-4c91-ba9a-09343c76dd16 web_1 | RethinkDB is running web_1 | [I 190616 05:21:21 main:70] listen on port http://172.18.0.3:4000 web_1 | [I 190616 05:21:50 web:2246] 302 GET / (172.18.0.1) 1.69ms web_1 | [I 190616 05:21:50 web:2246] 200 GET /login?next=%2F (172.18.0.1) 3.17ms web_1 | [I 190616 05:21:50 web:2246] 200 GET /favicon.ico (172.18.0.1) 34.69ms web_1 | [I 190616 05:22:00 web:2246] 302 POST /login (172.18.0.1) 307.36ms web_1 | [I 190616 05:22:00 web:2246] 302 GET / (172.18.0.1) 9.53ms web_1 | [I 190616 05:22:00 web:2246] 200 GET /devices (172.18.0.1) 18.83ms web_1 | [I 190616 05:22:00 web:2246] 200 GET /static/vendor/fontawesome-5.7.2/css/all.css (172.18.0.1) 1.48ms
在瀏覽器地址欄輸入:http://172.18.0.3:4000/devices,具體的地址見啓動日誌,頁面以下:
至此,說明atx sever部署成功了,pull鏡像的時間略長,耐心等等,接下來就是部署atxserver2-android-provider。
vim .bashrc,在環境變量中加入
SERVER_URL="http://172.18.0.3:4000" # 這個修改爲本身的atxserver2地址 IMAGE="codeskyblue/atxserver2-android-provider"
保存後,source .bashrc 使之生效。而後執行命令:
docker pull $IMAGE
安裝pillow
pip3 install pillow
安裝wediter
pip3 install -U weditor
安裝adb工具
apt-get install android-tools-adb
機器安裝uiautomator2
pip install --pre --upgrade uiautomator2
使用usb線鏈接上手機,打開開發者模式。查看當前機器上掛的設備
stephen@stephen-K55VD:~$ adb devices List of devices attached 9fb1c6ae device
初始化(可選步驟)
python3.6 -m uiautomator2 init
最後執行下面這條命令,該鏡像會把全部必要的資源 (atx-uiautomator.apk, minicap, minitouch, atx-agent) 所有推送到手機上。安裝時須要確認。
docker run --rm --privileged -v /dev/bus/usb:/dev/bus/usb --net host \ ${IMAGE} python main.py --server ${SERVER_URL}
等待一切推送完成後,激動人心的時候到了,打開web端看一下效果。點擊當即使用能夠操做手機。
截至目前,部署成功,來嘗試從別的機器訪問web頁面,發現沒法打開,初步懷疑是防火牆的問題,後排除。致使沒法訪問的緣由是:docker 須要設置端口。
列出容器信息:
stephen@stephen-K55VD:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b0bae8e68a86 codeskyblue/atxserver2-android-provider "python main.py --se…" 12 minutes ago Up 12 minutes affectionate_ardinghelli 7c5284cbdb9e atxserver2_web "scripts/wait-for-db…" 5 hours ago Up 4 hours 0.0.0.0:4000->4000/tcp atxserver2_web_1 32b5db1e779c rethinkdb:2.3.6 "rethinkdb --bind all" 5 hours ago Up 4 hours 8080/tcp, 28015/tcp, 29015/tcp atxserver2_rethinkdb_1
查看容器地址:
docker inspect "web服務所在的容器id"| grep IPAddress stephen@stephen-K55VD:~/atx-server/atxserver2$ docker inspect 7c5284cbdb9e| grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.18.0.3",
設置端口轉發
iptables -t nat -A DOCKER -p tcp --dport 4001 -j DNAT --to-destination 172.18.0.3:4000
而後使用地址:http://本機地址:4001 ,查看本機地址用ifconfig,而後就能夠從其它機器上訪問了。
很是棒的一款工具,開源,簡潔易用,期待更多新特性,不足之處是畫質有點模糊,接下來實踐一下IOS設備如何接入和是否能和appium集成。