当前位置: 首页 > 知识库问答 >
问题:

ChromeDriver headless无法在Centos 7上工作

柳逸春
2023-03-14

试图让硒测试与ChromeHeadless一起工作(我们目前正在使用远程硒网络驱动程序,它工作正常,但速度很慢)。ChromeDriver用以下方式实例化:

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setBinary("/usr/bin/google-chrome");   
chromeOptions.addArguments("--headless", "--window-size=1920x1080");
chromeOptions.setHeadless(true);

Map<String, Object> prefs = new HashMap<>();
prefs.put("credentials_enable_service", false);
prefs.put("password_manager_enabled", false);
chromeOptions.setExperimentalOption("prefs", prefs);

System.setProperty("webdriver.chrome.verboseLogging", "true");

dr = new ChromeDriver(chromeOptions);

(我只用setHeadless和--headless作为参数都试过了,我想我应该加倍确定,所以代码目前包含了这两个参数)。日志显示:

Starting ChromeDriver (v2.9.248304) on port 1848
[0.705][INFO]: COMMAND InitSession {
   "capabilities": {
      "desiredCapabilities": {
         "browserName": "chrome",
         "goog:chromeOptions": {
            "args": [ "--headless", "--disable-gpu", "--window-size=1920x1080" ],
            "binary": "/usr/bin/google-chrome",
            "extensions": [  ],
            "prefs": {
               "credentials_enable_service": false,
               "password_manager_enabled": false
            }
         }
      },
      "firstMatch": [ {
         "browserName": "chrome",
         "goog:chromeOptions": {
            "args": [ "--headless", "--disable-gpu", "--window-size=1920x1080" ],
            "binary": "/usr/bin/google-chrome",
            "extensions": [  ],
            "prefs": {
               "credentials_enable_service": false,
               "password_manager_enabled": false
            }
         }
      } ]
   },
   "desiredCapabilities": {
      "browserName": "chrome",
      "goog:chromeOptions": {
         "args": [ "--headless", "--disable-gpu", "--window-size=1920x1080" ],
         "binary": "/usr/bin/google-chrome",
         "extensions": [  ],
         "prefs": {
            "credentials_enable_service": false,
            "password_manager_enabled": false
         }
      }
   }
}
[0.708][INFO]: Populating Preferences file: {
   "alternate_error_pages": {
      "enabled": false
   },
   "autofill": {
      "enabled": false
   },
   "browser": {
      "check_default_browser": false
   },
   "distribution": {
      "import_bookmarks": false,
      "import_history": false,
      "import_search_engine": false,
      "make_chrome_default_for_user": false,
      "show_welcome_page": false,
      "skip_first_run_ui": true
   },
   "dns_prefetching": {
      "enabled": false
   },
   "profile": {
      "content_settings": {
         "pattern_pairs": {
            "https://*,*": {
               "media-stream": {
                  "audio": "Default",
                  "video": "Default"
               }
            }
         }
      },
      "default_content_settings": {
         "geolocation": 1,
         "mouselock": 1,
         "notifications": 1,
         "popups": 1,
         "ppapi-broker": 1
      },
      "password_manager_enabled": false
   },
   "safebrowsing": {
      "enabled": false
   },
   "search": {
      "suggest_enabled": false
   },
   "translate": {
      "enabled": false
   }
}
[0.708][INFO]: Populating Local State file: {
   "background_mode": {
      "enabled": false
   },
   "ssl": {
      "rev_checking": {
         "enabled": false
      }
   }
}
[0.712][INFO]: Launching chrome: /opt/google/chrome/google-chrome --disable-background-networking --disable-client-side-phishing-detection --disable-component-update --disable-default-apps --disable-hang-monitor --disable-prompt-on-repost --disable-sync --disable-web-resources --enable-logging --full-memory-crash-report --ignore-certificate-errors --load-extension=/tmp/.com.google.Chrome.ZsjTh0/internal --logging-level=1 --metrics-recording-only --no-first-run --password-store=basic --remote-debugging-port=12771 --safebrowsing-disable-auto-update --safebrowsing-disable-download-protection --use-mock-keychain --user-data-dir=/tmp/.com.google.Chrome.lVGXx8 data:,
[0.714][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[0.732][WARNING]: PAC support disabled because there is no system implementation
[1.457][DEBUG]: DevTools request failed
[1.507][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[1.514][DEBUG]: DevTools request failed
[1.564][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[1.569][DEBUG]: DevTools request failed
[1.620][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[1.624][DEBUG]: DevTools request failed
[1.674][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[1.678][DEBUG]: DevTools request failed
[1.728][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[1.732][DEBUG]: DevTools request failed
[1.782][DEBUG]: DevTools request: http://127.0.0.1:12771/json/version
[1.786][DEBUG]: DevTools request failed

(google-chrome:1887): Gtk-WARNING **: cannot open display:

还有一个“DevTools”请求:http://127.0.0.1:12771/json/version,DevTools请求失败”行(成百上千)。

我试过使用Selenium 3.7.1,然后尝试更新到Selenium 3.12.0,输出没有变化。

安装了Chrome(版本66.0.3359.181),ChromeDriver(v2.9.248304)也是如此,整件事都在Centos 7盒子上工作,没有窗口管理器。虽然ChromeDriver似乎是启动Chrome的命令行从命令行失败:

$ /opt/google/chrome/google-chrome --disable-background-networking --disable-client-side-phishing-detection --disable-component-update --disable-default-apps --disable-hang-monitor --disable-prompt-on-repost --disable-sync --disable-web-resources --enable-logging --full-memory-crash-report --ignore-certificate-errors --load-extension=/tmp/.com.google.Chrome.ZsjTh0/internal --logging-level=1 --metrics-recording-only --no-first-run --password-store=basic --remote-debugging-port=12771 --safebrowsing-disable-auto-update --safebrowsing-disable-download-protection --use-mock-keychain --user-data-dir=/tmp/.com.google.Chrome.lVGXx8 data:,

(google-chrome:3346): Gtk-WARNING **: cannot open display:

如果我在行中添加--head less,它就成功了。

$ /opt/google/chrome/google-chrome --headless --disable-background-networking --disable-client-side-phishing-detection --disable-component-update --disable-default-apps --disable-hang-monitor --disable-prompt-on-repost --disable-sync --disable-web-resources --enable-logging --full-memory-crash-report --ignore-certificate-errors --load-extension=/tmp/.com.google.Chrome.ZsjTh0/internal --logging-level=1 --metrics-recording-only --no-first-run --password-store=basic --remote-debugging-port=12771 --safebrowsing-disable-auto-update --safebrowsing-disable-download-protection --use-mock-keychain --user-data-dir=/tmp/.com.google.Chrome.lVGXx8 data:,
[0529/154351.972190:ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context.

DevTools listening on ws://127.0.0.1:12771/devtools/browser/a008b11c-d1c3-4c56-ba28-7f221eed4507
Fontconfig warning: "/etc/fonts/fonts.conf", line 146: blank doesn't take any effect anymore. please remove it from your fonts.conf

此设置在我的Windows box上运行良好(但在我的Windows box上启动Chrome请求时确实包含--headless参数)。我不确定为什么ChromeDriver在启动时没有向chrome进程传递任何chromeOptions(--headless、--disable gpu或--window=1920x1024)。

任何帮助都将不胜感激...

共有1个答案

田兴朝
2023-03-14

你的代码块几乎完美无瑕。有几件事:

>

  • 如果查看setHeadless()的源代码,--head less标志已经实现。因此显式地设置addArguments("--head less")会产生开销。您可以删除参数。

    def set_headless(self, headless=True):
        """
        Sets the headless argument
    
        Args:
          headless: boolean value indicating to set the headless option
        """
        args = {'--headless', '--disable-gpu'}
        if headless:
            self._arguments.extend(args)
        else:
            self._arguments = list(set(self._arguments) - args)
    

    然而,您的主要问题是您使用的二进制版本之间的不兼容性,如下所示:

    >

  • 您使用的是chromeDrive=2.9
  • chromeDrive=2.9的发行说明明确提到了以下内容:

    支持Chromev31-34

    您使用的是chrome=66.0

    ChromeDriver v2的发行说明。38明确提到以下内容:

    支持Chromev65-67

    所以ChromeDriver v2之间存在明显的不匹配。9和Chrome浏览器v66。0

    • 保持JDK升级到最新级别JDK 8u171
    • 保持Selenium升级到当前版本3.12.0
    • 将ChromeDriver升级到当前的ChromeDriver v2。38级
    • 保持Chrome版本在Chrome v66。x级。(根据ChromeDriver v2.38发行说明)
    • 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目
    • 执行测试套件之前和之后,使用CCleaner工具清除所有操作系统琐事
    • 如果您的基本Web客户端版本太旧,请通过Revo卸载程序卸载它,并安装最新的GA和发布的Web客户端版本
    • 重新启动系统
    • 执行@测试

  •  类似资料:
    • 我正在使用Selenium Web驱动程序,同时使用Chrome和HTMLUnit。对于Chrome,下面的代码可以工作,但HTMLUnit返回一个错误,表示找不到元素。 最后一行将返回null,未找到任何元素。使用的XPath是: 与Chrome配合使用,在XPath与HTMLUnit配合使用时失败。知道吗? 使用的驱动程序如下所示:

    • 问候flutter开发人员正在开发一个应用程序,iOS和Android使用手机身份验证用户一切正常iOS但Android当这一行被称为我得到一个错误: 错误: E/flutter(14190):[ERROR: flutter/shell/通用/shell.cc(184)]Dart错误:未处理的异常: E/flutter(14190): PlatformExc0019(错误,空引用,空)E/flut

    • 我对Android Studio有意见。 任务:应用程序:ProcessDebugResources失败AGPBI:{“kind”:“error”,“text”:“Android资源链接失败”,“sources”:[{“file”:“/users/luisabsg/.gradle/caches/transforms-2/files-2.1/270e51d2bcfda0833b0b336f50197

    • 我一直在运行一个webserver和Coldfusion直到我升级到Mountain Lion,然后它就停止工作了。我让它再次工作了,把所有的东西重新打开,升级禁用了,但现在我已经升级到小牛,没有任何工作。我已经遵循了所有的步骤在各种web文章,但它不会工作。PHP被启用了,之前启用的所有东西都被设置好了,包括虚拟主机,所有的文件夹都在同一个地方。 我得到的错误是:Firefox无法在127.0.

    • 在windows上使用netbeans已经很久了,没有问题。在Debian上安装了它,它启动了,但大多数按钮没有响应(新项目/新文件...)。 这是使用终端发射时的结果。 Netbeans版本:8.2 OS:Parrot(debian OS的发行版)JDK版本:9.0.1 提前道谢。

    • 问题内容: 我想用一个非常简单的单节点群集启动Cassandra,但是我做不到。 我按照在 https://www.digitalocean.com/community/tutorials/how-to-install-cassandra- and-run-a-single-node-cluster-on-a-ubuntu- vps 基本上, 在VirtualBox上构建了一个新的CentOS 7