{"id":19667257,"url":"https://github.com/willnet/capybara-readme-ja","last_synced_at":"2025-07-06T15:37:51.197Z","repository":{"id":9064985,"uuid":"10834597","full_name":"willnet/capybara-readme-ja","owner":"willnet","description":"Capybara の README 和訳","archived":false,"fork":false,"pushed_at":"2022-10-24T23:44:31.000Z","size":75,"stargazers_count":131,"open_issues_count":1,"forks_count":10,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-02-24T02:16:42.616Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://willnet.github.io/capybara-readme-ja/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"twbs/bootstrap","license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/willnet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-06-21T03:29:49.000Z","updated_at":"2024-12-24T04:32:24.000Z","dependencies_parsed_at":"2023-01-11T17:32:20.431Z","dependency_job_id":null,"html_url":"https://github.com/willnet/capybara-readme-ja","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Fcapybara-readme-ja","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Fcapybara-readme-ja/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Fcapybara-readme-ja/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Fcapybara-readme-ja/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willnet","download_url":"https://codeload.github.com/willnet/capybara-readme-ja/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240976367,"owners_count":19887476,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T16:31:24.617Z","updated_at":"2025-02-27T04:18:42.493Z","avatar_url":"https://github.com/willnet.png","language":null,"funding_links":["https://www.patreon.com/capybara"],"categories":[],"sub_categories":[],"readme":"# Capybara\n\n## これはなに\n\n[Capybara](https://github.com/teamcapybara/capybara) の [README.md](https://github.com/teamcapybara/capybara/blob/master/README.md) を翻訳したものです。「意味が通じること」を重視しており、正確な翻訳を意図したものではありません(なるべく正確に訳そうとは思っています)。原文が更新されていたり、翻訳の間違いを見つけたら Pull Request を送っていただけると助かります。\n\n現在の翻訳は、[331c8d1811e637d793ee5557c70a0db66cad8217](https://github.com/teamcapybara/capybara/blob/331c8d1811e637d793ee5557c70a0db66cad8217/README.md) を元に作成されています。新しい翻訳に追従するPull Requestをお待ちしています。\n\n## 序文\n\nCapybara は、webアプリケーションのテストを補助するライブラリです。ユーザが実際に web アプリを扱うやり方をシミュレートします。Capybara は複数のドライバを切り替えて使うことができます。デフォルトでは Rack::Test と Selenium をサポートしており、外部の gem で WebKit をサポートしています。\n\n### Capybara をサポートする\n\nもしあなたやあなたの会社が Capybara に価値を感じて、継続的なメンテナンスや開発を財政的に支援してくださるのでしたら、[Patreon](https://www.patreon.com/capybara)を見てください。\n\n誰かの助けが必要なら、メーリングリストで質問してみてください(Github の issue を使うのはご遠慮ください)。 http://groups.google.com/group/ruby-capybara\n\n## 目次\n\n- [主な利点](#主な利点)\n- [セットアップ](#セットアップ)\n- [Capybara を Cucumber と使う](#capybara-を-cucumber-と使う)\n- [Capybara を RSpec と使う](#capybara-を-rspec-と使う)\n- [Capybara を Test::Unit と使う](#capybara-を-testunit-と使う)\n- [Capybara を Minitest と使う](#capybara-を-minitest-と使う)\n- [Capybara を Minitest::Spec と使う](#capybara-を-minitestspec-と使う)\n- [ドライバ](#ドライバ)\n    - [ドライバを選択する](#ドライバを選択する)\n    - [RackTest](#racktest)\n    - [Selenium](#selenium)\n    - [Apparition](#apparition)\n- [DSL](#dsl)\n    - [Navigating](#navigating)\n    - [Clicking links and buttons](#clicking-links-and-buttons)\n    - [Interacting with forms](#interacting-with-forms)\n    - [Querying](#querying)\n    - [Finding](#finding)\n    - [Scoping](#scoping)\n    - [Working with windows](#working-with-windows)\n    - [Scripting](#scripting)\n    - [Modals](#modals)\n    - [Debugging](#debugging)\n- [Matching](#matching)\n    - [Exactness](#exactness)\n    - [Strategy](#strategy)\n- [Transactions and database setup](#transactions-and-database-setup)\n- [Asynchronous JavaScript (Ajax and friends)](#asynchronous-javascript-ajax-and-friends)\n- [Using the DSL elsewhere](#using-the-dsl-elsewhere)\n- [Calling remote servers](#calling-remote-servers)\n- [Using sessions](#using-sessions)\n    - [Named sessions](#named-sessions)\n    - [Using sessions manually](#using-sessions-manually)\n- [XPath, CSS and selectors](#xpath-css-and-selectors)\n- [Beware the XPath // trap](#beware-the-xpath--trap)\n- [Configuring and adding drivers](#configuring-and-adding-drivers)\n- [Gotchas:](#gotchas)\n- [\"Threadsafe\" mode](#threadsafe-mode)\n- [Development](#development)\n\n## 主な利点\n\n- **セットアップいらず** Rails や Rack アプリを使っているならすぐに使えます\n\n- **直感的な API** 私たちが実際に使っている言葉が使えます\n\n- **バックエンドを変更できる** テストを変更することなく、速い headless なブラウザを使ったり実際のブラウザを使ったりができます\n\n- **パワフルな同期機能** 非同期プロセスの完了を待つためのコードを書く必要はありません。\n\n## セットアップ\n\nCapybaraにはRuby 2.7.0以上が必要です。インストールするには、次の行をあなたのGemfileに追加して、bundle install を実行してください。\n\n```ruby\ngem 'capybara'\n```\n\nもし Rails を使っているなら、テストのヘルパファイルに下記の行を追記してください\n\n```ruby\nrequire 'capybara/rails'\n```\n\nもし Rails を使っていないなら、Capybara.app に rack アプリを代入してください\n\n```ruby\nCapybara.app = MyRackApp\n```\n\nもし JavaScript のテストがしたい、もしくはリモートのURLに対してテストをしたいときは、別のドライバを使う必要があるでしょう。\nもし Rails 5.0 以上を使っているにもかかわらず、Rails 5.1 から導入されたシステムテストを使っていないときは、 Rails のデフォルトに合わせてサーバーを Puma に変更した方が良いでしょう。\n\n```ruby\nCapybara.server = :puma # セットアップはこれで完了\nCapybara.server = :puma, { Silent: true } # テストで Puma 起動時のログを出力をしないオプション\n```\n\n## Capybara を Cucumber と使う\n\n`cucumber-rails` gem はビルトインで Capybara 用のコードを含んでいます。もしあなたが Rails を使っていないなら、`capybara/cucumber` をロードするコードを書く必要があります。\n\n```ruby\nrequire 'capybara/cucumber'\nCapybara.app = MyRackApp\n```\n\nstep 中に Capybara の DSL を下記のように書けます。\n\n```ruby\nWhen /I sign in/ do\n  within(\"#session\") do\n    fill_in 'Login', :with =\u003e 'user@example.com'\n    fill_in 'Password', :with =\u003e 'password'\n  end\n  click_link 'Sign in'\nend\n```\n\n`@javascript`タグを使うことで、ドライバを`Capybara.javascript_driver`(`:selenium` がデフォルト)に切り替えることができます。\n\n```ruby\n@javascript\nScenario: do something Ajaxy\n  When I click the Ajax link\n  ...\n```\n\n明示的にドライバを指定する`@selenium`や`@rack_test`タグも用意されています。\n\n## Capybara を RSpec と使う\n\n下記の上を追加して(通常は`spec_helper.rb`ファイル)、RSpec 3.5 以上用のコードをロードしましょう。\n\n```ruby\nrequire 'capybara/rspec'\n```\n\nもしあなたが Rails を使っているならば、Capybara の spec は（[RSpec を使っている場合]((https://relishapp.com/rspec/rspec-rails/v/4-0/docs/directory-structure))） `spec/features` か `spec/system` に置きましょう。\nもしあなたが別のディレクトリに Capybara の spec を置いているなら、書いているテストの種類に応じて example groups に `type: :feature` または `type: :system` を追加してください。\n\nもしあなたが Rails の system spec を使っているなら、使用するドライバを選ぶために[ドキュメント](https://relishapp.com/rspec/rspec-rails/docs/system-specs/system-spec#system-specs-driven-by-selenium-chrome-headless)を見てください。\nもしあなたが Rails を使っていないのならば、Capybara を使いたい全ての example groups に `type: :feature` を追加する必要があります。\n\n下記のように spec を書けます。\n\n```ruby\ndescribe \"the signin process\", type: :feature do\n  before :each do\n    User.create(email: 'user@example.com', password: 'password')\n  end\n\n  it \"signs me in\" do\n    visit '/sessions/new'\n    within(\"#session\") do\n      fill_in 'Email', :with =\u003e 'user@example.com'\n      fill_in 'Password', :with =\u003e 'password'\n    end\n    click_button 'Sign in'\n    expect(page).to have_content 'Success'\n  end\nend\n```\n\n`js: true` を使うことで、ドライバを`Capybara.javascript_driver`(`:selenium` がデフォルト)に切り替えることができます。もしくは`:driver`オプションを使うと特定のドライバに切り替えることができます。\n\n例\n\n```ruby\ndescribe 'some stuff which requires js', js: true do\n  it 'will use the default js driver'\n  it 'will switch to one specific driver', driver: :apparition\nend\n```\n\nCapybara には受け入れテスト記述用のDSLもあります。\n\n```ruby\nfeature \"Signing in\" do\n  background do\n    User.create(:email =\u003e 'user@example.com', :password =\u003e 'caplin')\n  end\n\n  scenario \"Signing in with correct credentials\" do\n    visit '/sessions/new'\n    within(\"#session\") do\n      fill_in 'Email', :with =\u003e 'user@example.com'\n      fill_in 'Password', :with =\u003e 'caplin'\n    end\n    click_link 'Sign in'\n    expect(page).to have_content 'Success'\n  end\n\n  given(:other_user) { User.create(:email =\u003e 'other@example.com', :password =\u003e 'rous') }\n\n  scenario \"Signing in as another user\" do\n    visit '/sessions/new'\n    within(\"#session\") do\n      fill_in 'Email', :with =\u003e other_user.email\n      fill_in 'Password', :with =\u003e other_user.password\n    end\n    click_link 'Sign in'\n    expect(page).to have_content 'Invalid email or password'\n  end\nend\n```\n\n\n`feature` は実は単なる `describe ... type: :feature` のエイリアスです。`background` は `before` 、 `scenario` は `it`、`given` と `given!` は それぞれ `let` と `let!` のエイリアスです。\n\n最後に、view spec 用の Capybara マッチャ もあります。\n\n```ruby\nRSpec.describe \"todos/show.html.erb\", type: :view do\n  it \"displays the todo title\" do\n    assign :todo, Todo.new(title: \"Buy milk\")\n\n    render\n\n    expect(rendered).to have_css(\"header h1\", text: \"Buy milk\")\n  end\nend\n```\n\n**注釈: 「capybara/rspec」を require する場合、Capybara::DSL メソッドである `all`/`within` と同じ名前のビルトイン RSpec マッチャ間の名前衝突を避けるために、いくつかのプロキシメソッドがインストールされます。**\n**「capybara/rspec」を require しないのなら、RSpec と「capybara/dsl」を require した後に「capybara/rspec/matcher_proxies」を require することで、名前衝突回避用のプロキシメソッドをインストールできます。**\n\n## Capybara を Test::Unit と使う\n\n`Test::Unit` を使っているなら、Capybara テスト用のベースとなるクラスを下記のように定義します。\n\n```ruby\nclass CapybaraTestCase \u003c Test::Unit::TestCase\n  include Capybara::DSL\n\n  def teardown\n    Capybara.reset_sessions!\n    Capybara.use_default_driver\n  end\nend\n```\n\n## Capybara を Minitest と使う\n\n* もしあなたが Rails のシステムテストを使っているなら、使用するドライバを選ぶためにRailsのドキュメントを見てください。\n\n* もしあなたが Rails を使っているにもかかわらず、Rails のシステムテストを使っていないのなら、下記のコードを `test_helper.rb` に追加しましょう。\n`ActionDispatch::IntegrationTest`を継承している全てのテストで Capybara が利用可能になります。\n\n\n```ruby\nrequire 'capybara/rails'\nrequire 'capybara/minitest'\n\nclass ActionDispatch::IntegrationTest\n  # 全てのテストで Capybara DSL を利用可能にします\n  include Capybara::DSL\n  # `assert_*` メソッドが Minitest assertions のように振る舞うようにします\n  include Capybara::Minitest::Assertions\n\n  # テスト間のセッションとドライバをリセットします\n  teardown do\n    Capybara.reset_sessions!\n    Capybara.use_default_driver\n  end\nend\n```\n\n\n* もしあなたが Rails を使っていないのなら、Capybara のテスト用のベースとなるクラスを下記のように定義します。\n\n```ruby\nrequire 'capybara/minitest'\n\nclass CapybaraTestCase \u003c Minitest::Test\n  include Capybara::DSL\n  include Capybara::Minitest::Assertions\n\n  def teardown\n    Capybara.reset_sessions!\n    Capybara.use_default_driver\n  end\nend\n```\n\n`teardown` をオーバライドする全てのサブクラスで `super` を呼ぶことを忘れないでください。\n\nドライバを変更するには、`Capybara.current_driver` に代入しましょう。\n\n例\n\n```ruby\nclass BlogTest \u003c ActionDispatch::IntegrationTest\n  setup do\n    Capybara.current_driver = Capybara.javascript_driver # デフォルト :selenium\n  end\n\n  test 'shows blog posts' do\n    # ... このテストは Seleniumu によって実行される ...\n  end\nend\n```\n\n## Capybara を Minitest::Spec と使う\n\nMinitest 用の上記手順に従った上で、さらに capybar/minitest/spec を require します。\n\n```ruby\npage.must_have_content('Important!')\n```\n\n## ドライバ\n\nCapybara では、同じ DSL で様々なブラウザや headless なドライバを扱うことができます。\n\n### ドライバを選択する\n\nデフォルトでは、Capybara は `:rack_test` ドライバを使います。`:rack_test` は速いけれど、JavaScript をサポートしていないのと、Rack アプリの外側からリモート API や OAuth サービスのような HTTP リソースにアクセス出来ないという制限があります。これらの制限を回避するには、欲しい機能に合わせて別のデフォルトドライバを設定します。例えばもし Selenium で全てのテストを走らせたければ、下記のように書けます。\n\n```ruby\nCapybara.default_driver = :selenium # :selenium_chrome と :selenium_chrome_headless も登録されます\n```\n\nしかし、もしあなたが Rspec か Cucumber を使っているのなら（そして JS なしであなたのアプリが正しく動作しているのなら）、より速い `:rack_test` を default_driver のままにしておいて、JavaScript を扱う必要のあるテストにだけ それぞれ `js: true` もしくは `@javascript` でマークを付けることもできます。デフォルトでは、JavaScript のテストは `:selenium` ドライバが使われます。`Capybara.javascript_driver`に代入することで変更可能です。\n\nドライバを一時的に変更することもできます(一般的に Before/setup と After/teardown ブロックで使われます)\n\n```ruby\nCapybara.current_driver = :apparition # 一時的に別のドライバを設定\n# ここでテストする\nCapybara.use_default_driver       # デフォルトドライバに戻す\n```\n\n**注釈:** ドライバの変更は新しい session を作ります。なのでテストの途中で変更することはできません。\n\n### RackTest\n\nRackTest は Capybara のデフォルトドライバです。これは pure Ruby で書かれていて、JavaScript の実行はサポートしていません。RackTest ドライバは直接 Rack のインタフェースに作用するので、テスト用のサーバーを立ち上げる必要はありません。つまり Rack アプリ(Rails や Sinatra、他のほとんどの Ruby フレームワークは Rack アプリです)でなければ、このドライバを使うことは出来ないということです。さらには、 RackTest ドライバはリモートのアプリのテストにも使えませんし、アプリが扱うリモートの URL にアクセスすることもできません(例: 外部サイトへのリダイレクト、外部 API、OAuth サービス)\n\n[capybara-mechanize](https://github.com/jeroenvandijk/capybara-mechanize) は、RackTest に似ていて、リモートのサーバにアクセス可能なドライバを提供しています。\n\nRackTest はこのように設定することが出来ます。\n\n```ruby\nCapybara.register_driver :rack_test do |app|\n  Capybara::RackTest::Driver.new(app, headers: { 'HTTP_USER_AGENT' =\u003e 'Capybara' })\nend\n```\n\n詳しくは \"Configuring and adding drivers\" のセクションを見てください。\n\n### Selenium\n\n現在、Capybara は [Selenium 3.5以上(Webdriver)](https://www.selenium.dev/projects/) をサポートしています。Selenium を利用するためには、`selenium-webdriver` gem をインストールする必要があります。bundler を使っているのなら Gemfile にそれを追加しましょう。\n\nCapybara は Selenium を使用する名前付きのドライバを数多く用意しています。それらが以下です:\n\n* :selenium                 =\u003e Firefox を動作させる Selenium\n* :selenium_headless        =\u003e headless な設定で Firefox を動作させる Selenium\n* :selenium_chrome          =\u003e Chrome を動作させる Selenium\n* :selenium_chrome_headless =\u003e headless な設定で Chrome を動作させる Selenium\n\nこれらはローカルデスクトップにおける設定 (関連するソフトウェアのインストールを含む) では動作するはずですが、追加のオプションをブラウザに渡す必要のある CI 環境で使用する場合、カスタマイズが必要になることがあります。\n\n**注釈:** 異なるスレッドでサーバを動かす種類のドライバは、テスト中で同一のトランザクションを共有することができません。それによりテストとテストサーバ間でデータを共有できなくなります。[トランザクションとデータベースのセットアップ](#transactions-and-database-setup)の章を読んでください。\n\n### Apparition\n\n[Apparition ドライバ]((https://github.com/twalpole/apparition))は、ヘッドレスな設定でもそうでない設定でも Chrome を使ってテストを実行できる新しいドライバです。モダン JS/CSS を使えるようにしつつ、[Poltergeist ドライバ API](https://github.com/teampoltergeist/poltergeist) および [capybara-webkit API](https://github.com/thoughtbot/capybara-webkit)との下位互換性を提供しています。CDP を使用して Chrome と通信するため、chromedriver が不要になります。このドライバは Capybara の現在の開発者によって開発されており、最新のカピバラのリリースに追従するよう努められています。v1.0になったら teamcapybara のリポジトリにおそらく移動されるでしょう。\n\n## DSL\n\n完全なリファレンスは [rubydoc.info](https://rubydoc.info/github/teamcapybara/capybara/master) で利用可能です。\n\n**注釈: デフォルトでは、Capybara は visible 要素のみを検索します。実際のユーザーは目に見えない要素を操作することができないためです。**\n\n**注釈:** Capybara での全ての検索は case sensitive です。これは、case insensivity をサポートしていない XPath を大量に使っているためです\n\n### Navigating\n\n他のページに遷移するメソッドとして\u003ctt\u003e[visit](https://rubydoc.info/github/teamcapybara/capybara/master/Capybara/Session#visit-instance_method)\u003c/tt\u003eが使えます。\n\n```ruby\nvisit('/projects')\nvisit(post_comments_path(post))\n```\n\nvisit メソッドは引数を一つだけ取り、リクエストに使用するメソッドは **常に** GET です。\n\n**注釈**: `current_path` の値を直接テストすることで、現在のパスを assert することもできます。しかし、 `have_current_path` マッチャを使う方が、前のアクション (`click_link` など) が完了していることを保証するCapybara の[待機動作](#asynchronous-javascript-ajax-and-friends)を利用するため、より安全です。\n\n```ruby\nexpect(current_path).to eq(post_comments_path(post))\n```\n\n### Clicking links and buttons\n\nフルのリファレンスはこちら: [Capybara::Node::Actions](https://rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Actions)\n\nリンクやボタンを押してwebアプリと通信することが出来ます。Capybara は自動でリダイレクトに対応し、ボタンに関連するフォームをサブミットします。\n\n```ruby\nclick_link('id-of-link')\nclick_link('Link Text')\nclick_button('Save')\nclick_on('Link Text') # リンクかボタンどちらかをクリック\nclick_on('Button Value')\n```\n\n### Interacting with forms\n\nフルのリファレンスはこちら: [Capybara::Node::Actions](http://rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Actions)\n\nフォーム要素を操作するツールがたくさんあります。\n\n```ruby\nfill_in('First Name', :with =\u003e 'John')\nfill_in('Password', :with =\u003e 'Seekrit')\nfill_in('Description', :with =\u003e 'Really Long Text...')\nchoose('A Radio Button')\ncheck('A Checkbox')\nuncheck('A Checkbox')\nattach_file('Image', '/path/to/image.jpg')\nselect('Option', from: 'Select Box')\n```\n\n### Querying\n\nフルのリファレンスはこちら: [Capybara::Node::Matchers](http://rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Matchers)\n\nCapybara はページに特定の要素が存在しているかを調べることが出来るオプションを豊富に持っており、かつそれらの要素の操作もできます。\n\n```ruby\npage.has_selector?('table tr')\npage.has_selector?(:xpath, '//table/tr')\n\npage.has_xpath?('//table/tr')\npage.has_css?('table tr.foo')\npage.has_content?('foo')\n```\n\n**注釈:** `has_no_selector?` のような否定形は、`not has_selector?`とは異なります。詳しくは asynchronous JavaScript の章を読みましょう。\n\nRspecの魔法のマッチャによって下記のように書けます。\n\n```ruby\nexpect(page).to have_selector('table tr')\nexpect(page).to have_selector(:xpath, '//table/tr')\n\nexpect(page).to have_xpath('//table/tr')\nexpect(page).to have_css('table tr.foo')\nexpect(page).to have_content('foo')\n```\n\n### Finding\n\nフルのリファレンスはこちら: [Capybara::Node::Finders](http://rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Finders)\n\n特定の要素を探して操作することが出来ます。\n\n```ruby\nfind_field('First Name').value\nfind_field(id: 'my_field').value\nfind_link('Hello', :visible =\u003e :all).visible?\nfind_link(class: ['some_class', 'some_other_class'], :visible =\u003e :all).visible?\n\nfind_button('Send').click\nfind_button(value: '1234').click\n\nfind(:xpath, \"//table/tr\").click\nfind(\"#overlay\").find(\"h1\").click\nall('a').each { |a| a[:href] }\n```\n\n追加の属性/プロパティで要素を検索する必要がある場合は、フィルター ブロックを渡すこともできます。これは、通常の待機動作内でチェックされます。\nこれを頻繁に使用する必要がある場合は、[カスタム セレクター](http://www.rubydoc.info/github/teamcapybara/capybara/Capybara#add_selector-class_method) を追加するか、[既存のセレクタにフィルターを追加する](http://www.rubydoc.info/github/teamcapybara/capybara/Capybara#modify_selector-class_method)のが良いでしょう。\n\n```ruby\nfind_field('名'){ |el| el['データ-xyz'] == '123'}\nfind(\"#img_loading\"){ |img| img['complete'] == true }\n```\n\n**注釈:** `find` は、Ajax の章で説明されているように、要素がページに表示されるのを待ちます。もし要素が現れなければエラーを吐きます。\n\nこれらの要素は Capybara の DSL メソッドを全て使え、ページの箇所を特定して DSL の作用する場所を制限することが出来ます。\n\n```ruby\nfind('#navigation').click_link('Home')\nexpect(find('#navigation')).to have_button('Sign out')\n```\n\n### Scoping\n\nCapybara は form 操作やリンクやボタンのクリックなどの特定のアクションを、ページの特定のエリア内で行うように制限することが可能です。\u003ctt\u003e[within](http://rubydoc.info/github/teamcapybara/capybara/master/Capybara/Session#within-instance_method)\u003c/tt\u003e メソッドを使うことでそれができ、オプションでセレクタの種類を特定することが出来ます。\n\n```ruby\nwithin(\"li#employee\") do\n  fill_in 'Name', with: 'Jimmy'\nend\n\nwithin(:xpath, \"//li[@id='employee']\") do\n  fill_in 'Name', with: 'Jimmy'\nend\n```\n\nfieldset や table 用の特別なメソッドがあります。fieldset は legend タグ内の id かテキスト、table は caption タグの id かテキストを見ます。\n\n```ruby\nwithin_fieldset('Employee') do\n  fill_in 'Name', with: 'Jimmy'\nend\n\nwithin_table('Employee') do\n  fill_in 'Name', with: 'Jimmy'\nend\n```\n\n### Working with windows\n\nCapybara には、ウィンドウの検索と切り替えを簡単にする方法がいくつか用意されています。\n\n```ruby\nfacebook_window = window_opened_by do\n  click_button 'Like'\nend\nwithin_window facebook_window do\n  find('#login_email').set('a@example.com')\n  find('#login_password').set('qwerty')\n  click_button 'Submit'\nend\n```\n\n### Scripting\n\nドライバがサポートしていれば、簡単に JavaScript を実行できます。\n\n```ruby\npage.execute_script(\"$('body').empty()\")\n```\n\n簡単な式であれば、script の結果を受け取ることが出来ます。\n\n```ruby\nresult = page.evaluate_script('4 + 4');\n```\n\nより複雑な script の場合は、それらを 1 つの式として記述する必要があります。\n\n```ruby\nresult = page.evaluate_script(\u003c\u003c~JS, 3, element)\n  (function(n, el){\n    var val = parseInt(el.value, 10);\n    return n+val;\n  })(arguments[0], arguments[1])\nJS\n```\n\n### Modals\n\nドライバーがサポートしていれば、アラート、確認、プロンプトに対して、受け入れ(accept)、無視(dismiss)、応答(respond)することができます。\n\nアラートを生成するコードをブロックでラップすることにより、アラート メッセージを受け入れ(accept)、無視(dismiss)できます。\n\n```ruby\naccept_alert do\n  click_link('Show Alert')\nend\n```\n\n確認のモーダルを生成するコードをブロックでラップすることで、確認を受け入れ(accept)、無視(dismiss)できます。\n\n```ruby\ndismiss_confirm do\n  click_link('Show Confirm')\nend\n```\n\nプロンプトを受け入れ(accept)、無視(dismiss)できます。また、応答のモーダルに入力するテキストを提供することもできます。\n\n```ruby\naccept_prompt(with: 'Linus Torvalds') do\n  click_link('Show Prompt About Linux')\nend\n```\n\nすべてのモーダルメソッドは、提示されたメッセージを返します。したがって、戻り値を変数に代入することによりプロンプトメッセージにアクセスできます:\n\n```ruby\nmessage = accept_prompt(with: 'Linus Torvalds') do\n  click_link('Show Prompt About Linux')\nend\nexpect(message).to eq('Who is the chief architect of Linux?')\n```\n\n### Debugging\n\n下記のメソッドで、現在の状況をスナップショットとして撮って見れます。便利です。\n\n```ruby\nsave_and_open_page\n```\n\n現在の DOM の状態を、 `page.html` を使用することで文字列として取得することができます。\n\n```ruby\nprint page.html\n```\n\nこれは主にデバッグ時に有用なものです。`page.html` に対してテストをするのは避けて、より表現力のある finder メソッドを代わりに使いましょう。\n\n最後に、ドライバがサポートしていればスクリーンショットを保存することができます。\n\n```ruby\npage.save_screenshot('screenshot.png')\n```\n\nまた、スクリーンショットを保存し、自動的に開くことができます。\n\n```ruby\nsave_and_open_screenshot\n```\n\nスクリーンショットは、アプリのディレクトリからの相対パスである `Capybara.save_path` に保存されます。\n`capybara/rails` を require している場合、 `Capybara.save_path` はデフォルトで `tmp/capybara` になります。\n\n## Matching\n\nCapybara の要素の見つけ方をカスタマイズすることができます。`Capybara.exact` と `Capybara.match` の二つの選択肢があります。\n\n### Exactness\n\n`Capybara.exact` と `exact` オプションは XPath gem の内部で使われている `is` に影響します。`exact` が true のとき、全ての `is` 式が完全一致になります。 false のときは部分一致を許可します。Capybaraに組み込まれている多くのセレクタが `is` を使用しています。 この方法で部分一致を許可するかどうか指定できます。デフォルトでは `Capybara.exact` は false です。\n\n例:\n\n```ruby\nclick_link(\"Password\") # \"Password confirmation\" にもマッチする\nCapybara.exact = true\nclick_link(\"Password\") # \"Password confirmation\" にはマッチしない\nclick_link(\"Password\", exact: false) # オーバライドできる\n```\n\n### Strategy\n\n`Capybara.match` と `match` オプションを使うことで、複数の要素が問合せにマッチしたときに Capybara がどのように振る舞うかをコントロールできます。現在 Capybara では4つの振る舞い方が定義されています。\n\n1. **first:** 最初にマッチした要素を採用する\n2. **one:** 二つ以上の要素がマッチしたら例外を発生させる\n3. **smart:** もし `exact` が `true` なら、`one` と同じように二つ以上の要素がマッチしたら例外を発生させる。もし `exact` が `false` なら、まず最初に完全一致で試してみて、二つ以上の要素がマッチしたら例外を発生させる。もし要素が見つからなかったら、部分一致で再度要素を探す。ここで複数の要素がマッチしたら例外を発生させる。\n4. **prefer_exact:** もし複数の要素がマッチし、そのうちのいくつかが完全一致でいくつかが部分一致だったら、最初の完全一致の要素を返す。\n\n`Capybara.match` のデフォルトは `:smart` です。Capybara 2.0.x の挙動にしたいのならば、`Capybara.match` を `:one` に設定しましょう。Capybara 1.x の挙動にしたいのならば、`Capybara.match` を `:prefer_exact` に設定しましょう。\n\n## Transactions and database setup\n\n**注釈:** Rails 5.1 以上では、アプリとテストスレッドの間でデータベース接続を「安全に」共有します。したがって、もしあなたが Rails 5.1 以降を使用しているのなら、このセクションを無視してよいはずです。\n\nいくつかの Capybara のドライバは実際の HTTP サーバに対して動きます。Capybara はこれに対応しており、テストプロセスと同一のプロセス(ただし別スレッド)で HTTP サーバを走らせます。Selenium は HTTP サーバを使うドライバの一つです。RackTest は違います。\n\nもしあなたが SQL データベースを使っているのなら、全てのテストを1つのトランザクション内で実行し、そのトランザクションをテストの終わりにロールバックする方法が一般的です。例えば rspec-rails では、デフォルトでこの方法が採用されています。トランザクションは通常、スレッド間で共有できないので、もし HTTP サーバを使用するドライバを使っているのなら、テストコード上であなたがデータベースに入れたデータは Capybara から見ることができません。\n\nCucumber はトランザクションの代わりに truncation を使うことでこの問題に対応しています。すなわち、それぞれのテストの後に全てのデータベースを空にしているのです。[database_cleaner](https://github.com/DatabaseCleaner/database_cleaner) のような gem を使うことで、同じような振る舞いをさせることができます。\n\n## Asynchronous JavaScript (Ajax and friends)\n\nAjax を使っている部分をテストするときに、まだページ上に現れていない DOM 要素を扱おうとしてしまうケースがあるはずです。Capybara はページ上の要素が現れるのを待つことで、自動でこの問題に対応します。\n\n下記のような DSL を書いたとき\n\n```ruby\nclick_link('foo')\nclick_link('bar')\nexpect(page).to have_content('baz')\n```\n\nもし *foo* というリンクをクリックすることが ajax のトリガーになっていて、完了したときに *bar* というリンクがページに追加されるとしたら、リンクが表示されないために *bar* リンクをクリックするのに失敗するでしょう。しかし Capybara は諦めてエラーを投げる前に、少しの間待ってリトライします。次の行でb*baz* を探すのも同様です。少しの間待ってリトライします。どれくらいの時間待つかを調整することもできます(デフォルトは2秒です)。\n\n```ruby\nCapybara.default_max_wait_time = 5\n```\n\nこの振る舞いがあることによって気をつけて欲しいことがあります。下記の2つの命令は同じでは **ありません** 。 **常に** 後者を使うようにしてください！\n\n```ruby\n# `visit` の結果ページが読み込まれるドライバを使っているとします\n# Capybara.predicates_wait は `true` で\n# 1秒後に AJAX によって `a` タグが削除されるページを考えてみてください\nvisit(some_path)\n!page.has_xpath?('a')  # is false\npage.has_no_xpath?('a')  # is true\n```\n\n最初の式:\n\n* `has_xpath?('a')` は、`visit` が戻り値を返した直後に呼び出されます。リンクはまだ削除されていないため、`true` になります。\n* Capybara は成功した predicates/assertions を待たないため、**`has_xpath?` はすぐに `true` を返します**。\n* 式は `false` を返します (先頭の `!` で否定されているため)。\n\n2 番目の式:\n\n* `has_no_xpath?('a')` は、`visit` が戻り値を返した直後に呼び出されます。リンクがまだ削除されていないため、`false`になります。\n* Capybara は失敗した predicates/assertions を待つため、**`has_no_xpath?` はすぐに `false` を返しません**。\n* Capybara は、定義された `default_max_wait_time` の秒数の間、 predicate/assertion を繰り返し再チェックします。\n* 1秒後、predicate（この場合 `has_no_xpath?('a')` ）は `true` に変わります (リンクが削除されたため)。\n* 式は `true` を返します。\n\nしかし、 Capybara の Rspec マッチャは賢くてどちらの書き方もうまく扱えます。下記の二つの命令は機能的に同じです。\n\n```ruby\nexpect(page).not_to have_xpath('a')\nexpect(page).to have_no_xpath('a')\n```\n\nCapybara の待つ振る舞いはとても革新的で、下記のような書き方も扱えます。\n\n```ruby\nexpect(find('#sidebar').find('h1')).to have_content('Something')\n```\n\nもし JavaScript によって `#sidebar` がページから見えなくなった場合、Capybara は自動で `#sidebar` とそれが含む全ての要素をリロードします。そして AJAX リクエストによって `#sidebar` の内容が変化(`h1` のテキストが \"Something\" に)した場合、テストは通ります。もしこの挙動をさせたくなかったら、`Capybara.automatic_reload` を `false` にセットしてください。\n\n## Using the DSL elsewhere\n\n`Capybara::DSL` を include することで、どんなコンテキストでも capybara の DSL を使うことができるようになります。\n\n```ruby\nrequire 'capybara'\nrequire 'capybara/dsl'\n\nCapybara.default_driver = :webkit\n\nmodule MyModule\n  include Capybara::DSL\n\n  def login!\n    within(\"//form[@id='session']\") do\n      fill_in 'Login', :with =\u003e 'user@example.com'\n      fill_in 'Password', :with =\u003e 'password'\n    end\n    click_link 'Sign in'\n  end\nend\n```\n\nこれは、Capybara がサポートしていないテストフレームワークや、テスト以外の通常のスクリプティングでも使えます。\n\n## Calling remote servers\n\n通常、Capybara は同一プロセス内の Rack アプリをテストすることを想定しています。ただ、`app_host` に値を設定することで、インターネット上の別の場所にある web サーバとやりとりすることもできます。\n\n```ruby\nCapybara.current_driver = :selenium\nCapybara.app_host = 'http://www.google.com'\n...\nvisit('/')\n```\n\n**注釈:** デフォルトドライバ(`:rack_test`)はリモートサーバに対応していません。対応しているドライバであれば、指定したURLに直接アクセスすることができます。\n\n```ruby\nvisit('http://www.google.com')\n```\n\nデフォルトでは、Capybara は自動的に Rack アプリを起動しようとします。リモートでアプリを動かしているなら、Capybara の Rack サーバをオフにしたくなるかもしれません。\n\n```ruby\nCapybara.run_server = false\n```\n\n## Using sessions\n\nCapybara は名前付きセッション (指定されていない場合は `:default`) を扱うことができ、複数のセッションが同じドライバとテストアプリのインスタンスを使って通信できるようにします。もし今使用しているドライバとテストアプリのインスタンスを使用している特定の名前のセッションが見つからない場合、今使用しているドライバを使用して新しいセッションが作成されます。\n\n### Named sessions\n\n別のセッションで操作を行って、前のセッションに戻ってくるには下記のようにします。\n\n```ruby\nCapybara.using_session(\"Bob's session\") do\n  # Bob のブラウザセッションで何かする\nend\n# 前のセッションに戻ってくる\n```\n\n永久的に現在のセッションを別のセッションに切り替えるには下記のようにします。\n\n```ruby\nCapybara.session_name = \"some other session\"\n```\n\n### Using sessions manually\n\n[Session](http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session) を手動でインスタンス化して扱うことができます。\n\n```ruby\nrequire 'capybara'\n\nsession = Capybara::Session.new(:webkit, my_rack_app)\nsession.within(\"form#session\") do\n  session.fill_in 'Email', :with =\u003e 'user@example.com'\n  session.fill_in 'Password', :with =\u003e 'password'\nend\nsession.click_button 'Sign in'\n```\n\n## XPath, CSS and selectors\n\nCapybara は入力したセレクタの種類を推測するようなことはしません。デフォルトでは常に CSS を使用します。もし XPath が使いたいのであれば、下記のようにする必要があります。\n\n```ruby\nwithin(:xpath, './/ul/li') { ... }\nfind(:xpath, './/ul/li').text\nfind(:xpath, './/li[contains(.//a[@href = \"#\"]/text(), \"foo\")]').value\n```\n\nもしくはデフォルトのセレクタを XPath にすることもできます。\n\n```ruby\nCapybara.default_selector = :xpath\nfind('.//ul/li').text\n```\n\nCapybara には、他にも多くのビルトインセレクタ型が用意されています。ビルトインセレクタの全一覧とそれに適用できるフィルタは、[build-in selectors](https://www.rubydoc.info/github/teamcapybara/capybara/Capybara/Selector)で確認できます。\n\nCapybara はカスタムセレクタを追加することもできます。これは同じようなセレクタをよく使っている場合に便利です。下記の例はとてもシンプルですが、ここに示している以外にも多くの機能が利用できます。より詳しい例については Capybara のビルトインセレクタの定義を参照してください。\n\n```ruby\nCapybara.add_selector(:my_attribute) do\n  xpath { |id| XPath.descendant[XPath.attr(:my_attribute) == id.to_s] }\nend\n\nCapybara.add_selector(:row) do\n  xpath { |num| \".//tbody/tr[#{num}]\" }\nend\n\nCapybara.add_selector(:flash_type) do\n  css { |type| \"#flash.#{type}\" }\nend\n```\n\nxpath メソッドに渡したブロックは、XPath 形式の String か、もしくは XPath gem を通して生成されたものを返さなければいけません。上記の設定により下記のようにカスタムセレクタを使うことができるようになります。\n\n```ruby\nfind(:my_attribute, 'post_123') # マッチする属性を持つ要素を見つける\nfind(:row, 3) # table row の body の 3番目の row を見つける\nfind(:flash_type, :notice) # 'flash' という id を持ち、 'notice' という class を持つ要素を見つける\n```\n\n## Beware the XPath // trap\n\nXPath での // は特別で、あなたが思ってるような意味ではないかもしれません。通常の認識とは違い、// は \"ドキュメント全体のどこか\" であって \"今のコンテキスト内でのどこか\" ではありません。例えば\n\n```ruby\npage.find(:xpath, '//body').all(:xpath, '//script')\n```\n\nこれは全ての script タグを body の中から探すと思うかもしれません。でも実際には、これはドキュメント全体の script タグを探します！ あなたが探しているのは .// で、これは \"カレントノードの配下\" を表します。\n\n```ruby\npage.find(:xpath, '//body').all(:xpath, './/script')\n```\n\nwithin で同じようにやるとこうなります。\n\n```ruby\nwithin(:xpath, '//body') do\n  page.find(:xpath, './/script')\n  within(:xpath, './/table/tbody') do\n  ...\n  end\nend\n```\n\n## Configuring and adding drivers\n\nCapybara はドライバを切り替えることが簡単にできます。また、ドライバを設定するためのAPIが用意されているし、独自のドライバを追加することが出来ます。下記は selenium ドライバの設定を上書きして chrome を使う方法です。\n\n```ruby\nCapybara.register_driver :selenium do |app|\n  Capybara::Selenium::Driver.new(app, :browser =\u003e :chrome)\nend\n```\n\nこの設定に違う名前を付けることもできます。\n\n```ruby\n# 注釈: Capybara はこれをデフォルトで登録します。\nCapybara.register_driver :selenium_chrome do |app|\n  Capybara::Selenium::Driver.new(app, :browser =\u003e :chrome)\nend\n```\n\nこれにより、簡単にブラウザを切り替えてテストすることができます。\n\n```ruby\nCapybara.current_driver = :selenium_chrome\n```\n\n\nブロックの戻り値は Capybara::Driver::Base の記述する API に従わなければいけませんが、Capybara::Driver::Base を継承している必要はありません。gem はこの API を、自分独自のドライバを Capybara に加えるために使えます。\n\n\n[selenium wiki](http://code.google.com/p/selenium/wiki/RubyBindings)にはドライバ設定の情報が詳しく書かれています。\n\n\n## Gotchas\n\n* テストスレッドから session と request にアクセスすることはできません。response へのアクセスは限定されています。いくつかのドライバは response header と HTTP status code にアクセスできますが、アクセスできないドライバ(例: selenium)もあります。\n* Rails の統合テストを使っていないので、Rails 特有のもの(例: `controller`)へアクセスすることは出来ません。\n* 時間の固定: 現在時刻に依存したフィーチャをうまく動かすために、モックを使うのは一般的なやりかたです。しかし、単調なプロセスの時刻へのアクセスをサポートがない ruby と platform の組み合わせにおいては問題が起こることがあります。それは Capybara の Ajax のタイミングがシステムの時間を使っているせいで、failure な時に Capybara はタイムアウトせずにハングってしまいます。時間を止める機能でなく、時間を移動させる機能であればうまくいきます。[Timecop](https://github.com/travisjeffery/timecop) は両方の機能が使えます。\n* Rack::Test を使っているときは、URL で visit しているかどうかチェックするべきです。たとえば、session は `posts_path` と `posts_url` で別々になります。もし Action Mailer の中で絶対 URL を使っているとしたら、`default_url_options` を Rails のデフォルトの `www.example.com` に設定しましょう。\n* サーバーのエラーは、サーバースレッドを開始するセッションでのみ発生します。もしあなたが複数のセッションを使用して特定のサーバーエラーをテストしているのなら、最初のセッションを使用したエラー (通常は `:default`)に対するテストになっているかどうかを確認してください。\n* WebMock が有効になっている場合、「開いているファイルが多すぎます」というエラーが表示されることがあります。単純な `page.find` 呼び出しの結果、タイムアウトが起こるまで何千もの HTTP リクエストが発生するかもしれません。デフォルトでは、WebMock は新しいコネクションを生成するごとにリクエストを送信します。この問題を回避するには、[WebMock の `net_http_connect_on_start: true` パラメータを有効にする](https://github.com/bblimke/webmock/blob/master/README.md#connecting-on-nethttpstart)必要があるかもしれません。\n\n## \"Threadsafe\" mode\n\n通常モードでは、Capybara の設定オプションのほとんどはグローバルに設定されるため、複数のセッションを使用していて、1つのセッションのみの設定を変更したいような場合に、問​​題を引き起こす可能性があります。提供する\nこのような例をサポートするため、 Capybara は、\"スレッドセーフ\"モードを提供するようになりました。下記のようにすることで有効になります。\n\n```ruby\nCapybara.threadsafe = true\n```\n\nこの設定は、セッションが作られる前にのみ変更できます。\"スレッドセーフ\"モードでは、下記のように Capybara の振る舞いが変化します。\n\n* ほとんどのオプションはセッションごとに設定できるようになりました。これらはセッションの作成時または作成後に設定できます。セッション作成時点でのグローバルな各オプションはデフォルトのままです。セッション固有 **ではない** オプションは次のとおりです。`app`、`reuse_server`、`default_driver`、`javascript_driver`、`threadsafe`。`register_driver` と `register_server` によって登録されたドライバとサーバーもグローバルになります。\n\n```ruby\nmy_session = Capybara::Session.new(:driver, some_app) do |config|\n  config.automatic_label_click = true # my_session のみに設定\nend\n\nmy_session.config.default_max_wait_time = 10 # my_session のみに設定\nCapybara.default_max_wait_time = 2 # my_session の default_max_wait を変更しない\n```\n\n* `current_driver` と `session_name` はスレッド固有です。つまり、 `using_session` と\n `using_driver` も現在のスレッドにのみ影響するオプションということになります。\n\n## Development\n\n開発環境をセットアップするには、下記のようにします。\n\n```sh\nbundle install\nbundle exec rake  # Firefox でテストスイートを実行します - `geckodriver` をインストールする必要があります\nbundle exec rake spec_chrome # Chrome でテストスイートを実行します - `chromedriver` をインストールする必要があります\n```\n\nissue や pull request の送り方は [CONTRIBUTING.md](https://github.com/jnicklas/capybara/blob/master/CONTRIBUTING.md) に書いてあります。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillnet%2Fcapybara-readme-ja","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillnet%2Fcapybara-readme-ja","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillnet%2Fcapybara-readme-ja/lists"}