selenium grid + appium docker部署

597 阅读3分钟

docker 搭建 Selenium Grid
【参考】
github.com/SeleniumHQ/… www.cnblogs.com/xyztank/art… medium.com/geekculture…

一. selenium-grid

  1. 单机版
  • 创建docker-compose.yml vim docker-compose.yml

    编辑

# To execute this docker-compose yml file use `docker-compose -f docker-compose-v3-full-grid.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose-v3-full-grid.yml down`

version: "3"
services:
  selenium-event-bus: # 这个不要改
    image: selenium/event-bus
    container_name: selenium-event-bus
    ports:
      - "4442:4442"
      - "4443:4443"
      - "5557:5557"

  selenium-sessions: # 这个不要改
    image: selenium/sessions
    container_name: selenium-sessions
    ports:
      - "5556:5556"
    depends_on:
      - selenium-event-bus
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  selenium-session-queue: # 这个不要改
    image: selenium/session-queue
    container_name: selenium-session-queue
    ports:
      - "5559:5559"
    depends_on:
      - selenium-event-bus
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  selenium-distributor: # 这个不要改
    image: selenium/distributor
    container_name: selenium-distributor
    ports:
      - "5553:5553"
    depends_on:
      - selenium-event-bus
      - selenium-sessions
      - selenium-session-queue
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_SESSIONS_MAP_HOST=selenium-sessions
      - SE_SESSIONS_MAP_PORT=5556
      - SE_SESSION_QUEUE_HOST=selenium-session-queue
      - SE_SESSION_QUEUE_PORT=5559

  selenium-router:
    image: selenium/router
    container_name: selenium-router
    ports:
    # 这个可以修改左边的4444,右边的4444不能改。左边的是4444宿主机Grid访问接口!
    # 使用 ip:4444可以访问router网页,查看当前连接的node和session
    # selenium自动化远程执行就是连接router,左边的端口就是入口,映射到右边的容器内端口
      - "4444:4444"
    depends_on:
      - selenium-distributor
      - selenium-sessions
      - selenium-session-queue
    environment:
      - SE_DISTRIBUTOR_HOST=selenium-distributor
      - SE_DISTRIBUTOR_PORT=5553
      - SE_SESSIONS_MAP_HOST=selenium-sessions
      - SE_SESSIONS_MAP_PORT=5556
      - SE_SESSION_QUEUE_HOST=selenium-session-queue
      - SE_SESSION_QUEUE_PORT=5559

  chrome: # 这是 Node
    image: selenium/node-chrome
    volumes: 
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-event-bus
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus #不能改
      - SE_EVENT_BUS_PUBLISH_PORT=4442 #不能改
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 #不能改
      - SE_NODE_MAX_SESSIONS=5  # 添加这个参数能让一个容器运行多个浏览器窗口(跑多个job)
      - SE_NODE_OVERRIDE_MAX_SESSIONS=true # 如果添加了SE_NODE_MAX_SESSIONS,则这个参数必须添加
      - SCREEN_HEIGHT=1080
      - SCREEN_WIDTH=1920  # 容器浏览器分辨率
      #- SE_VNC_NO_PASSWORD=1 #VNC不用输入密码即可访问
    ports:
      - "5901:5900" # 下载VNC Viewer软件,新建会话 ip:5901 ,能看到容器中运行的浏览器窗口,密码secret
      - "7901:7900" #  浏览器中直接访问 ip:7901 , 能看到容器中运行的浏览器窗口,密码secret。如果noVNC连不上说明网络有防火墙。

  chrome2:
    image: selenium/node-chrome
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-event-bus
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_MAX_SESSIONS=5
      - SE_NODE_OVERRIDE_MAX_SESSIONS=true
      - SCREEN_HEIGHT=1080
      - SCREEN_WIDTH=1920
    ports:
      - "5904:5900"
      - "7904:7900"

  firefox:
    image: selenium/node-firefox
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-event-bus
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_MAX_SESSIONS=5
      - SE_NODE_OVERRIDE_MAX_SESSIONS=true
      - SCREEN_HEIGHT=1080
      - SCREEN_WIDTH=1920
      - SE_VNC_NO_PASSWORD=1
    ports:
      - "5902:5900"
      - "7902:7900"
      
  edge:
    image: selenium/node-edge
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-event-bus
    environment:
      - SE_EVENT_BUS_HOST=selenium-event-bus
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_VNC_NO_PASSWORD=1
    ports:
      - "5903:5900"
      - "7903:7900"
  • 启动docker-compose.yml docker-compose -f docker-compose.yml up -d

  • 停止docker-compose docker-compose -f docker-compose.yml down

  • 访问 http://10.219.21.4:4444/ui

  1. 多机器集群版

通过docker swarm实现

  • 在master机器上初始化docker swarm, docker swarm init
  • 执行后,记住下面的token
Swarm initialized: current node (gvkk2enrwtz5eb6wnmy96kn3e) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-440lc8co2d5h90mv6ztw2ii9866j3w2b71nq2mqm5oeddayd8i-aymg2ow9kty5pn6ue4o7ln7mr 10.219.21.4:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

  • 在worker机器上执行
docker swarm join --token SWMTKN-1-440lc8co2d5h90mv6ztw2ii9866j3w2b71nq2mqm5oeddayd8i-aymg2ow9kty5pn6ue4o7ln7mr 10.219.21.4:2377
  • 通过docker info命令在master机器上查看swarm信息
...
Swarm: active
...
Nodes: 2

说明配置正常

  • 配置docker-compose.yml

    编辑

# To start Docker in Swarm mode, you need to run `docker swarm init`
# To deploy the Grid, `docker stack deploy -c docker-compose-v3-swarm.yml grid`
# Stop with `docker stack rm grid`
# Stop swarm mode `docker swarm leave --force`

version: '3.7'


services:
  chrome:
    image: selenium/node-chrome
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    deploy:
      replicas: 4
    entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh'
    volumes:
      - type: tmpfs
        target: /dev/shm
        tmpfs:
           size: 2048000000 # (this means 2GB)

  edge:
    image: selenium/node-edge
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    deploy:
      replicas: 1
    entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh'
    volumes:
      - type: tmpfs
        target: /dev/shm
        tmpfs:
           size: 2048000000 # (this means 2GB)

  firefox:
    image: selenium/node-firefox
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    deploy:
      replicas: 1
    entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh'
    volumes:
      - type: tmpfs
        target: /dev/shm
        tmpfs:
           size: 2048000000 # (this means 2GB)

  selenium-hub:
    image: selenium/hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == worker
    environment:
      - GRID_BROWSER_TIMEOUT=60000
      - GRID_TIMEOUT=60000
      - GRID_MAX_SESSION=50
      - GRID_MAXINSTANCES=3
      - GRID_CLEAN_UP_CYCLE=60000
      - GRID_UNREGISTER_IF_STILL_DOWN_AFTER=180000
      - GRID_NEW_SESSION_WAIT_TIMEOUT=60000
  • 启动 docker stack deploy --compose-file selenium-grid.yaml selenium-grid

  • 停止 docker stack ls docker stack rm selenium-grid

  • 访问 http://worker-ip:4444/ui

二. appium

appium安装(需要安装nodejs和npm) npm install -g appium

android sdk安装

下载www.androiddevtools.cn/

123123123131.jpg

解压tar -x -f androiddk_r24.4.1-linux.tgz

移动下位置 mv android-sdk-linux/ /usr/local

配置环境变量vim ~/.bashrc

# android sdk
export ANDROID_SDK_HOME=/usr/localandroid-sdk-linux
export PATH=$PATH:${ANDROID_SDK_HOME}/tools
export PATH=$PATH:${ANDROID_SDK_HOME}/platform-tools

# java jdk
export JAVA_HOME=/opt/jdk1.8.0_271
export CLASSPATH=.:${JAVA_HOME}/lib:$CLASSPATH
export PATH=${JAVA_HOME}/bin:$PATH

然后 source ~/.bashrc

配置完成后通过appium-doctor检查一下appium的依赖是否都已经安装好了,没有的话缺什么补什么

appium-doctor 通过npm安装,npm install -g appium-doctor

如果提示路径里没有adb, 输入android,会弹出android sdk安装界面,根据提示安装build tools和platform 等。

111111.jpg

执行appium-doctor还警告缺少一下依赖

WARN AppiumDoctor  ✖ opencv4nodejs cannot be found.
WARN AppiumDoctor  ✖ ffmpeg cannot be found
WARN AppiumDoctor  ✖ mjpeg-consumer cannot be found.
WARN AppiumDoctor  ✖ bundletool.jar cannot be found

(可选)安装依赖
opencv4nodejs

sudo apt update 
sudo apt install libopencv-dev python3-opencv

# 验证
pkg-config --modversion opencv4

npm install -g opencv4nodejs

appium启动脚本

#!/bin/bash

echo "Starting appium..."

nohup appium --address 0.0.0.0 --port 4723 --session-override --log-timestamp --local-timezone --log appium.log >>/dev/null 2>&1 &

appium停止脚本

#!/bin/bash

echo 'Stoping appium...'
ps -ef |grep appium |grep -v grep |awk '{print $2}' |xargs kill -9

此时,就可以使用python/java等客户端连接appium了

appium grid设置
文档:appium.io/docs/cn/adv…