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

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

ただいまの
回答率

89.99%

【Capybara & Selenium】SystemSpecで9515ポートの接続を拒否されてしまう。

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 639

reon.negi

score 7

前提・実現したいこと

※ 文字数制限を受けたため、こちらの記事の続きとなります。

Docker環境で、Capybaraとseleniumを使ってSystemテストをしたいです。
そのために、SeleniumWebDriverを使ってsystem specを実行したのですが、9515ポートがアクセス拒否されてしまいます。

bundle exec rspec spec/system/** ↓

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

 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'

localhost:9515へのアクセスを拒否されました。サーバープロセスが存在しないように思えます。

該当のソースコード

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
gem 'rails', '~> 5.1.0'
...
...
group :development, :test do
  gem "rspec-rails"
end

group :test do
  gem 'capybara'
  gem 'selenium-webdriver'
  gem 'webdrivers'
end
FROM ruby:2.3.7

ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential node.js
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs

# chromeの追加
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
CMD ["rails", "server", "-b", "0.0.0.0"]

試したこと

1. 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

2. Railsの再起動

変化なし。

3. ポートフォワーディング

dockerコンテナにアクセスできてないのでは?と思い、docker-composeに以下を追加してみましたが解決せず。

  web:
    build: .
    command: bundle exec rails server -p 3000 -b 0.0.0.0
    ports:
      - 3000:3000
      - 9515:9515 #追加

4. ChromeDriverをGoogle Chromeのバージョンがおかしい?

ChromeDriver・・・  75.0.3770.90
Google Chrome・・・ 75.0.3770.100

こちらの記事を参考に、
ChromeDriverをGoogle Chromeのバージョンに合わせてみようとしましたが、ChromeDriver 75.0.3770.100が見つかりませんでした。

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

素のRubyスクリプトであれば、ChromeDriver自体は動作したので、Capybaraの方で、どこか設定を誤っているのではないかと考えてます。
ここ2週間ハマっており、、なかなか解決しません。。よろしくお願いいたします🙇‍♂️

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

  • Rails 5.1.7
  • ruby:2.3.7
  • RSpec 3.8
  • ChromeDriver 75.0.3770.90
  • google-chrome-stable 75.0.3770.100
  • capybara (3.15.1)
  • DockerImage
  • chromedriverのパスは通っている。
  • スクリーンショットは真っ白
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

system spec側の文法ミスで、visitをつけ忘れていた..。
subject { root_path }

subject { visit root_path }

そもそも要素がない状態で要素検証していたのが原因。
page.html
=> <html><head></head><body></body></html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

前回の質問にもコメントさせていただたものですが、気になっているので、コメントさせていただきます。

Dockerの中でrailsを起動されていますが、rspec (system spec) はどこで実行していますか?
Dockerのコンテナの中ではなくて、もしかしてホスト側でしょうか?
間違っていたらすみません。

docker-compose exec web bash

で、Dockerのコンテナの中に入ってから実行していますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/14 11:36 編集

    簡単にdocker-compose build -> docker-compose up した状態で、試してみました。
    ちょっとアプリケーションのほうはよくわからないのですが、spec中のURLを外部サイトに変更してvisitさせると、Seleniumが起動、テスト失敗&キャプチャが取れています。

    原因はわからないので申し訳ないのですが、コンテナをいったん停止させて、docker-compse build --no-chache でなどでイメージを再作成してみて、再度テストではどうでしょう?

    キャンセル

  • 2019/07/14 15:53 編集

    suamaさん、動作確認までしていただき、本当にありがとうございます!

    率直に申し上げますと、
    私がsystem specの書き方を誤り、ページにアクセスすらできたいなかったみたいで、urlの前にvisitメソッドを追加することで解決いたしました。

    ```
    RSpec.describe 'Ideas', type: :system, js: true do
    subject { visit root_path } #root_path => visit root_path
    it "投稿一覧表示" do
    subject
    expect(page).to have_content("テキスト")
    end
    end
    ```
    (まさかここだとは思わず、載せなかったことを激しく後悔..)
    たった4文字という本当にくだらないミスで2週間の期間を無駄にしてしまうプログラミングの恐ろしさを痛感しました。

    こんなオチで申し訳ないですが、なにはともあれ、ここまでご協力いただいたことを本当に感謝しております🙇‍♂️

    キャンセル

  • 2019/07/14 16:44 編集

    よかったです!!!
    (わたしもちょっといじって、 visit "http://www.google.com"とかで試しました。ソース見せてくださってありがとうございました!)
    頑張ってください!

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる