当前位置: 首页 > 质量专栏 > 如何在Docker中运行Selenium测试?
如何在Docker中运行Selenium测试?
2021-07-15 浏览次数3148

一、Docke概述

1.Docker简介:

Docker是 dotCloud公司于2013年初发明的一个开源的容器化平台,用Go语言编写,该项目开源以后,项目代码在 GitHub 上进行维护。Docker有助于帮助程序开发人员以安全的方式创建、部署和运行应用程序,屏蔽代码层次的差异,缩短从代码测试到产品部署的时间,Docker这些优势使得这个项目自开源后就被程序员广泛讨论和使用。

2.选择Docker的原因:

(1)开发环境帮助提高工作效率:Docker容器能够帮助开发人员、系统管理员、QA和版本控制工程师在一个生产环节中一起协同工作。Docker的容器标准使得而容器发生变化时,程序开发人员只需要专注于自己的代码即可,无需另外注意容器环境的变化,从而为开发人员提高工作效率提供必要的保障。

(2)构建方式简单:构建方式简单有助于组织新人快速理解一个应用程序从构建到运行的全部过程。

(3)容器启动时间迅速:Docker是一个轻量级的容器平台,启动时间迅速,减少开发、部署和测试的时间。

(4)适应多种环境:Docker可以在桌面环境、物理主机、虚拟主机等多种环境中部署。

二、如何在Windows上安装和设置Docker

在Docker容器中运行Selenium测试之前,我们需要在Windows上安装和设置Docker。首先,下载Windows版本的Docker。desktop for Windows 10是一个原生的Windows应用程序,它为构建、运行和交付Docker化的应用程序提供了一个易于使用的开发环境。它支持Linux和基于Windows的容器。在以下的演示中,将使用基于Linux的容器。

双击“窗口安装程序的Docker”运行安装程序。安装非常简单。

Windows的Docker需要WSL 2(Linux的Windows子系统)支持。选择启用Hyper-V Windows功能和安装WSL 2所需的Windows组件的必要选项。

安装成功后,你会收到以下消息。

三、在Docker中创建Selenium测试

与普通的Selenium Grid一样,带有Docker的Selenium Grid的配置包括在容器中安装Selenium Hub和所需的浏览器节点。

使用Selenium Docker容器可以以不同的方式运行Selenium测试。Selenium可以在独立(或单个)Docker容器上运行,也可以在由多个容器组成的Grid上运行。

1.在独立容器中运行Selenium

在本“如何在Docker中运行Selenium测试”指南中,我们使用一个容器来启动所有测试。首先,我们必须从Docker Hub下载Docker镜像。假如想要在Chrome和Firefox浏览器上执行测试时,就可以下载Chrome和 Firefox容器的镜像。

以管理员身份在终端(命令提示符或Power Shell)上运行以下命令:

下载镜像后,运行命令docker镜像来验证下载是否成功。如下图所示,我们看到最新版本的Chrome和Firefox容器可供使用:


(1)独立的Chrome (最新)

(2)独立的Firefox

你也可以通过导航到Docker Hub并搜索所需的图像来下载容器镜像的特定版本。例如,命令docker pull selenium/standalone-chrome:87.0将下载Chrome容器的87.0版本。

下载镜像后,运行命令docker镜像来验证下载是否成功。如下图所示,我们看到最新版本的Chrome和Firefox容器可供使用:

 连接到网络驱动程序的默认端口是4444,Chrome和Firefox容器将暴露给端口4444。因为我们想针对Chrome和Firefox浏览器运行Selenium测试,所以我们使用Chrome容器的端口4445和Firefox容器的端口4446。

运行端口号上显示的容器4445要连接到Chrome网络驱动程序:

运行端口号上显示的容器4446要连接到FireFox网络驱动程序:

如下图所示,Chrome和Firefox docker容器已成功启动:

在Windows PowerShell上运行docker ps命令显示Chrome和Firefox Docker容器已经准备好使用了:

现在我们必须配置远程网络驱动程序的网址:

Chrome容器

FireFox容器

现在,我们已经触及了Chrome和Firefox启动单个Docker容器的要点,让我们看看完整的执行。

安装启动

基于从testng.xml传递的参数“environment”,测试在Chrome或Firefox浏览器上运行。

Chrome容器远程网址为http://localhost:4445/wd/hub

FireFox容器远程网址为http://localhost:4446/wd/hub

执行

这样,我们都可以在各自的容器中运行测试。如容器截图所示,Chrome浏览器(或Chrome驱动程序)的两个实例在Chrome Docker容器(运行在端口号4445上)上被实例化

类似地,FireFox浏览器(或GeckoDriver)的两个实例在FireFoxDocker容器(运行在端口号4446上)上被实例化

测试是以headless的方式执行的,因为我们没有安装具有VNC的Docker镜像。如下所示,测试成功执行:

要查看容器内发生的情况,我们需要下载独立-chrome-调试和独立-FireFox-调试预先安装了VNC的图像。在独立容器中执行测试的主要缺点是可伸缩性低。因此,在独立容器中运行Selenium只适合小型项目。

2.在容器 Grid 中运行Selenium

第一个选项带来的可伸缩性问题可以通过在容器Grid中运行Selenium来解决。在大型项目中,你可能希望Selenium web自动化测试在不同的浏览器和操作系统组合上并行进行。这就是不同容器的Grid可以用来加速跨浏览器测试活动的地方。

使用这种方法,你可以获得许多不同浏览器(和浏览器版本)的实例。例如,你可以拥有Chrome v83.0的“X”实例、Chrome v76.0的“y”实例、Firefox 68.0的“Z”实例等等。可以针对各种浏览器的不同版本并行执行测试。

SeleniumGrid体系结构

这种方法使用Selenium Grid的“中枢/节点”模型。测试请求由客户端(或测试代码)发送到Hub,然后Hub将测试请求分派到最适合执行测试的节点。

为了演示如何使用容器Grid在Docker中运行Selenium测试,我们使用了最适合开发环境的设置。我们将使用调试变量节点或独立镜像,这样我们就可以使用VNC查看器在Docker中看到正在运行的测试。

默认情况下,调试镜像在端口号5900上启动VNC服务器。但是,默认端口可以重新映射到当前未使用的任何外部端口。

获取所需的Docker镜像

Grid是由多个Docker镜像组成的,在我们使用Hub和Nodes之前,应该首先提取这些镜像。

默认情况下,会下载最新版本的容器镜像。下面显示的截图表明Chrome和Firefox的Hub镜像和调试镜像已成功拉出。

运行命令docker镜像,以确保成功提取所有镜像。

安装了Chrome和Firefox的Grid节点必须连接到Grid中心。现在我们已经有了所需的图像,我们可以遵循以下方法之一在容器Grid中运行Selenium:

触发docker run命令,一次运行并启动一个容器。

使用docker-compose(或compose)来定义和运行多容器docker应用程序,并配置应用程序服务。

在第一种方法中,我们手动运行所需的命令来启动Selenium Hub,并将所需的浏览器节点(或图像)连接到Hub。这种方法最适合少量的测试,因为Hub和节点必须使用必要的命令手动启动。

在docker-compose(或compose)中,你使用YAML文件来配置应用程序服务。只需一个命令,你就可以从配置中灵活地创建和启动所有服务。使用Compose的另一个好处是,它可以在一系列环境中工作,例如试运行、生产、开发、测试和CI工作流。

如何使用Docker运行启动Docker容器

在这里,我们使用docker run命令来启动下载的Selenium镜像。一旦Hub启动,我们将Chrome和Firefox节点连接到Hub,这样Selenium web自动化测试就可以在其上执行。

以下是docker运行命令的语法:

docker运行命令应该强制指定一个图像来派生容器。让我们使用docker run命令启动Hub并将节点连接到它。

运行Selenium枢纽

一旦提取了所需的Docker镜像,我们就可以在Docker中启动Selenium Hub。我们使用以下命令启动SeleniumHub:

在这里,我们告诉Docker执行一个名为“selenium/hub”的容器,该图像被标记为“Selenium中枢”。

要公开端口,我们使用以下格式:

[ip]字段用于定义源,默认为0.0.0.0(如果未定义ip)。–publish list (或–p)选项将容器的端口发布给主机–publish-all (或–P)选项将所有公开的端口发布到随机端口。

在这里,host _ port 4444(4444:4444中的第一次出现)对外部世界是可访问的。你可以通过导航到以下网址来监控在所述端口上运行的Grid的状态:http://localhost:4444/grid/console。

我们通过在终端上运行命令docker PS–a来验证Selenium Hub容器是否已经启动。

将浏览器链接到Selenium Hub

–link标志采用以下形式:

其中“name”是需要链接的容器的名称,“alias”是链接名称的别名。

随着Selenium Hub的启动和运行,我们现在通过在终端上运行以下命令来启动Chrome和Firefox节点:

Chrome(调试)节点

FireFox(调试)节点

在例子中,selenium-hub(–link selenium-hub : hub)是我们链接到的容器,hub是容器的别名(–link selenium-hub:hub)。

执行上述命令后,Chrome和Firefox节点镜像将连接(或链接)到名为selenium-hub的容器。我们使用docker PS–一个命令来验证浏览器容器是否正在运行。

要检查Selenium Hub(或服务器)是否正在运行,Chrome & Firefox节点是否连接到该Hub,请运行命令docker 日志<Selenium Hub ContainerId>。

或者,网址http://localhost:4444/grid/console将显示SeleniumHub和连接到Hub的节点的状态。如果你在不同的端口上运行Selenium Hub容器,请使用该端口号,而不是URL中的4444。

文章来源:https://www.lambdatest.com/blog/run-selenium-tests-in-docker/

咨询软件测试