質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

9350閲覧

Docker環境で、Capybaraとseleniumを使ってSystemテストをしたい。

reon.negi

総合スコア13

Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/07/07 05:32

編集2019/07/12 05:13

前提・実現したいこと

Docker環境でRailsの開発をしています。
RailsでSystem Testできるようにしたいです。
■■な機能を実装中に以下のエラーメッセージが発生しました。
Gemfileにはcapybaraseleniumwebdriversを導入してbundle install
(参考記事)

Dockerfilechrome-driverを入れて、bundle exec rspec spec/system/**と実行して結果、以下のエラーが発生しました。
(参考記事)

発生している問題・エラーメッセージ

Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: exited abnormally (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

[翻訳]

  • Chromeが異常終了
  • DevToolsActivePortファイルが存在しません
  • CHromeの場所(/usr/bin/chromium)から開始したプロセスはもう実行されていないので、ChromeDriverはChromeがクラッシュしたと見なします。

chromedriver起動後↓

Starting ChromeDriver 75.0.3770.90 (a6dcaf7e3ec6f70a194cc25e8149475c6590e025-refs/branch-heads/3770@{#1003}) on port 9515 Only local connections are allowed. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code. [1562475145.473][SEVERE]: bind() failed: Cannot assign requested address (99)

該当のソースコード

Gemfile

1gem 'rails', '~> 5.1.0' 2... 3... 4group :development, :test do 5 gem "rspec-rails" 6end 7 8group :test do 9 gem 'capybara' 10 gem 'selenium-webdriver' 11 gem 'webdrivers' 12end 13

Dockerfile

1FROM ruby:2.3.7 2 3ENV LANG C.UTF-8 4RUN apt-get update -qq && apt-get install -y build-essential node.js 5RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ 6 && apt-get install -y nodejs 7 8# chromeの追加 9RUN apt-get update && apt-get install -y unzip && \ 10 CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \ 11 wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \ 12 unzip ~/chromedriver_linux64.zip -d ~/ && \ 13 rm ~/chromedriver_linux64.zip && \ 14 chown root:root ~/chromedriver && \ 15 chmod 755 ~/chromedriver && \ 16 mv ~/chromedriver /usr/bin/chromedriver && \ 17 sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \ 18 sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \ 19 apt-get update && apt-get install -y google-chrome-stable 20 21RUN mkdir /app 22WORKDIR /app 23COPY Gemfile /app/Gemfile 24COPY Gemfile.lock /app/Gemfile.lock 25RUN bundle install 26COPY . /app 27CMD ["rails", "server", "-b", "0.0.0.0"]

chromedriver -v

ChromeDriver 75.0.3770.90 (a6dcaf7e3ec6f70a194cc25e8149475c6590e025-refs/branch-heads/3770@{#1003})

spec/rails_helper.rbは特にいじってません。

試したこと

####1. gemを最新にする
bundle update rspec-rails capybara selenium-webdriverのようにブラウザテストに利用するgemwをすべてupdateしましたが、変化なし

####2.Sandboxオプションをつける

spec/rails_helper.rbに以下の内容を記述。

Capybara.register_driver :selenium do |app| Capybara::Selenium::Driver.new(app, { browser: :chrome, desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome( chrome_options: { # NOTE: ここでno-sandboxオプション追加する args: %w[no-sandbox headless disable-gpu window-size=1680,1050], } ) }) end Capybara.javascript_driver = :selenium

同じエラーを吐いたので、
こちらの記事にあったようchromeのoptionにdisable-dev-shm-usageを追加。

args: %w[no-sandbox disable-dev-shm-usage headless disable-gpu window-size=1680,1050]

しかし、エラー内容は変わりませんでした。

##3.chromedriverが通ったときと同じoptionを追加

selenium-webdriverが正常に動いた時と同じオプションを追加し、spec/rails_helper.rbに include。

spec/support/selenium_chrome.rb

Capybara.register_driver :chrome_headless do |app| options = ::Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--window-size=1400,1400') Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end

spec/rails_helper.rb

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } RSpec.configure do |config| config.before(:each, type: :system) do driven_by :rack_test end config.before(:each, type: :system, js: true) do driven_by :selenium_chrome_headless end end

すると9515番ポートの接続を拒否されました。

1.3) Failure/Error: raise e, "Failed to open TCP connection to " + "#{conn_address}:#{conn_port} (#{e.message})" Errno::ECONNREFUSED: Failed to open TCP connection to 127.0.0.1:9515 (Connection refused - connect(2) for "127.0.0.1" port 9515) [Screenshot]: tmp/screenshots/failures_r_spec_example_groups_ideas_xxxx_690.png # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/default.rb:129:in `response_for' # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/default.rb:82:in `request' # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/common.rb:64:in `call' # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/bridge.rb:167:in `execute' # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in `execute' # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/w3c/bridge.rb:173:in `window_handles' # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/common/driver.rb:187:in `window_handles' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara/selenium/driver.rb:178:in `window_handles' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara/selenium/driver_specializations/chrome_driver.rb:34:in `reset!' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara/session.rb:128:in `reset!' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara.rb:315:in `block in reset_sessions!' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara.rb:315:in `reverse_each' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara.rb:315:in `reset_sessions!' # /usr/local/bundle/gems/capybara-3.15.1/lib/capybara/rspec.rb:18:in `block (2 levels) in <top (required)>' # ------------------ # --- Caused by: --- # Errno::ECONNREFUSED: # Connection refused - connect(2) for "127.0.0.1" port 9515 # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/default.rb:129:in `response_for'

##4. chromedriverが起動しているか確かめる

chromedriverが起動していないのでは?と思い、以下のコマンドで確認したところ、9515番portは起動していませんでした。
netstat -atn|grep LISTEN

tcp6 0 0 ::1.3000 *.* LISTEN tcp4 0 0 *.3000 *.* LISTEN tcp6 0 0 ::1.4306 *.* LISTEN tcp4 0 0 *.4306 *.* LISTEN tcp4 0 0 127.0.0.1.53253 *.* LISTEN tcp6 0 0 ::1.53253 *.* LISTEN tcp4 0 0 127.0.0.1.631 *.* LISTEN tcp6 0 0 ::1.631 *.* LISTEN tcp46 0 0 *.33060 *.* LISTEN tcp4 0 0 127.0.0.1.3306 *.* LISTEN

##chromeのversionを合わせる
ChromeDriverGoogle Chromeのバージョンに合わせてみようとしましたが、ChromeDriver 75.0.3770.100が見つかりませんでした。

  • ChromeDriver 75.0.3770.90
  • Google Chrome 75.0.3770.100

参考: https://chida09.com/selenium-error-tcpconnection/

chromedriverが起動しない原因がわかりません。

ここ数日間ハマっており、、なかなか解決しません。。よろしくお願いいたします????‍♂️

補足情報(FW/ツールのバージョンなど)

  • Rails 5.1.7
  • RSpec 3.8
  • ChromeDriver 75.0.3770.90
  • Google Chrome 75.0.3770.100
  • capybara (3.15.1)
  • DockerImage
  • chromedriverのパスは通っている。
  • スクリーンショットは真っ白
  • 使用できるドライバ↓

:selenium, :selenium_headless, :selenium_chrome, :selenium_chrome_headlessの4つ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

・system specでurlにアクセスできていなかったので、 path → visit pathに変更。
https://teratail.com/questions/200250#reply-296669

投稿2019/07/23 03:04

reon.negi

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。
切り分けのために、Capybaraを使ったテストの前に、単純なRubyのスクリプトでは動きますか?

ruby

1# ruby sample.rb という名前で 2require 'selenium-webdriver' 3 4options = Selenium::WebDriver::Chrome::Options.new 5options.add_argument('--headless') 6options.add_argument('--no-sandbox') 7options.add_argument('--disable-dev-shm-usage') 8driver = Selenium::WebDriver.for :chrome, options: options 9 10driver.get "http://google.com/" 11puts driver.title

こんなファイルを作って、Dockerコンテナを上げて、その中で実行してみるとどうなるでしょう?
うまくいくと "Google" というメッセージがでます。

追記

コメントに書きましたが、Capybaraの最近のバージョンでこのあたりの動きが変わっています。
ソースコードが一部なのでわからないのですが、chromeOptions に、w3c: false を渡してみてはいかがでしょうか?

投稿2019/07/07 08:55

編集2019/07/08 13:32
suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reon.negi

2019/07/07 09:05 編集

@suamaさん、回答ありがとうございます^^ 同じように記述して実行したところ、無事`Google`が表示されました。
suama

2019/07/07 09:55

基本的にはChromeとWebdriver, Seleniumは大丈夫かな? では、Capybaraのテストの設定あたりでしょうか。 同じオプションが渡っているならCapybaraでもエラーにはならないかと思いますので、少し丁寧に設定を見直してみてはどうでしょうか。
reon.negi

2019/07/09 05:37

ありがとうございます! optionの方にw3c: falseを指定しましたが、同様のエラーが発生してしまいました。。 こちらでも色々試してみます。
suama

2019/07/22 08:42

こちらはもしかして解決しているでしょうか? 関連の質問がある&解決できているようなので....
reon.negi

2019/07/23 03:01 編集

すみません、こちら解決いたしました! 放置状態でしたので、閉じます!
suama

2019/07/23 03:47

よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問