高效自动化测试框架-优秀实践03-使用SeleniumGrid

高效自动化测试框架-优秀实践03-使用SeleniumGrid

Docker安装

  1. 切换管理权限 su root

  2. 安装Docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2

  3. 配置依赖下载源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  4. 安装docker yum makecache fast && yum -y install docker-ce

  5. 检查docker状态为loaded

    systemctl status docker

    systemctl start docker

SeleniumServer安装

实际上可以使用jar包安装,docker方式安装,k8s方式安装,考虑到直接jar包安装不稳定,k8s相对复杂,那就直接docker安装好了

使用 Hub 与 Node 分工的方式启动 Grid 的 Docker 命令如下:

# 创建网络
docker network create grid
​
# 启动 Hub
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.4.0
​
# 启动一个 Chrome Node
docker run -d -p 7900:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
    --shm-size="2g" \
    -e SE_EVENT_BUS_PUBLISH_PORT=4442 \
    -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
    selenium/node-chrome:4.4.0

还可以按需添加别的浏览器 Node,如下命令添加了 Edge 和 Firefox Node。

# 添加一个 Edge Node
docker run -d -p 7901:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
    --shm-size="2g" \
    -e SE_EVENT_BUS_PUBLISH_PORT=4442 \
    -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
    selenium/node-edge:4.4.0
​
# 添加一个 Firefox Node
docker run -d -p 7902:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
    --shm-size="2g" \
    -e SE_EVENT_BUS_PUBLISH_PORT=4442 \
    -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
    selenium/node-firefox:4.4.0

实际的调用代码

from selenium import webdriver
from config.selenium_grid import *
from selenium.webdriver import Firefox, Chrome, FirefoxProfile, ChromeOptions
​
​
class WebDriver:
    def __init__(self):
        self.web_driver = None
        pass
​
    def get_web_driver(self):
        # 判断是否需要使用remote的driver
        if use_selenium_grid:
            # TODO 需要对获取不到driver的情况做异常处理
            self.web_driver = webdriver.Remote(
                # selenium_grid_command_executor = 'http://192.168.0.105:4444'
                command_executor=selenium_grid_command_executor,
                options=webdriver.ChromeOptions()
            )
        else:
            # 初始化本地的web_driver
            self._init_chrome()
        return self.web_driver
​
    def _init_firefox(self):
        profile = FirefoxProfile()
        self.web_driver = Firefox(profile)
​
    def _init_chrome(self):
        options = ChromeOptions()
        config = dict()
        config['profile.default_content_settings.popups'] = 0
        print("options", options)
        self.web_driver = Chrome(options=options)
​

上面的代码中,会去读取配置,如果配置中需要使用selenium_grid, 则低啊用selenium_grid的driver,否则直接初始化本地的web_driver

安装命令参考

序号 安装场景 安装命令
1 jar包方式_standalone模式 java -jar selenium-server-.jar standalone
2 jar包方式_使用 Hub 与 Node 分工的方式来启动 Grid # 启动 Hub java -jar selenium-server-.jar hub # 启动 Node 1 java -jar selenium-server-.jar node --port 5555 # 启动 Node 2 java -jar selenium-server-.jar node --port 6666
3 Docker方式_Standalone 模式 # 启动一个 Chrome Standalone Grid docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-chrome:4.4.0
4 Docker方式_使用 Hub 与 Node 分工的方式来启动 # 创建网络 docker network create grid # 启动 Hub docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.4.0 # 启动一个 Chrome Node docker run -d -p 7900:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ --shm-size="2g" \ -e SE_EVENT_BUS_PUBLISH_PORT=4442 \ -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \ selenium/node-chrome:4.4.0
5 Docker方式增加Node # 添加一个 Edge Node docker run -d -p 7901:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ --shm-size="2g" \ -e SE_EVENT_BUS_PUBLISH_PORT=4442 \ -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \ selenium/node-edge:4.4.0 # 添加一个 Firefox Node docker run -d -p 7902:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \ --shm-size="2g" \ -e SE_EVENT_BUS_PUBLISH_PORT=4442 \ -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \ selenium/node-firefox:4.4.0

具体的项目地址

https://github.com/WaterLoran/LoranTest

待改进的地方

  1. 获取web_driver失败的时候,需要做异常处理

  2. 期望增加装饰器,支持在用例层面设置使用本地还是远端的driver

  3. 所调用的selenium_grid中的web_driver启动非常慢,并且页面比较小,和本地的浏览器不一样,需要做额外的处理

参考博客地址: Selenium Grid 搭建及使用 - 磊磊落落

你可能感兴趣的:(docker,容器)