linux 在heroku上使用Chrome驱动程序运行selenium:“找不到Chrome二进制文件”

cwxwcias  于 12个月前  发布在  Linux
关注(0)|答案(4)|浏览(169)

我是一个新手,因为它涉及到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,但在运行脚本时看到相同的错误。

sz81bmfz

sz81bmfz1#

这里有一个最小的配置,对我来说是有效的。你需要有正确的buildpacks来安装Chrome,看起来你只安装了chromedriver,它是一个单独的二进制文件。
https://github.com/jormon/minimal-chrome-on-heroku-xvfb
您可以使用README.md上的按钮测试一键部署到Heroku。
让我知道进展如何!

hujrc8aj

hujrc8aj2#

我知道这有点晚了。但我也遇到了同样的问题,只是想弄清楚了。我疯了。原来Heroku并没有真正维护他们的构建包。因此,安装这些构建包:
https://github.com/awl19/heroku-buildpack-google-chromehttps://github.com/awl19/heroku-buildpack-chromedriver
当然还有你的heroku/ruby buildpack。
嘣。它会像时钟一样工作。另外超级重要的是,不要忘记在每次请求后显式退出浏览器,或者在一定的时间后,否则它会无限期地产生,会耗尽你所有的内存,最终杀死服务器。你可以这样做,

session.quit

字符串
我猜对你来说(无论你在哪里调用一个新的水豚会话..也许在你的控制器里?)它应该看起来像这样:

session = Capybara::Session.new(:selenium)
   // your browser actions or logic here

 session.quit

6psbrbz9

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

2uluyalo

2uluyalo4#

回复

YOUR_PATH = 'whatever/your/path/is' # to your bin dir
CURRENT_DIR = File.expand_path(File.dirname(__FILE__))
CHROMEDRIVER_FN = File.join(CURRENT_DIR, YOUR_PATH, "bin/chromedriver")
# —OR—
#CHROMEDRIVER_FN = File.join(File.absolute_path('..', CURRENT_DIR), YOUR_PATH, "bin/chromedriver")
Selenium::WebDriver::Chrome.driver_path = CHROMEDRIVER_FN

字符串

上下文

下面的例子展示了我在最近的一个Ruby项目中对Selenium Chromedriver的设置。
1)文件结构:

ruby_app/
├── Gemfile
├── Gemfile.lock
├── History.txt
├── Manifest.txt
├── README.md
├── Rakefile
├── bin
│   └── chromedriver
├── doc
├── lib
│   └── ruby_app.rb
└── test
    ├── test_files
    │   ├── test_config.yml
    │   └── uris_array_dump.yml
    ├── test_ruby_app.rb
    ├── test_google.rb
    ├── test_helper.rb
    └── test_output


2)在test/test_helper.rb中:

TEST_DIR = File.expand_path(File.dirname(__FILE__))
TEST_FILES = File.join(TEST_DIR, "test_files")
TEST_OUTPUT = File.join(TEST_DIR, "test_output")
CHROMEDRIVER_FN = File.join(File.absolute_path('..', TEST_DIR), "bin", "chromedriver")


上面的代码使用了File.absolute_path,参见:http://ruby-doc.org/core-2.3.1/File.html#method-c-absolute_path
将路径名转换为绝对路径名。相对路径是从进程的当前工作目录引用的,除非指定了 dir_string,在这种情况下,它将用作起点。
3)在test/test_google.rb中:

Selenium::WebDriver::Chrome.driver_path = CHROMEDRIVER_FN

相关问题