【问题标题】:Can't ChromeDriver headless to work on Centos 7ChromeDriver 无法在 Centos 7 上工作
【发布时间】:2018-11-08 16:18:35
【问题描述】:

尝试让 Selenium 测试与 Chrome Headless 一起工作(我们目前正在使用远程 selenium Web 驱动程序,它工作正常但速度很慢)。 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:

如果我将 --headless 添加到该行,它会成功。

$ /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 机器上运行良好(但在我的 Windows 机器上启动 Chrome 请求确实包含 --headless 参数)。我不确定为什么 ChromeDriver 在启动时似乎没有将任何 chromeOptions(--headless、--disable-gpu 或 --window=1920x1024)传递给 chrome 进程。

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

【问题讨论】:

    标签: java selenium selenium-chromedriver


    【解决方案1】:

    您的代码块几乎是完美的。有几点:

    • 如果查看setHeadless() 的源代码,--headless 标志已经实现。所以明确设置addArguments("--headless") 将是开销。您可以删除该参数。

      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)
      
    • 但是您的主要问题是您使用的二进制版本之间的不兼容性,如下所示:

      • 您正在使用 chromedriver=2.9
      • chromedriver=2.9 的发行说明明确提及以下内容:

      • 支持 Chrome v31-34

      • 您正在使用 chrome=66.0

      • ChromeDriver v2.38 的发行说明明确提及以下内容:

      • 支持 Chrome v65-67

    • 所以 ChromeDriver v2.9Chrome 浏览器 v66.0 之间存在明显的不匹配强>

    解决方案

    • 保持JDK升级到最近的水平JDK 8u171
    • 保持Selenium升级到当前水平Version 3.12.0
    • ChromeDriver 升级到当前的ChromeDriver v2.38 级别。
    • Chrome 版本保持在 Chrome v66.x 级别。 (as per ChromeDriver v2.38 release notes)
    • 清理你的项目工作区通过你的IDE重建你的项目只需要依赖。
    • 使用CCleaner 工具在执行测试套件之前和之后清除所有操作系统杂务。
    • 如果您的基础 Web Client 版本太旧,请通过 Revo Uninstaller 卸载它并安装最新的 GA 和发布版本的 Web Client
    • 进行系统重启
    • 执行您的@Test

    【讨论】:

    • OP 在询问 Java ......但这个答案显示 Python 源代码?
    猜你喜欢
    • 2018-01-04
    • 2018-04-11
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多