RemoteWebDriver - 调试无头泊坞容器

时间:2018-06-13 07:41:32

标签: java selenium docker remotewebdriver

目前我正在通过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));
        }
    }

}

我们可以配置任何内容,以便在运行时看到浏览器吗?

2 个答案:

答案 0 :(得分:1)

我正在接近这个,假设你正在运行selenium / hub,selenium / node-firefox,selenium / node-chrome。这些是基于linux的图像。

如果您正在运行node-chrome和node-firefox,您希望将它们更改为node-chrome-debug和node-firefox-debug,这些版本附带VNC Server在端口5900上运行。我使用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:端口。例如127.0.0.1:5901(我的chrome调试)或127.0.0.1:5902(我的ff调试) 密码是“秘密” - 您将看到ubuntu徽标。由于我们分配了不同的端口,因此您可以同时运行其中的两个。

现在只需运行测试; - )

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

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

Selenium docker图像默认运行“无头”,容器没有显示,xvfb用于处理此问题。 Xvfb通过创建/使用永远不会显示的显示缓冲区来伪造ui。

在node-chrome上运行chrome --headless,不会将任何内容发送到xvfb。所以,如果你以后想看看发生了什么只是为了调试你就不能。

您需要删除--headless选项。这不是灾难,因为docker selenium / node-chrome图像默认为“基本上”无头。我不知道在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 vritural帧缓冲区)

答案 1 :(得分:0)

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

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

问候