惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
S
Security Affairs
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Hacker News: Ask HN
Hacker News: Ask HN
T
Tailwind CSS Blog
SecWiki News
SecWiki News
罗磊的独立博客
The Last Watchdog
The Last Watchdog
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
Hugging Face - Blog
Hugging Face - Blog
T
Tor Project blog
V
Vulnerabilities – Threatpost
Microsoft Azure Blog
Microsoft Azure Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
M
MIT News - Artificial intelligence
Help Net Security
Help Net Security
MongoDB | Blog
MongoDB | Blog
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - Franky
Security Latest
Security Latest
G
GRAHAM CLULEY
C
CERT Recently Published Vulnerability Notes
H
Heimdal Security Blog
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
W
WeLiveSecurity
The Cloudflare Blog
B
Blog RSS Feed
B
Blog
Vercel News
Vercel News
T
Threatpost
小众软件
小众软件
H
Help Net Security
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
Google DeepMind News
Google DeepMind News

晚花行乐

马克卡尼在2026年达沃斯论坛上的讲话(阅读材料) | 晚花行乐 鸡娃如何用力才是恰到好处 | 晚花行乐 读万卷书,行万里路的辩证关系 | 晚花行乐 反对培训机构掐尖招生 | 晚花行乐 小泽和建国会谈最后10分钟全文(阅读材料) | 晚花行乐 来看看 DeepSeek 怎么鸡娃 | 晚花行乐 谈谈基本功 | 晚花行乐 惠普 ProDesk SFF PC 各系列参数对比 | 晚花行乐 解决瘦客户机上安装 Debian 12 启动失败问题 | 晚花行乐 意拾喻言:老外写的文言文 | 晚花行乐 笠翁对韵中的典故(十三元) | 晚花行乐 谈谈中考取消四小门 | 晚花行乐 亚马逊云科技产品免费试用攻略(3) - 对象存储服务 | 晚花行乐 在 Windows 10 LTSC 版本上安装 WSL2 | 晚花行乐 Debian 12 的常用配置项 | 晚花行乐 在 Debian 12 上安装 Nvidia 显卡驱动程序 | 晚花行乐 解决 Debian 12 关机失败问题 | 晚花行乐 解决 VS Code 自动更新版本后卡在连接界面 | 晚花行乐 观看巴黎奥运会有感 | 晚花行乐 在 Windows10 上安装惠普旧打印机驱动程序 | 晚花行乐 欢迎关注公众号:晚花行乐 | 晚花行乐 如何编写拼写检查器 | 晚花行乐 亚马逊云科技产品免费试用攻略(2) - 云服务器 | 晚花行乐 Pandas 中 axis 参数的理解(附实例) | 晚花行乐 我打算命个名,叫什么什么 Manager | 晚花行乐 上海武康路历史建筑一览 | 晚花行乐 Python 实现简单的数学表达式解析并处理 | 晚花行乐 观看马拉松的感悟 | 晚花行乐 Python 保存 Cookies 到文件并再次读取 | 晚花行乐 如何为 Hugo 静态网站添加评论功能 | 晚花行乐 Linux 共享打印服务 CUPS | 晚花行乐 如何为 Hugo 静态网站添加搜索功能 | 晚花行乐 解决 CSV 文件的第一列不能解析 | 晚花行乐 亚马逊云科技产品免费试用攻略(1) - 注册账户 | 晚花行乐 第二幕 Atma 的闲聊 | 晚花行乐 第二幕野蛮人的语音 | 晚花行乐 古入声和普通话平声对照 | 晚花行乐 第一幕的背景音乐 | 晚花行乐 第二幕亚马逊的语音 | 晚花行乐 第一幕的亚马逊的语音 | 晚花行乐 第一幕的野蛮人的语音 | 晚花行乐 MacOS 的彩蛋:Here's to the crazy ones | 晚花行乐 笠翁对韵的基本知识 | 晚花行乐 笠翁对韵中的典故(十二文) | 晚花行乐 笠翁对韵中的典故(十一真) | 晚花行乐 笠翁对韵中的典故(十灰) | 晚花行乐 杭州景点的楹联 | 晚花行乐 adb keycode 大全 | 晚花行乐 Scikit-learn 学习笔记(0)名词术语 | 晚花行乐 Scikit-learn 学习笔记(3)监督学习的例子 | 晚花行乐 SQLite 文档的学习笔记(1)长期支持计划 | 晚花行乐 SQLite 文档的学习笔记(2)测试方法 | 晚花行乐 笠翁对韵中的典故(九佳) | 晚花行乐 Ansible 如何检查一个程序的版本 | 晚花行乐 Ansible 如何检查一个文件夹是否存在 | 晚花行乐 pip 配置文件详解 | 晚花行乐 Ansible 如何检查一个URL是否正常 | 晚花行乐 Ansible 如何修改 iptables 规则 | 晚花行乐 Ansible 指定 playbook 运行的主机 | 晚花行乐 Ansible 如何清空文件夹 | 晚花行乐 Ansible 如何在本机执行命令 | 晚花行乐 笠翁对韵中的典故(八齐) | 晚花行乐 Python 中 Defaultdict 的理解 | 晚花行乐 《伊索寓言》电子书 | 晚花行乐 菲伯尔钢琴伴奏:第二册 | 晚花行乐 Python 的 Keyword-Only Arguments 理解 | 晚花行乐 Python 的 函数参数处理机制 | 晚花行乐 瓦瑞夫在第一幕的闲聊 | 晚花行乐 瓦瑞夫在第一幕的任务提示 | 晚花行乐 第一幕的女巫语音 | 晚花行乐 《Fluent Python》 读书笔记:文本和字节序列 | 晚花行乐 第一幕的罗格语音 | 晚花行乐 第一幕的圣骑士语音 | 晚花行乐 第一幕的男巫语音 | 晚花行乐 第一幕的旁白 | 晚花行乐 第一幕的恶魔 | 晚花行乐 Python 中 Element Tree 的理解 | 晚花行乐 笠翁对韵中的典故(七虞) | 晚花行乐 笠翁对韵中的典故(五微) | 晚花行乐 笠翁对韵中的典故(六鱼) | 晚花行乐 笠翁对韵中的典故(一东) | 晚花行乐 笠翁对韵中的典故(二冬) | 晚花行乐 笠翁对韵中的典故(三江) | 晚花行乐 笠翁对韵中的典故(四支) | 晚花行乐 姜太公钓鱼 | 晚花行乐 武王建立周朝 | 晚花行乐 大禹治水 | 晚花行乐 尧舜让位 | 晚花行乐 黄帝战蚩尤 | 晚花行乐 上下五千年-精简版 | 晚花行乐 成功修复鼠标按键 | 晚花行乐 横向的Word文档怎么加页眉页脚 | 晚花行乐 商标通用化的故事:商标代替商品名 | 晚花行乐 搜索空文件夹的批处理程序 | 晚花行乐 Sn0wbreeze不能运行? | 晚花行乐 天线的驻波比 | 晚花行乐 天线参数:增益Gain | 晚花行乐 天线参数:方向图Radiation pattern | 晚花行乐 本拉登别墅的Google Earth坐标 | 晚花行乐 宜家帕克斯(PAX)衣柜的拼装过程 | 晚花行乐
当selenium遇上docker | 晚花行乐
2017-09-19 · via 晚花行乐

Selenium 的后浪们

背景

selenium( 官网链接 )是我们开展web ui 自动化测试的利器,可以很方便的用代码模拟人工在浏览器上的操作,实现 BDD(Behavior-driven development),节约大量的人力。

然而,selenium在实际使用又有些痛处:

  • 往往需要在 windows 主机上安装、运行浏览器(比如chrome),甚至同时安装多种浏览器,不利于在 Linux 命令行下自动化执行
  • 浏览器版本难以管理,回退到特定的版本比较困难
  • 持续集成时需要配置 windows 节点机
  • 需要为每种浏览器配置 webdriver

所以我们期望有这样的特点:

  • 在 Linux 命令行下启动 headless 无界面浏览器
  • 方便启动和销毁特定版本的浏览器
  • 一体化,减少多个服务的安装配置
  • 自带 webdriver

docker-selenium 项目实现了上述这些特点。

docker-selenium项目

docker-selenium项目( 镜像仓库 , 代码仓库 )是将 selenium、webdriver、VNC server、chrome(或者firefox)集成在一个docker镜像里的项目。提供如下的功能:

  • 代替原有的 remote webdriver
  • 单个容器就能提供全套 selenium+webdriver+headless 浏览器的功能
  • 几个容器配合就能完全代替 selenium grid(目前仅限chrome和firefox)
  • 包含 VNC server(远程桌面),方便远程调试 headless 浏览器
  • 全部在 linux 环境下执行,无需设置 windows 节点机,方便自动化
  • 方便自定义 Dockerfile ,用户可以自己制作镜像

在享用这个项目带来的方便的同时,我们要向那些做出贡献的志愿者致敬,引用代码仓库里的一句话:

The project is made possible by volunteer contributors who have put in thousands of hours of their own time.

(如果没有志愿者上千小时的无私奉献,这个项目就无法与您见面。)

镜像分类

项目包括下列 docker 镜像:

selenium/base: 包括 Selenium Server Jar包的基础镜像
selenium/hub: Selenium Grid Hub 节点
selenium/node-base: Selenium Node 节点的基础镜像
selenium/node-chrome: 安装有 Chrome 的 Selenium Node 节点镜像
selenium/node-firefox: 安装有 Firefox 的 Selenium Node 节点镜像
selenium/node-chrome-debug: 安装有 Chrome 的 Selenium Node 节点镜像,包含远程桌面
selenium/node-firefox-debug: 安装有 Firefox 的 Selenium Node 节点镜像,包含远程桌面
selenium/standalone-chrome: 安装有 Chrome,独立运行的 Selenium,详见介绍
selenium/standalone-firefox: 安装有 Firefox,独立运行的 Selenium,详见介绍
selenium/standalone-chrome-debug: 安装有 Chrome,独立运行的 Selenium,包含远程桌面,详见介绍
selenium/standalone-firefox-debug: 安装有 Firefox,独立运行的 Selenium,包含远程桌面,详见介绍

Standalone-debug 镜像

以 standalone-xxxxx-debug 命名的镜像

standalone 表示可以独立运行,对外提供 selenium 服务,debug 代表有远程桌面

有以下特点:

  • 包含 selenium server,使用4444端口
  • 包含 headless 浏览器
  • 包含浏览器对应的webdriver
  • 包含虚拟桌面Xvfb
  • 包含VNC server,使用 5900 端口

这类镜像应用场合是:提供远程桌面,方便调试。

Standalone 镜像

所有 standalone-xxxxx 命名的镜像

有以下特点:

  • 包含 selenium server,使用4444端口
  • 包含 headless 浏览器
  • 包含浏览器对应的webdriver

应用场景如下图:

这类镜像的特点:不需要远程桌面,节省资源,独立运行。适合正式运行的场合。

hub 镜像 + node 镜像

hub 是集中管理节点,集中对外提供服务。node 是分布式的浏览器节点,受 hub 节点的控制。

上面的一体化镜像 中的 selenium 和浏览器做了分离,方便以一个 hub 控制多个浏览器 node。有这些特点:

  • hub容器对外暴露4444端口,接受请求
  • 每个 node 容器 应该通过 link 或者 network 方式与 hub 容器建立连接
  • debug 结尾的 node 容器还包含了 VNC server 供调试

基础镜像

镜像库用来生成其他node镜像,不可以直接运行。

docker 代替 remote webdriver

我们先看看 Remote webdriver 是怎么运行的

  • Python语言
driver = webdriver.Remote("http://localhost:4444/wd/hub", \
             webdriver.DesiredCapabilities.FIREFOX.copy())
driver.get("https://www.google.com")
  • Java语言
WebDriver driver = new RemoteWebDriver(
                        new URL("http://localhost:4444/wd/hub"), 
                        DesiredCapabilities.firefox());
  • UiRecorder 工具
{
    "webdriver": "127.0.0.1:4444"
}

上面三段代码的共同点是 webdriver 在4444端口提供服务,接下来我们通过 docker 容器对外提供相同的服务。

运行 Standalone 镜像

以 standalone-chrome-debug 为例:

$ docker pull selenium/standalone-chrome-debug

然后启动容器,基本命令如下:

$ docker run -d --name chrome --rm \
            -p 4444:4444 \
            -p 5900:5900 \
            selenium/standalone-chrome-debug

上面这条命令的参数含义如下:

  • -d, 表示不附着容器,使容器在后台运行
  • –name 是给容器指定名称 chrome
  • –rm 容器运行结束后即删除,方便调试
  • -p 4444:4444 暴露宿主机的4444端口到容器的4444端口,提供 webdriver 服务;
  • -p 5900:5900 暴露宿主机的5900端口,提供 VNC 远程桌面服务,如果是在 Mac 上运行 docker 容器,有可能5900端口已使用,可以换为5901端口,写法是 -p 5901:5900

观察启动日志的内容

如果不带-d参数运行上面的命令,就能在命令行看到 selenium standalone server 和 xvfb VNC server启动的过程:

Waiting xvfb...
15:28:30.510 INFO - Selenium build info: version: '3.5.0', revision: '8def36e068'
15:28:30.510 INFO - Launching a standalone Selenium Server
......
15:28:30.734:INFO:osjs.Server:main: Started @420ms
15:28:30.734 INFO - Selenium Server is up and running      # 这一步 Selenium 服务已启动
15:28:30 passing arg to libvncserver: -rfbport
15:28:30 passing arg to libvncserver: 5900
15:28:30 -usepw: found /home/seluser/.vnc/passwd
15:28:30 x11vnc version: 0.9.13 lastmod: 2011-08-10  pid: 51
......
15:28:30 X display :99.0 is 32bpp depth=24 true color
15:28:30
15:28:30 Listening for VNC connections on TCP port 5900      # 这一步 VNC 服务工作在5900端口
15:28:30 Listening for VNC connections on TCP6 port 5900
......
15:28:30 screen setup finished.
......

docker 容器代替了原来的 selenium webdriver 服务,不需要改动原先的测试脚本,就可以更换为 docker 容器内部的 selenium

如何使用docker compose启动chrome容器

虽然 上面docker run 命令可以方便的启动容器,但是当参数多起来的时候,未免有些不方便,这时可以用docker compose 方便的启动 chrome 容器。只需要编写一个docker-compose.yaml文件,例如下面这样:

version: '2'
services:
  chrome: 
    container_name: chrome
    image: path/to/your/images 
    ports: 
      - 4444:4444  # for webdriver 
      - 5901:5900  # for VNC viewer 
    environment: 
      SCREEN_WIDTH: 1920  # set for xvfb 
      SCREEN_HEIGHT: 1080 
    volumes:
      - "/dev/shm:/dev/shm"
    extra_hosts:
      - "some.domain.of.yours:10.0.0.1"

上面yaml文件里,一些参数的解释:

  • 网络模式
    可以采用 host 网络模式,直接绑定主机 4444 和 5900 端口,不需要再设置端口映射; 如果主机的这两个端口已经被占用,则不能使用host模式,需要用 port 指定端口映射(如上面的例子)。

  • 虚拟桌面的大小
    SCREEN_WIDTHSCREEN_HEIGHT 指定虚拟桌面的分辨率

  • 共享内存
    当同时开启多个 chrome 时,多个chrome 实例会崩溃退出,这时使用 volumes:"/dev/shm:/dev/shm" 将宿主机的共享内存给容器内部使用,见 内存问题 一节。

  • 内置DNS
    最后一行的 extra_hosts 起到一个内部解析域名功能,方便指向你需要的测试环境主机,上面例子里,在容器内,将 some.domain.of.yours 域名解析为 10.0.0.1,这样你可以放心的在UI测试代码里指定访问 some.domain.of.yours 这个域名,而不用在意这个域名是否真正存在。

容器运行起来后,具体的使用将在下一篇 当selenium遇上docker (二) 介绍。

各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

精彩评论