我是一个新手,因为它涉及到Linux的设置(和heroku),所以道歉,如果这个问题是基本的。
我想在Heroku上运行selenium webkit(ruby)。我遇到了一个困难,我的脚本找不到Chrome二进制文件。
我实际上让Chrome自己工作:
~ $ chromedriver
Starting ChromeDriver 2.22.397932 (282ed7cf89cf0053b6542e0d0f039d4123bbb6ad) on port 9515
Only local connections are allowed.
字符串chromedriver
是我从/app/vendor/bundle/bin/chromedriver
复制的一个文件,只是为了让现在更容易。chromedriver
文件存在,因为我安装了chromedriver-helper gem。gem应该使二进制文件可用于ruby进程,但没有。
我也尝试过显式设置路径,例如在我的ruby代码中设置Selenium::WebDriver::Chrome.driver_path = 'chromedriver'
,将上述文件放在根目录中。
这一切都完美地在本地工作(有或没有driver_path
)
可能是什么原因呢?我读了this SO thread从多年前,但它似乎过时了我。任何想法将不胜感激!
错误跟踪:
~ $ ruby bin/run.rb
/app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/response.rb:70:in `assert_ok': unknown error: cannot find Chrome binary (Selenium::WebDriver::Error::UnknownError)
(Driver info: chromedriver=2.22.397932 (282ed7cf89cf0053b6542e0d0f039d4123bbb6ad),platform=Linux 3.13.0-91-generic x86_64)
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:78:in `new'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:78:in `create_response'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/default.rb:90:in `request'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:59:in `call'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:649:in `raw_execute'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:123:in `create_session'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:87:in `initialize'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/chrome/bridge.rb:48:in `initialize'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/common/driver.rb:64:in `new'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/common/driver.rb:64:in `for'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver.rb:84:in `for'
from /app/lib/mealpass_orderer.rb:12:in `initialize'
from /app/lib/mealpass_orderer.rb:8:in `new'
from /app/lib/mealpass_orderer.rb:8:in `run'
from bin/run.rb:3:in `<main>'
型
更新:
我在AWS EC2服务器上尝试了同样的方法(启动示例,克隆git repo,安装所有依赖项)。同样的情况也发生在那里。也就是说,能够从终端执行chromedriver,但在运行脚本时看到相同的错误。
4条答案
按热度按时间sz81bmfz1#
这里有一个最小的配置,对我来说是有效的。你需要有正确的buildpacks来安装Chrome,看起来你只安装了chromedriver,它是一个单独的二进制文件。
https://github.com/jormon/minimal-chrome-on-heroku-xvfb
您可以使用README.md上的按钮测试一键部署到Heroku。
让我知道进展如何!
hujrc8aj2#
我知道这有点晚了。但我也遇到了同样的问题,只是想弄清楚了。我疯了。原来Heroku并没有真正维护他们的构建包。因此,安装这些构建包:
https://github.com/awl19/heroku-buildpack-google-chromehttps://github.com/awl19/heroku-buildpack-chromedriver
当然还有你的heroku/ruby buildpack。
嘣。它会像时钟一样工作。另外超级重要的是,不要忘记在每次请求后显式退出浏览器,或者在一定的时间后,否则它会无限期地产生,会耗尽你所有的内存,最终杀死服务器。你可以这样做,
字符串
我猜对你来说(无论你在哪里调用一个新的水豚会话..也许在你的控制器里?)它应该看起来像这样:
型
6psbrbz93#
ChromeDriver只是Chrome的一个驱动程序。它需要安装在同一台机器上的实际Chrome浏览器才能实际工作。
Heroku在其dynos上默认没有安装Chrome。您需要使用安装Chrome的构建包。例如:
https://github.com/dwayhs/heroku-buildpack-chrome
你可以看到它是如何获取Chrome的:
https://github.com/dwayhs/heroku-buildpack-chrome/blob/master/bin/compile#L36-38
2uluyalo4#
回复
字符串
上下文
下面的例子展示了我在最近的一个Ruby项目中对Selenium Chromedriver的设置。
1)文件结构:
型
2)在
test/test_helper.rb
中:型
上面的代码使用了
File.absolute_path
,参见:http://ruby-doc.org/core-2.3.1/File.html#method-c-absolute_path将路径名转换为绝对路径名。相对路径是从进程的当前工作目录引用的,除非指定了
dir_string
,在这种情况下,它将用作起点。3)在
test/test_google.rb
中:型