是否可以在 Windows Docker 容器中运行类似 Selenium 的测试

问题描述

我们有一个 Windows Electron 应用程序,它通过 Spectron 运行 e2e 测试。该应用程序依赖于平台,不能在 Linux(容器)上运行。我们希望在预配置的 Docker 容器中运行我们的 Spectron e2e 测试以将它们隔离。 为了掌握它,我构建了一个最小的 nodejs 应用程序,它基本上什么都不做,并且有一个 e2e 测试 (jest),可以打开浏览器选项卡并检查标题,没有任何功能,只是一个简单的尖峰。

我创建了一个 Dockerfile 来构建一个容器来运行测试:

FROM  mcr.microsoft.com/windows:20H2-amd64
 
RUN mkdir "C:/app"
workdir "C:/app"
copY app "C:/app"
 
RUN powershell -Command \
    Set-ExecutionPolicy unrestricted; 
 
ENV chocolateyUseWindowsCompression false
RUN powershell -Command \
    iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')); 
 
RUN choco install googlechrome -y --version=91.0.4472.101 --ignore-checksums
RUN choco install chromedriver -y --version=91.0.4472.1010 --ignore-checksums
RUN choco install nodejs-lts -y --version=14.17.1
 
RUN npm config set strict-ssl false
RUN npm install 
 
ENTRYPOINT npm test

请注意,这是一个 Windows 容器,因为我们的主应用程序还需要一个 Windows 容器才能运行。容器构建并运行测试,但崩溃并显示错误SessionNotCreatedError: session not created 抛出的 from tab crashed。在我的 Windows 主机上,测试运行良好。

我的 Dockerfile 有什么问题吗,或者这在 Windows 容器中根本不可能?

我认为这与问题无关,但这里也是容器执行 npm test 时执行的测试文件

describe('test google.com',() => {
    const {
        Builder,By,Key,until
    } = require('selenium-webdriver');
    var driver;
 
    beforeEach(() => {
        driver = new Builder()
            .forbrowser('chrome')
            .build();
    });
 
    afterEach(() => {
        driver.quit();
    });
 
    it('should open google search',async () => {
        await driver.get('http://www.google.com');
        driver
            .getTitle()
            .then(title => {
                expect(title).toEqual('Google');
            });
    });
 
});

解决方法

我们遇到了类似的问题,但我们将 .net-core 与 Selenium 一起使用。出于某种原因,在容器内安装 Chromedriver 不起作用,因此我们必须做两件事:

  1. 手动下载基于chrome版本的驱动,将zip文件导出到工作目录。 (虽然已经有一段时间了,我们并没有真正更新映像,现在通过 choco 安装可能会起作用)
  2. 更奇怪的是,由于某种原因,我们不得不安装一些字体。

看看我的仓库:https://github.com/yamac-kurtulus/Windows-Docker-Images/tree/master/DotnetCore%20Selenium%20With%20Chrome 相关部分位于 Dockerfile 中的第 23 行之后。

注意:如果你对项目不是很深入,我强烈建议你迁移到Linux。在 Windows 上使用 Docker 就像一场你无法醒来的噩梦。