Ich verwende Ubuntu 16.04 und versuche, mit chromedriver einen kopflosen Chrome-Browser in Ruby auszuführen.

Ich habe chromedriver unter Ubuntu mithilfe von diesen Anweisungen installiert und dann ich Führen Sie dies über die Ruby irb -Konsole aus:

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)

Irgendeine Idee, wie man das Problem behebt? Ein paar Anmerkungen:

  1. Einige Leute scheinen Probleme mit rbenv und der von ihm eingerichteten Unterlegscheibe zu haben. Ich verwende rbenv überhaupt nicht, daher ist das hier irrelevant.

  2. Das Obige funktioniert, wenn ich es auf meinem OSx-Laptop versuche. Natürlich kann ich dort problemlos chromedriver mit brew install chromedriver installieren und es scheint einfach zu funktionieren

  3. Alternativ habe ich chromedriver deinstalliert und mithilfe des Gems chromedriver-helper neu installiert. Immer noch das gleiche Ergebnis.

Ich habe mir schon eine Weile die Haare ausgerissen - jede Hilfe wäre willkommen. Vielen Dank!

UPDATE

Ich habe mich tiefer in die Quelle des selenium-webdriver Edelsteins eingegraben, um genau zu sehen, was es tat, als ich versuchte, eine Verbindung zum chromedriver -Prozess herzustellen.

Ich konnte Folgendes in meiner Ruby-Konsole auf dem Server mit denselben Befehlen replizieren, die das Juwel selenium-webdriver verwendet:

#
# 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)

Es scheint also, dass der Hauptfehler darin besteht, dass der Socket sich weigert, eine Verbindung zu dieser (lokalen) Adresse und diesem Port herzustellen, obwohl chromedriver sehr häufig auf diesem Port ausgeführt wird.

Ich weiß überhaupt nicht viel über Steckdosen - ist das ein häufiger Fehler?

Vielen Dank!

8
user2490003 18 Jän. 2019 im 07:14

4 Antworten

Beste Antwort

Alle angebotenen Lösungen waren großartige Empfehlungen, aber letztendlich führte mich die Antwort von Tukan auf den Weg, die Versionen sorgfältig zu prüfen.

Das Setup, das ich hatte, funktionierte nicht mit Ubuntu 14.04, das zum Zeitpunkt des Schreibens ungefähr 5 Jahre alt war. Ich habe das Ganze auf einem Ubuntu 16.04-Rechner neu erstellt und es hat perfekt funktioniert.

Ich weiß nicht, was den Fehler verursacht, aber es scheint etwas auf Betriebssystemebene zu sein.

-2
user2490003 30 Jän. 2019 im 05:26

Ich habe es auf Ubuntu 16.04 (aktualisiert) und Ruby ausprobiert, das mit dem System ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu] geliefert wird.

Ich vermute, dass Sie einen falschen, alten (in der Anleitung gibt es Version 2.26 , der mit aktuellem Chrom nicht funktioniert), Chromedriver verwenden, der nicht kompatibel ist das aktuelle stabile Chrom .

Das aktuelle stabile Chrom ist Unpacking google-chrome-stable (71.0.3578.98-1) ..., daher müssen Sie den Chromedriver so nah wie möglich an die Chromversion bringen.

Um eine vollständige Liste der Versionen von chromedrivers zu erhalten, klicken Sie hier .

In meinem Fall wäre das eine 71.0.3578.80 Version:

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

Sie können dann wie in der Anleitung gezeigt fortfahren.

Dann werden Sie arbeiten 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>

Hinweis: Wenn Sie Probleme bei der Installation von ffi haben, installieren Sie libffi-dev über apt-get.

3
tukan 30 Jän. 2019 im 20:55
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

Dadurch bleibt Ihre Version auf dem neuesten Stand und verfügbar. Ich habe damit ähnliche Probleme lösen lassen, die beim CI-Test aufgetreten sind. Sie sollten anschließend in der Lage sein, Ihr @driver einzurichten.

2
Tom 28 Jän. 2019 im 17:57

Aus dieser Zeile:

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

Es deutet darauf hin, dass Sie versuchen, eine Verbindung zu 127.0.1.1 herzustellen, während Ihr lokaler Host 127.0.0.1 sein sollte. Können Sie Ihre Konfiguration überprüfen?

-1
Allen 30 Jän. 2019 im 01:17