java - RemoteWebDriver - 调试 headless Docker 容器

标签 java selenium docker remotewebdriver

目前,我正在通过 docker 实例运行 RemoteWebDriver,但是我很难调试它,因为浏览器无法打开,所以我可以在我的计算机上看到它。

这里是创建驱动程序的代码 - 由于某种原因它总是在 headless 模式下运行

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));
        }
    }

}

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

最佳答案

我正在假设您正在运行 selenium/hub、selenium/node-firefox、selenium/node-chrome。这些是基于 Linux 的镜像。

如果您正在运行node-chrome和node-firefox,您想将它们更改为node-chrome-debug和node-firefox-debug,这些版本附带在端口5900上运行的VNC服务器。我使用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

基本上,您的节点是 headless 的,但它们仍然需要一些东西来模拟浏览器 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 Logo 。您可以同时运行其中两个,因为我们分配了不同的端口。

现在运行你的测试;-)

我已编辑此答案以包含以下内容:

Chrome 能够通过使用 --headless 选项实现完全 headless ,您已经使用过这个选项。

Selenium docker 镜像默认运行“ headless ”,容器没有显示,xvfb 用于处理这个问题。 Xvfb 通过创建/使用永远不会显示的显示缓冲区来伪造用户界面。

在 node-chrome 上运行 chrome --headless,不会导致任何内容发送到 xvfb。因此,如果您稍后想查看发生的情况只是为了调试,则不能。

您需要删除 --headless 选项。这不是一场灾难,因为 docker selenium/node-chrome 图像默认为“本质上” headless 。我不知道在 docker 镜像上使用 --headless 是否可以节省时间。

另请参阅:

Getting Started with Headless Chrome

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

docker-selenium debugging

Running Chrome in a Docker container

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

关于java - RemoteWebDriver - 调试 headless Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50831631/

相关文章:

python - Docker Selenium Chromedriver : Unfortunately, 自动访问此页面被拒绝

docker - docker中的nginx反向代理

docker - 在 docker 中构建 golang 项目 - 在 $GOPATH 或 $GOROOT 中找不到包

java - 如何在 lucene 中赋予元音变音更多的权重?

java - 如何将 joda 时间的 YearMonth 类型的属性保存到一列中?

javascript - Protractor :向下滚动

mongodb - 如何将Mongo docker容器连接到主机上安装的mongodb compass社区

java - 表情符号在 ajax 后在 MySQL 表列和 HTML 中呈现,但在页面重新加载后不会呈现。为什么?

java - 在 Android 中为画线设置动画

python - 如何在 python 的 selenium webdriver 中禁用 chrome 通知弹出窗口