RemoteWebDriver - 调试无头 docker 容器

RemoteWebDriver - Debugging headless docker containers

目前我是 运行 通过 docker 实例的 RemoteWebDriver,但是我正在努力调试它,因为浏览器没有打开,所以我可以在我的机器上看到它。

这是创建驱动程序的代码 - 由于某种原因,它总是 运行 无头模式

public void createDriver() throws MalformedURLException {
    String browser = propertyReader.readProperty("browserType");
    String opSys = getOS();
    String remoteDriverURL = propertyReader.readProperty("remoteWebDriverLocation");

    if (Objects.equals(opSys, "win")) {
        switch (browser) {
            case "firefox":
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), firefoxCap);
                webDriver.manage().window().setSize(new Dimension(1600, 900));
            case "ie": {
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), ieCap);
                webDriver.manage().window().setSize(new Dimension(1600, 900));
                return;
            }
            case "headless":
                chromeCap.setCapability("headlesss", true);
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), chromeCap);
            default: {
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), chromeCap);
                webDriver.manage().window().setSize(new Dimension(1600, 900));
            }
        }
    } else {
        switch (browser) {
            case "firefox":
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), firefoxCap);
                webDriver.manage().window().setSize(new Dimension(1600, 900));
            case "safari":
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), safariCap);
                webDriver.manage().window().setSize(new Dimension(1600, 900));
            case "headless":
                chromeCap.setCapability("acceptInsecureCerts", true);
                chromeCap.setCapability("acceptSslCerts", true);
                chromeCap.setCapability("headless", true);
                chromeCap.setCapability("window-size=1920,1080", true);
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), chromeCap);
            default:
                this.webDriver = new RemoteWebDriver(new URL(remoteDriverURL), chromeCap);
                webDriver.manage().window().setSize(new Dimension(1600, 900));
        }
    }

}

有什么我们可以配置的,以便我们可以在 运行 时看到浏览器吗?

docker 图像配置为使用虚拟帧缓冲区。但是您可以告诉 selenium 随时截取屏幕截图,然后将它们保存到文件中。

您为什么使用 RemoteWebDriver 而不是常规的?如果您想查看浏览器 运行,请使用常规 WebDriver 或在 docker 之外配置 Selenium Grid。您可以检查 Dockerfiles 以查看其配置方式。

此致

我假设您是 运行宁 selenium/hub、selenium/node-firefox、selenium/node-chrome。这些是基于 linux 的图像。

如果你是运行ning node-chrome和node-firefox,你想把它们改成node-chrome-debug和node-firefox-debug,这些版本随端口 5900 上的 VNC 服务器 运行ning 一起提供。我使用 docker-compose,并为此类问题创建了一个单独的 docker-compose-debug.yml:

version: "3"
services:
  selenium-hub:
    image: selenium/hub
    container_name: selenium-hub
    ports:
      - "4444:4444"
  chrome:
    image: selenium/node-chrome-debug
    container_name: node-chrome-debug
    depends_on:
      - selenium-hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium-hub
      - HUB_PORT_4444_TCP_PORT=4444
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "5901:5900"
  firefox:
    image: selenium/node-firefox-debug
    container_name: node-firefox-debug
    depends_on:
      - selenium-hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium-hub
      - HUB_PORT_4444_TCP_PORT=4444
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "5902:5900"

注意:5901:5900 和 5902:5900 端口允许您使用 VNC 客户端连接到这些节点。

docker-compose -f docker-compose-debug.yml up

基本上,您的节点是无头的,但它们仍然需要一些东西来模拟浏览器 gui,在容器 xvfb 中会为您处理这件事。节点的调试版本 运行 连接到 xvfb 的 VNC 服务器。您 运行 一个 VNC 客户端连接到 VNC 服务器。

您将需要一个 VNC 客户端,一个流行的版本是 RealVNC,下载并安装到您的机器上。把它放在你喜欢的地方,让它可执行并 运行 它。我叫我的 vncview

>./vncview

这将启动一个 gui,您将给它一个 ip:port 作为您要查看的节点。例如 127.0.0.1:5901(我的 chrome 调试)或 127.0.0.1:5902(我的 ff 调试) 密码是 "secret" - 您将看到 ubuntu 标志。由于我们分配了不同的端口,您可以同时 运行 其中两个。

现在 运行 你的测试 ;-)

我编辑了这个答案以包含以下内容:

Chrome 可以使用 --headless 选项完全无头,你已经用过了。

Selenium docker images 运行 "headless" 默认情况下,容器没有显示,xvfb 用来处理这个。 Xvfb 通过 creating/using 一个永远不会显示的显示缓冲区来伪造 ui。

运行 chrome --headless on node-chrome,不会向 xvfb 发送任何内容。所以,如果您以后只是为了调试而想查看正在发生的事情,您就做不到。

您需要删除 --headless 选项。这不是灾难,因为 docker selenium/node-chrome 图像默认为 "essentially" 无头。我不知道在 docker 图像上使用 --headless 是否可以节省时间。

另见:

Getting Started with Headless Chrome

Selenium Grid with Docker - 很多带有图形的细节

docker-selenium debugging

Running Chrome in a Docker container

Goolge 术语:XVNC 或 VNC(虚拟网络计算)和 XVFB(x 虚拟帧缓冲区)