• docker seleniumgrid 问题解决


    Docker Selenium Grid 配置

    通过 Docker 方式启动

    Docker images for Selenium Grid Server (Standalone, Hub, and Nodes)

    拉取镜像

    查看版本信息 docker-selenium

    1
    docker pull selenium/hub:3.14.0
    1
    docker pull selenium/node-chrome:3.14.0

    启动主hub

    1
    docker run -d -P --name selenium-hub selenium/hub:3.14.0

    启动分组node-chrome

    1
    docker run -d --link selenium-hub:hub selenium/node-chrome:3.14.0

    –link 通过 link 关联 selenium-hub 容器,并为其设置了别名hub

    通过 docker-compose 方式启动

    docker-compose.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    version: "3"
    services:
    selenium-hub:
    image: selenium/hub:3.14.0-iron
    container_name: selenium-hub
    ports:
    - "4444:4444"
    chrome:
    image: selenium/node-chrome:3.14.0-iron
    depends_on:
    - selenium-hub
    environment:
    - HUB_HOST=selenium-hub
    - HUB_PORT=4444
    firefox:
    image: selenium/node-firefox:3.14.0-iron
    depends_on:
    - selenium-hub
    environment:
    - HUB_HOST=selenium-hub
    - HUB_PORT=4444

    目前使用的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    # To execute this docker-compose yml file use `docker-compose -f <file_name> up`
    # Add the `-d` flag at the end for detached execution
    version: "3"
    services:
    selenium-hub:
    image: selenium/hub:3.141.59-lithium
    # container_name: selenium-hub
    environment:
    - GRID_MAX_SESSION=10
    # - newSessionWaitTimeout=25000
    - JAVA_OPTS=-Xmx512m
    # - SE_OPTS="-debug"
    ports:
    - "4444:4444"
    chrome:
    image: selenium/node-chrome-debug:3.141.59-lithium
    volumes:
    - /dev/shm:/dev/shm
    depends_on:
    - selenium-hub
    environment:
    - HUB_HOST=selenium-hub
    - HUB_PORT=4444
    - NODE_MAX_INSTANCES=10
    - NODE_MAX_SESSION=10
    - SCREEN_WIDTH=1366
    - SCREEN_HEIGHT=768
    - SCREEN_DEPTH=24
    ports:
    - "5900:5900"
    firefox:
    image: selenium/node-firefox-debug:3.141.59-lithium
    volumes:
    - /dev/shm:/dev/shm
    depends_on:
    - selenium-hub
    environment:
    - HUB_HOST=selenium-hub
    - HUB_PORT=4444
    - NODE_MAX_INSTANCES=10
    - NODE_MAX_SESSION=10
    - SCREEN_WIDTH=1366
    - SCREEN_HEIGHT=768
    - SCREEN_DEPTH=24
    ports:
    - "5901:5900"

    vnc 密码:secret

    踩坑记

    1.Docker selenium 中文乱码,未验证

    3.141.59-lithium 这个版本打开 gbk 编码的网站没有问题,例如:“163.com”

    Dockerfile

    1
    2
    3
    4
    5
    6
    7
    FROM selenium/node-chrome-debug

    USER root

    RUN apt-get update
    && apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei
    && apt-get clean

    构建

    1
    docker build -t selenium/node-chrome-debug-zh-cn .

    2. 窗口最大化失败

    在脚本中对浏览器进行最大化操作:driver.maximize_window()这个命令一向运行是没问题的,但是在docker 中却报错如下:
    Message: unknown error: failed to change window state to maximized, current state is normal

    原因:docker 运行 node 没有设置屏幕尺寸。

    1
    2
    3
    - SCREEN_WIDTH=1366
    - SCREEN_HEIGHT=768
    - SCREEN_DEPTH=24

    或者:

    查了一下,说是selenium 的bug。 找了一下,没有合适的解决方案,粗暴解决如下:

    1
    2
    3
    4
    5
    try:
    driver.maximize_window()
    except WebDriverException as e:
    log.log().logger.info(e)
    driver.set_window_size(1920, 1080) #如果最大化失败,设置窗口大小为 1920*1080

    3. chrome option 不生效。

    因为部分用例需要模拟移动设备,或设置浏览器为英文,所以使用 chrome option进行设置。 原来的初始化脚本如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    desired_caps_web = webdriver.DesiredCapabilities.CHROME
    deviceList = ['Galaxy S5', 'Nexus 5X', 'Nexus 6P', 'iPhone 6', 'iPhone 6 Plus', 'iPad', 'iPad Pro']
    if devicename!='' :
    if devicename not in deviceList:
    devicename = deviceList[2]
    chrome_option = {
    'args': ['lang=en_US','start-maximized'],
    'extensions': [], 'mobileEmulation': {'deviceName': ''}

    }
    chrome_option['mobileEmulation']['deviceName'] = devicename
    else:
    chrome_option = {
    'args': ['lang=en_US','--start-maximized'],
    'extensions': []
    }
    desired_caps_web['goog:chromeOptions']=chrome_option
    log.log().logger.info(desired_caps_web)
    driver = webdriver.remote.webdriver.WebDriver(command_executor=server_url,desired_capabilities=desired_caps_web)

    但同样,之前一直正常运行的脚本,到 docker 里不起作用。
    看下docker selenium node 节点的log ,发现打印了如下信息:

    1
    Capabilities are: Capabilities {browserName: chrome, chromeOptions: {args: [lang=zh_CN.UTF-8],  mobileEmulation: {deviceName: iPhone 6}}, goog:chromeOptions: {}, javascriptEnabled: true, version: }

    多了个 goog:chromeOptions {} 的配置项是怎么回事?

    认真看下,Capabilities 里我设置的 chromeOptions 已经正确传进来了,但是后面的 goog:chromeOptions: {} 似乎覆盖了对应的配置。
    尝试下把脚本里的参数名称从 “chromeOptions ” 改为 “goog:chromeOptions” ,奇迹出现了:

    1
    Capabilities are: Capabilities {browserName: chrome, goog:chromeOptions: {args: [lang=zh_CN.UTF-8], mobileEmulation: {deviceName: iPhone 6}}, javascriptEnabled: true, version: }

    脚本也能正常运行了,对应的浏览器语言、移动设备模拟设置也已生效!

    于是修改对应脚本为:

    1
    desired_caps_web['goog:chromeOptions']=chrome_option

    问题解决!

  • 相关阅读:
    pycharm破解补丁的使用
    C# 解析JSON格式数据
    LINQ to DataSet的DataTable操作
    日期格式化
    vue scoped原理
    vue父子组件生命周期执行顺序
    js判断同一天和同一周
    flex总结
    react-router v4 参数传递
    link标签rel="alternate"属性的作用及用法
  • 原文地址:https://www.cnblogs.com/Neotester/p/12745123.html
Copyright © 2020-2023  润新知