`selenium-webdriver` ruby​​ gem无法在Ubuntu 14.04上与chromedriver连接

use*_*003 8 ruby selenium selenium-chromedriver selenium-webdriver

我正在运行Ubuntu 16.04而我正试图用ruby运行无头Chrome浏览器chromedriver.

我已经chromedriver使用这些说明在Ubuntu 上安装了然后我通过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)
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 当我在我的OSx笔记本电脑上试用它时,上面的工作.当然,我可以很容易地安装chromedriver,brew install chromedriver它似乎工作

  3. 或者,我卸载了chromedriver并使用chromedriver-helper gem 重新安装它.结果仍然相同.

我已经把头发撕掉了一段时间 - 任何帮助都会受到赞赏.谢谢!

UPDATE

我深入研究了selenium-webdrivergem 的来源,以确切地了解它在尝试连接到chromedriver进程时的作用.

我能够使用selenium-webdrivergem使用的相同命令在服务器上的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)
Run Code Online (Sandbox Code Playgroud)

因此,似乎核心错误是套接字拒绝连接该(本地)地址和端口,即使chromedriver在该端口上运行非常多.

我根本不太了解套接字 - 这是一个常见的错误吗?

谢谢!

use*_*003 -2

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

我的设置在 Ubuntu 14.04 上不起作用,在撰写本文时该版本已有大约 5 年的历史。我在 Ubuntu 16.04 机器上重新构建了整个东西,它运行得很好。

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