LoginSignup
21
21

More than 3 years have passed since last update.

RSpec+capybara+selenium+chromedriverでブラウザ自動テスト!!

Posted at

はじめに

仕事でブラウザテストやったので自作アプリにも入れておきますううううう。

環境

  • ruby 2.5.0
  • Rails 5.0.7.2
  • rspec-rails 3.9.0
  • capybara 3.29.0
  • selenium-webdriver 3.4.4

Gem

Gemfile
group :test do
  gem 'rspec-rails'
  gem 'capybara'
  gem 'selenium-webdriver'
end
ターミナル
$ bundle install
ターミナル
$ rails g rspec:install
ターミナル

      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

こんな感じでファイルできます。

chromedriverの導入

Homebrewをアップグレード

ターミナル
$ brew tap homebrew/cask

Chrome Driverをインストール

ターミナル
$ brew cask install chromedriver

これで下準備完了

capybaraからコマンド一つで自動ブラウザテスト

spec/support/capybara.rbを作成します。

ターミナル
$ mkdir spec/support
$ touch spec/support/capybara.rb

capybara.rbに設定を記載

spec/support/capybara.rb
require 'selenium-webdriver'
require 'capybara/rspec'

Capybara.configure do |config|

  config.default_driver = :chrome
  config.javascript_driver = :chrome
  config.run_server = true
  config.default_selector = :css 
  config.default_max_wait_time = 5  
  config.ignore_hidden_elements = true
  config.save_path = Dir.pwd     
  config.automatic_label_click = false 
end

Capybara.register_driver :chrome do |app|

  options = Selenium::WebDriver::Chrome::Options.new

  options.add_argument('disable-notifications')       
  options.add_argument('disable-translate')          
  options.add_argument('disable-extensions')         
  options.add_argument('disable-infobars')           
  options.add_argument('window-size=1280,960')        


  # ブラウザーを起動する
  Capybara::Selenium::Driver.new(
    app,
    browser: :chrome,
    options: options)
end

spec_helper.rbでテストが動くように記載

spec/spec_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'support/capybara.rb'

Dir[Rails.root.join("spec/support/*.rb")].each { |f| require f }
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  config.include Capybara::DSL
end

featureテストを動作させる

この章は各アプリケーションによって書き方が異なるので参考程度に!!

featureテストの書き方がわからない人はこちらの記事を読むとわかりやすいです。
今回私の作成したアプリは記事の投稿機能があるのでそのページ変遷についてのテストを書きます。

ターミナル
$ mkdir spec/features
$ touch spec/features/post_spec.rb
spec/features/post_spec.rb
require 'rails_helper'
require 'spec_helper'

describe 'トップページ', type: :feature do
  let!(:user_a) { create(:user) }
  let!(:user_b) { create(:user) }
  let!(:post_a) { create(:post, user_id: user_a.id )}
  let!(:task_a) { create(:task, post_id: post_a.id) }
  describe "表示部分" do

    before do
      visit root_path
    end

    it "表示されること" do
      expect(current_path).to eq "/"
      expect(page).to have_content("Go-En")
    end

    it "トップページから商品詳細ページに遷移できる" do
      within first('.post-contents') do
        click_on(user_a.name)
      end
      expect(current_path).to eq "/posts/#{post_a.id}"
    end

    context "ログインしていない場合" do
      it "フォローボタンを押すとログイン画面に遷移する" do
        within first('.post-contents') do
          click_on(user_a.name)
        end
        expect(current_path).to eq "/posts/#{post_a.id}"
        click_on("フォローする")
        expect(current_path).to eq new_user_session_path
      end
    end

    context "ログインしている場合" do

      context "当人の投稿の場合" do
        before do
          visit new_user_session_path
          fill_in "user[email]", with: user_a.email
          fill_in "user[password]", with: user_a.password
          click_on 'ログインする'
        end

        it "削除ボタンを押すと投稿が削除される" do
          within first('.post-contents') do
            click_on(user_a.name)
          end
          expect(current_path).to eq "/posts/#{post_a.id}"
          expect{
            click_on("投稿を削除")
          }.to change(Post, :count).by(-1)
          expect(current_path).to eq root_path
        end

      end

      context "当人の投稿ではない場合" do
        before do
          visit new_user_session_path
          fill_in "user[email]", with: user_b.email
          fill_in "user[password]", with: user_b.password
          click_on 'ログインする'
        end

        it "フォローボタンを押すとフォローされる" do
          within first('.post-contents') do
            click_on(user_a.name)
          end
          expect(current_path).to eq "/posts/#{post_a.id}"
          expect{
            click_on("フォローする")
          }.to change(Relationship, :count).by(1)
          expect(current_path).to eq "/users/#{user_a.id}"
        end

      end

    end

  end
end

結果

ターミナル
$ bundle exec rspec spec/features

go-enfeatureテスト.mp4.gif
スクリーンショット 2019-11-02 1.48.44.png
こんな感じです。

おわりに

RSpec極めます、、、

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21