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

时间:2019-01-18 04:14:14

标签: ruby selenium selenium-webdriver selenium-chromedriver

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

我已经使用these instructions在Ubuntu上安装了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在该端口上运行的非常多。

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

谢谢!

4 个答案:

答案 0 :(得分:3)

我已经在系统ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]随附的Ubuntu 16.04(已更新)和ruby上进行了尝试。

根据我的猜测,您使用的是错误的旧版本(指南中存在版本 2.26 ,该版本不适用于当前的chrome),chromedriver,它不兼容当前稳定的铬

当前稳定的chrome是Unpacking google-chrome-stable (71.0.3578.98-1) ...,因此您需要使chromedriver尽可能接近chrome版本。

要获取chromedriver版本的完整列表,请点击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时遇到问题,请通过libffi-dev安装apt-get

答案 1 :(得分: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

答案 2 :(得分:-1)

从此行:

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

建议您尝试连接到127.0.1.1,而您的本地主机应为127.0.0.1,可以检查配置吗?

答案 3 :(得分:-2)

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

我在Ubuntu 14.04上无法使用的设置,在撰写本文时,它已经存在约5年了。 我在Ubuntu 16.04机器上重新构建了整个程序,效果很好。

我不知道是什么导致该错误,但似乎是在操作系统级别。