2016-07-08 6 views
5

Linuxの設定(とheroku)のように私は騒ぎです。herokuのchromeドライバでセレンを動かす: `Chromeのバイナリを見つけることができません。 '

私はHerokuでselenium webkit(rubyで)を実行したいと思います。スクリプトにChromeバイナリファイルが見つからないという難点があります。ただ今のところ、それを容易にするために、私は/app/vendor/bundle/bin/chromedriverからコピーされたファイルであること

~ $ chromedriver 
Starting ChromeDriver 2.22.397932 (282ed7cf89cf0053b6542e0d0f039d4123bbb6ad) on port 9515 
Only local connections are allowed. 

chromedriver

は、私は実際にそれ自体で動作するようにクロムを得ました。 chromedriver-helper gemをインストールしたので、 chromedriverファイルが存在します。この宝石は、バイナリファイルをルビプロセスに利用できるようにしたが、そうしなかった。

また、明示的にパスを設定しようとしました。私のルビーコードでは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>' 

UPDATE:

私はAWS EC2サーバと同じ試してみました(打ち上げ例えば、クローン化されたGitのレポ、すべての依存関係をインストール)。そこにも同じことが起こります。つまり、端末からクロムドライバを実行できますが、スクリプトを実行すると同じエラーが表示されます。

+0

代わりに[Poltergeist](https://github.com/teampoltergeist/poltergeist)を使用しているとお考えですか? –

+0

@IlyaVassilevskyいいえ、私はまだPoltergeistを試していません。私はこのエラーが "ヘッド"を持っているクロムドライバーと何か関係があるのだろうか –

+0

リンクされたSOの質問が私に聞こえるのは正確にあなたが打つ問題のようです –

答えて

6

ChromeDriverはChromeのちょうどドライバです。実際に動作するには、同じマシンに実際のChromeブラウザがインストールされている必要があります。

HerokuにはデフォルトでChromeがインストールされていません。 Chromeをインストールするビルドパックを使用する必要があります。

https://github.com/dwayhs/heroku-buildpack-chrome

あなたはそれがChromeを取り出す方法を見ることができます:たとえば

https://github.com/dwayhs/heroku-buildpack-chrome/blob/master/bin/compile#L36-38

+0

ありがとう@Ilya。私はこのビルドパックを試して、それは動作しませんでした。私はherokuにgoogle chrome(または任意のブラウザ)をインストールすることがもっと関わっているかもしれないと思っています。 –

+1

回答ありがとうございました。私はHerokuにChromeをインストールすることができなかったので、PhantomjsでWatirに書き直してしまった。 –

1

ANSWER

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 

CONTEXT

次の例では、最近のRubyプロジェクトにセレンChromedriverのための私のセットアップを示しています。

1)ファイル構造:test/test_helper.rb

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_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が指定されていない限り、プロセスの現在の作業ディレクトリから参照される です。この場合、開始点は となります。test/test_google.rb


3):

Selenium::WebDriver::Chrome.driver_path = CHROMEDRIVER_FN 
+1

あなたの答えに感謝します。私はそれを使って遊んだり、上のすべてをirbコンソールと同様にコード内で実行しました。また、バンドルフォルダ( '/ app/vendor/bundle/bin/chromedriver')で実行可能ファイルをハードコーディングしてみました。私は 'CHROMEDRIVER_FN'の値を印刷しようとしました。 'CHROMEDRIVER_FN'は正しく設定されます。ファイルは確かにそこにありますが、Seleniumは実行時にそれを見ません。 –

+0

私はこのための恩恵を受けた –

+0

あまりにも悪いです。少なくとも私たちは今、Herokuがここの要素であることを知っています...賞金と幸運! – SoAwesomeMan

1

ここでは私のために働いています最小構成です。 chromeもインストールするには適切なビルドパックが必要です。chromeriverを別のバイナリとしてインストールしているようです。

https://github.com/jormon/minimal-chrome-on-heroku-xvfb

あなたはワンボタンがREADME.md上のボタンを使用してHerokuのにデプロイテストすることができます。

どうすればいいか教えてください!

関連する問題