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)
有关如何解决它的任何想法?几点说明:
有些人似乎遇到了问题rbenv和设置的垫片.我根本就没用rbenv,所以这里无关紧要.
当我在我的OSx笔记本电脑上试用它时,上面的工作.当然,我可以很容易地安装chromedriver,brew install chromedriver它似乎工作
或者,我卸载了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 机器上重新构建了整个东西,它运行得很好。
我不知道是什么原因导致了错误,但似乎是操作系统级别的问题。
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |