Chrome 无法在 WSL(Ubuntu 18.04)中启动,Chromedriver 下出现“DevToolsActivePort 文件不存在”
我看到错误
Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: crashed
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
#0 0x7f87e934a7a9 <unknown>
在运行 Ubuntu 18.04 的 WSL(Windows 子系统 Linux)下尝试使用 Capybara 通过 Rails(5.2.3)中的 Selenium::Chromedriver 启动 Chrome headless 时出现此错误,使用 Chrome 的选项:
headless
、
disable-gpu
和
single-process
(此外尝试使用选项
no-sandbox
、
proxy-server="direct://"
、
disable-dev-shm-usage
和
proxy-bypass-list="*"
,但均无效)。
Gemfile.lock
:
GEM
remote: https://rubygems.org/
specs:
actioncable (5.2.3)
actionpack (= 5.2.3)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailer (5.2.3)
actionpack (= 5.2.3)
actionview (= 5.2.3)
activejob (= 5.2.3)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.2.3)
actionview (= 5.2.3)
activesupport (= 5.2.3)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.2.3)
activesupport (= 5.2.3)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.2.3)
activesupport (= 5.2.3)
globalid (>= 0.3.6)
activemodel (5.2.3)
activesupport (= 5.2.3)
activerecord (5.2.3)
activemodel (= 5.2.3)
activesupport (= 5.2.3)
arel (>= 9.0)
activestorage (5.2.3)
actionpack (= 5.2.3)
activerecord (= 5.2.3)
marcel (~> 0.3.1)
activesupport (5.2.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
addressable (2.6.0)
public_suffix (>= 2.0.2, < 4.0)
arel (9.0.0)
backports (3.12.0)
bootsnap (1.4.4)
msgpack (~> 1.0)
builder (3.2.3)
byebug (11.0.1)
capybara (3.14.0)
addressable
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (~> 1.2)
xpath (~> 3.2)
childprocess (1.0.1)
rake (< 13.0)
coffee-rails (5.0.0)
coffee-script (>= 2.2.0)
railties (>= 5.2.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.5)
crass (1.0.4)
cucumber (3.1.2)
builder (>= 2.1.2)
cucumber-core (~> 3.2.0)
cucumber-expressions (~> 6.0.1)
cucumber-wire (~> 0.0.1)
diff-lcs (~> 1.3)
gherkin (~> 5.1.0)
multi_json (>= 1.7.5, < 2.0)
multi_test (>= 0.1.2)
cucumber-core (3.2.1)
backports (>= 3.8.0)
cucumber-tag_expressions (~> 1.1.0)
gherkin (~> 5.0)
cucumber-expressions (6.0.1)
cucumber-rails (1.6.0)
capybara (>= 1.1.2, < 4)
cucumber (>= 3.0.2, < 4)
mime-types (>= 1.17, < 4)
nokogiri (~> 1.8)
railties (>= 4, < 6)
cucumber-tag_expressions (1.1.1)
cucumber-wire (0.0.1)
diff-lcs (1.3)
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
erubi (1.8.0)
execjs (2.7.0)
ffi (1.11.1)
gherkin (5.1.0)
globalid (0.4.2)
activesupport (>= 4.2.0)
haml (5.1.1)
temple (>= 0.8.0)
tilt
http-cookie (1.0.3)
domain_name (~> 0.5)
i18n (1.6.0)
concurrent-ruby (~> 1.0)
jquery-rails (4.3.3)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
loofah (2.2.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
marcel (0.3.3)
mimemagic (~> 0.3.2)
method_source (0.9.2)
mime-types (3.2.2)
mime-types-data (~> 3.2015)
mime-types-data (3.2019.0331)
mimemagic (0.3.3)
mini_mime (1.0.1)
mini_portile2 (2.4.0)
minitest (5.11.3)
msgpack (1.3.0)
multi_json (1.13.1)
multi_test (0.1.2)
netrc (0.11.0)
nio4r (2.3.1)
nokogiri (1.10.3)
mini_portile2 (~> 2.4.0)
public_suffix (3.0.3)
puma (3.12.1)
rack (2.0.7)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (5.2.3)
actioncable (= 5.2.3)
actionmailer (= 5.2.3)
actionpack (= 5.2.3)
actionview (= 5.2.3)
activejob (= 5.2.3)
activemodel (= 5.2.3)
activerecord (= 5.2.3)
activestorage (= 5.2.3)
activesupport (= 5.2.3)
bundler (>= 1.3.0)
railties (= 5.2.3)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.0.4)
loofah (~> 2.2, >= 2.2.2)
railties (5.2.3)
actionpack (= 5.2.3)
activesupport (= 5.2.3)
method_source
rake (>= 0.8.7)
thor (>= 0.19.0, < 2.0)
rake (12.3.2)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
regexp_parser (1.3.0)
rest-client (2.0.2)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
rspec-core (3.8.0)
rspec-support (~> 3.8.0)
rspec-expectations (3.8.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-rails (3.8.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.8.0)
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-support (~> 3.8.0)
rspec-support (3.8.0)
ruby_dep (1.5.0)
rubyzip (1.2.3)
sassc (2.0.1)
ffi (~> 1.9)
rake
sassc-rails (2.1.0)
railties (>= 4.0.0)
sassc (>= 2.0)
sprockets (> 3.0)
sprockets-rails
tilt
selenium-webdriver (3.142.3)
childprocess (>= 0.5, < 2.0)
rubyzip (~> 1.2, >= 1.2.2)
spring (2.1.0)
spring-watcher-listen (2.0.1)
listen (>= 2.7, < 4.0)
spring (>= 1.2, < 3.0)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
temple (0.8.1)
thor (0.20.3)
thread_safe (0.3.6)
tilt (2.0.9)
turbolinks (5.2.0)
turbolinks-source (~> 5.2)
turbolinks-source (5.2.0)
tzinfo (1.2.5)
thread_safe (~> 0.1)
uglifier (4.1.20)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.6)
webdrivers (4.1.0)
nokogiri (~> 1.6)
rubyzip (~> 1.0)
selenium-webdriver (>= 3.0, < 4.0)
websocket-driver (0.7.1)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.4)
xpath (3.2.0)
nokogiri (~> 1.8)
PLATFORMS
ruby
DEPENDENCIES
bootsnap (>= 1.1.0)
byebug
coffee-rails
cucumber-rails
haml
jquery-rails
listen (>= 3.0.5, < 3.2)
puma (~> 3.11)
rails (~> 5.2.2)
rest-client
rspec-rails
sassc-rails
spring
spring-watcher-listen (~> 2.0.0)
turbolinks
tzinfo-data
uglifier
webdrivers (~> 4.0)
RUBY VERSION
ruby 2.6.1p33
BUNDLED WITH
2.0.2
我尝试了各种其他途径来实现这一点,包括允许Chromedriver 尝试发现正在使用的 Chrome 版本(这可能由于相关原因而失败,但我不能完全确定),使用符号链接指向 Chrome 的 Windows 可执行文件(在这种情况下,它不接受必要的标志,并且不会启动,我想这应该并不奇怪)。
如果我在命令行使用这些标志启动
google-chrome
,我会得到一组略有不同的响应,但它们归结为
GPU 进程已崩溃
(使用
--headless --no-sandbox --disable-gpu
)和
ERROR:browser_main_loop.cc(601)] 无法将 Xlib 置于线程模式。
(将
--single-process
添加到该列表)。
由于我目前被困在这个开发环境中,我很乐意接受任何建议或信息请求。
我发现最好的解决方案是不从 WSL 运行 headless,而是从 Windows 启动 chrome。在两种方式都尝试过之后,我强烈倾向于此选项,因为:
- 测试更加一致。在 Ubuntu 中运行 headless chrome 时,我 会时不时地出现故障。在 Windows 中运行 headfull 时,这个问题消失了。
-
如果您使用
chromedriver --verbose ,您可以看到详细的日志
- 如果您在测试期间暂停执行,您可以看到页面并进行调试。
- 我花了很长时间摆弄 headless chrome 选项来运行我的 测试;然后在升级到 Chrome 版本 79 后再次出现这种情况。 使用 chromedriver,我不需要任何选项。
- 看到您的测试运行真是太棒了!
操作方法:
- 下载 适用于 Windows 的 Chromedriver 。确保您获取的版本与您的 Chrome 版本相匹配。将其解压缩到某个位置。我使用了 c:\dev
-
转到 Windows 命令提示符并启动 chromedriver
C:\dev\chromedriver> chromedriver
。它会告诉您它正在使用的端口。您将在下一步中需要它。我的显示为在端口 9515 上启动 ChromeDriver 79.0.3945.36 (...)
- 在您的 rails_helper.rb 中
Capybara.register_driver :windows_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome()
puts 'Current driver (windows_chrome) requires chromedriver to be launched from windows (C:\dev\chromedriver>chromedriver)'
Capybara::Selenium::Driver.new(app,browser: :chrome, url: 'http://localhost:9515',
desired_capabilities: capabilities)
end
#Capybara.default_driver = :windows_chrome
Capybara.javascript_driver = :windows_chrome
Capybara.default_max_wait_time = 5 # Seconds
#Selenium::WebDriver.logger.level = :debug
# Webdrivers.logger.level = :DEBUG
我遇到了同样的问题,几个小时后我找到了问题所在以及解决方法:
自 Chrome 75 以来,Google 改变了指定 chromeOptions 的方式。将
chromeOptions
更改为
goog:chromeOptions
。
我将其更改为:
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
'goog:chromeOptions' => { args: %w[headless disable-gpu window-size=1920,1080 no-sandbox disable-dev-shm-usage] }
)
我花了几个小时,但是@samuel的答案对@twistezo的修改是关键。这是我的完整解决方案:
请注意,根据@Samuel,Chromeoptions修改为“ GOOG:Chromeoptions”。我不必在Windows中安装任何内容,但是我确实在Linux分区中安装了Chrome。
670011160
然后是相关测试:
192781217 < /code>
更新到Google Chrome 79.0.3945.88
838114266