🐈

Apple silicon 搭載 Mac で SystemSpec を動かす

2023/12/15に公開

Apple silicon 搭載 Mac の Docker 上で SystemSpec を動かそうとしたところ、いくつかのハマりどころがありました。そこで、執筆時点での最新の設定方法を共有します。

この記事を読むとわかること

  • 執筆時点での最新設定方法

この記事を読んでもわからないこと

  • Rails の SystemSpec の書き方
  • エラーとその原因

環境

  • MacBook Air ( M1 )

  • macOS 13.5

  • Docker Desktop 4.25

  • base image

    • ruby:3.2
    • seleniarm/standalone-chromium:116.0
  • Gem

    • rails (6.1)
    • rspec-rails (5.1)
    • capybara (3.392)
    • selenium-webdriver (4.10)

設定方法

実際に SystemSpec を動かすための設定方法を紹介します。まず、Railsプロジェクトの spec/rails_helper.rb に以下のような設定を追加します。

spec/rails_helper.rb
 config.before(:each, type: :system) do |example|
    if example.metadata[:use_js]
      options = {}
      if ENV.key?('SELENIUM_DRIVER_URL')
        Capybara.server_host = ENV['CAPYBARA_SERVER_HOST']
        Capybara.app_host = ENV['CAPYBARA_APP_HOST']

        Capybara.register_driver :remote_chrome do |app|
          url = ENV['SELENIUM_DRIVER_URL']

          options = Selenium::WebDriver::Chrome::Options.new
          options.add_argument('no-sandbox')
          options.add_argument('headless')
          options.add_argument('disable-gpu')
          options.add_argument('window-size=1280,800')

          Capybara::Selenium::Driver.new(app, browser: :remote, url: url, capabilities: options)
        end

        driven_by :remote_chrome
      else
        driven_by :selenium, using: :headless_chrome, screen_size: [1280, 800] do |opt|
          opt.add_argument('--headless --disable-gpu --no-sandbox --lang=ja-JP')
        end
      end
    else
      driven_by :rack_test
    end
  end
end

上記の設定では、Selenium を使用したブラウザテストを行う際のドライバの設定を行っています。
続いて、Docker 側の設定も行います。具体的には、 docker-compose.yml に以下のような設定を追加します。

docker-compose.yml
version: '3.8'
services:
  web:
    environment:
      SELENIUM_DRIVER_URL: http://selenium_chrome:4444/wd/hub
      CAPYBARA_SERVER_HOST: web
      CAPYBARA_APP_HOST: http://web
  selenium_chrome:
    image: seleniarm/standalone-chromium:116.0

以上で、SystemSpec を実行するための準備が整いました。

参考記事

https://tech.gunosy.io/entry/docker_chromium_with_m1
https://stackoverflow.com/questions/69851082/how-do-i-correct-this-selenium-initialisation-command-deprecation-warning
https://qiita.com/mass584/items/c30e0762050a10503da7

Linc'well, inc.

Discussion