【问题标题】:`selenium-webdriver` ruby gem cannot connect with chromedriver on Ubuntu 14.04`selenium-webdriver` ruby​​ gem 无法在 Ubuntu 14.04 上与 chromedriver 连接
【发布时间】:2019-06-12 08:19:31
【问题描述】:

我正在运行 Ubuntu 16.04,并且正在尝试使用 chromedriver 在 ruby​​ 中运行无头 Chrome 浏览器。

我已经在 Ubuntu 上使用 these instructions 安装了 chromedriver,然后我通过 ruby​​ irb 控制台运行它:

require 'selenium-webdriver'

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')

@driver = Selenium::WebDriver.for(:chrome, options: options)

Traceback (most recent call last):
   10: from /home/weefee/.rvm/rubies/ruby-2.5.1/bin/irb:11:in `<main>'
    9: from (irb):5
    8: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver.rb:86:in `for'
    7: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/driver.rb:44:in `for'
    6: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/driver.rb:44:in `new'
    5: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/chrome/driver.rb:44:in `initialize'
    4: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/service.rb:69:in `start'
    3: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/socket_lock.rb:39:in `locked'
    2: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/service.rb:72:in `block in start'
    1: from /home/weefee/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/service.rb:142:in `connect_until_stable'
Selenium::WebDriver::Error::WebDriverError (unable to connect to chromedriver 127.0.1.1:9515)

关于如何解决它的任何想法?几点说明:

  1. 有些人似乎遇到了rbenv 及其设置的垫片的问题。我根本没有使用rbenv,所以这里无关紧要。

  2. 当我在我的 OSx 笔记本电脑上尝试时,上述方法有效。当然,我可以使用brew install chromedriver 轻松安装 chromedriver,而且它似乎可以正常工作

  3. 或者,我卸载了 chromedriver 并使用 chromedriver-helper gem 重新安装了它。结果还是一样。

我已经为此烦恼了一段时间 - 任何帮助都将不胜感激。谢谢!

更新

我深入挖掘了selenium-webdriver gem 的源代码,以查看它在尝试连接到chromedriver 进程时到底做了什么。

我能够使用selenium-webdriver gem 使用的相同命令在服务器上的 ruby​​ 控制台中复制以下内容:

#
# Start the Chromedriver Process
#

require 'childprocess'
process = ChildProcess.build(*["/usr/local/bin/chromedriver", "--port=9515"])
process.leader = true
process.alive? #=> false
process.start
process.alive? #=> true

#
# Create a Socket connection to 127.0.0.1:9515
#

require 'socket'
require 'selenium-webdriver'

host = Selenium::WebDriver::Platform.localhost                       #=> "127.0.1.1"
port = Integer(Selenium::WebDriver::Chrome::Service::DEFAULT_PORT)   #=> 9515
timeout = 5

# Create and connect to socket

addr     = Socket.getaddrinfo(host, port, Socket::AF_INET, Socket::SOCK_STREAM)
sock     = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
sockaddr = Socket.pack_sockaddr_in(port, addr[0][3])

# First need to rescue the writable error and then connect again
# to get the actual error. No idea why but even the official
# rubydocs use this pattern: https://apidock.com/ruby/Socket/connect_nonblock

begin
  sock.connect_nonblock(sockaddr)
rescue IO::WaitWritable
  IO.select(nil, [sock], nil, 5)
  sock.connect_nonblock(sockaddr)
end

#=> Errno::ECONNREFUSED (Connection refused - connect(2) for 127.0.1.1:9515)

所以看起来核心错误是套接字拒绝连接该(本地)地址和端口,即使chromedriver 在该端口上运行得非常频繁。

我对套接字一无所知 - 这是一个常见错误吗?

谢谢!

【问题讨论】:

  • 它对我有用。我不知道你的情况是什么问题。顺便说一句,使用 WATIR,它是 Ruby Selenium Binding 的包装器。
  • 我的一个朋友遇到了同样的问题,升级了chrome版本并解决了!试一试

标签: ruby selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

我已经在 Ubuntu 16.04(更新)和系统自带的 ruby​​ 上试用过ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

据我推测,您使用的是错误的旧版(在指南中有版本 2.26 不适用于当前的 chrome),chromedriver,不兼容 strong> 使用 当前稳定的 chrome

当前的稳定版chrome是Unpacking google-chrome-stable (71.0.3578.98-1) ...,所以你需要让chromedriver尽可能接近chrome版本。

要获取 chromedrivers 版本的完整列表,请单击 here

在我的情况下,这将是 71.0.3578.80 版本:

wget -N http://chromedriver.storage.googleapis.com/71.0.3578.80/chromedriver_linux64.zip

然后您可以按照说明继续。

然后你就可以开始工作了selenium-webdriver:

irb
irb(main):001:0> require 'selenium-webdriver'
=> true
irb(main):003:0> options = Selenium::WebDriver::Chrome::Options.new
=> #<Selenium::WebDriver::Chrome::Options:0x00000002ee6db0 @args=#<Set: {}>, @binary=nil, @prefs={}, @extensions=[], @options={}, @emulation={}, @encoded_extensions=[]>
irb(main):004:0> options.add_argument('--headless')
=> #<Set: {"--headless"}>
irb(main):005:0> @driver = Selenium::WebDriver.for(:chrome, options: options)
=> #<Selenium::WebDriver::Chrome::Driver:0x..f95c429ee62a3a152 browser=:chrome>

注意:如果您在安装ffi 时遇到问题,请通过apt-get 安装libffi-dev

【讨论】:

  • 非常有趣。我尝试更新到与您相同的 Google Chrome、Chrome 和 Ruby 版本,但仍然出现相同的错误。我能想到的唯一区别是我使用的是 Ubuntu 14.04,而你使用的是 16.04。我必须在某个时候升级操作系统并尝试一下——你认为可能是这样吗?明确地说,我使用的是 Google Chrome 71.0.3578.98ChromeDriver 71.0.3578.80Ruby 2.3.1Ubuntu 14.04
  • 是的,就是这样。我使用 Ubuntu 16.04 在另一台机器上复制了整个安装,它神奇地工作。猜猜 14.04 在这一点上真的太旧了。
  • @user2490003 啊,你的标题和文字有不同的Ubuntu版本。我从文本I'm running Ubuntu 16.04 and I'm ... 中获取了 16.04 版本。我没有在旧的 Ubuntu 版本上测试它。我很高兴它在新版本上对您有用。如果我得到它,我会与 14.04 核对,我目前没有它。
  • 那是我的错!我习惯性地在标题中输入了16.04。我现在已经纠正了。我仍然奖励你,因为正是你的工作让我检查了所有内容的版本并发现操作系统版本很重要。感谢您的帮助!
  • @user2490003 欢迎您。我很高兴它成功了。
【解决方案2】:
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt-get update
sudo apt-get --only-upgrade install google-chrome-stable

这将使您的版本保持最新并可用。我已经解决了在 CI 测试期间遇到的类似问题。之后您应该可以设置您的@driver

【讨论】:

  • 感谢您的建议。不幸的是,我已经安装了最新的稳定版本,所以它没有改变任何东西。值得我使用以下版本:ChromeDriver 2.45.615279Google Chrome 71.0.3578.98ruby 2.5.1selenium-webdriver-3.141.0,全部在Ubuntu 14.04
  • 我需要在后台单独启动chromedriver服务器,还是需要其他依赖?
  • 我还使用了chromedriver-helper gem。您确定要安装 64 位版本吗?
  • 我曾一度使用过webdriverchromedrive-helper gems,但遇到了同样的问题。有没有办法可以确认我使用的是 64 位版本?另外,在做了更多研究后,我刚刚在该问题上发布了UPDATE,希望这可能会阐明这个问题。感谢您的帮助!
  • 上面第二个命令中的 [arch=amd64] 将确保 64 位。如果您不使用这些命令,我​​不确定您将如何验证。
【解决方案3】:

从这一行开始:

Selenium::WebDriver::Error::WebDriverError (unable to connect to chromedriver 127.0.1.1:9515)

这表明你正在尝试连接到 127.0.1.1,而你的 localhost 应该是 127.0.0.1,你能检查一下你的配置吗?

【讨论】:

  • 我纠正了问题中的一个错字,但我认为127.0.1.1 是否同样有效并被 Ubuntu/Debian 使用?见:askubuntu.com/a/754219/411497
  • 尝试在ubuntu上重新安装WebDriver:apt install chromium-chromedriverln -s /usr/lib/chromium-browser/chromedriver /usr/local/bin/chromedriver
【解决方案4】:

所有提供的解决方案都是很好的建议,但最终 tukan 的回答让我走上了仔细检查版本的道路。

我的设置不适用于 Ubuntu 14.04,在撰写本文时它已经 5 年左右。 我在 Ubuntu 16.04 机器上重新构建了整个系统,它运行良好。

我不知道 是什么 导致错误,但它似乎是操作系统级别的问题。

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2014-07-16
    • 1970-01-01
    • 2013-03-26
    • 2015-04-06
    相关资源
    最近更新 更多