マイグレーションガイド Capybara → Chemlab
見解
_form.html
<form id="my-form">
<label for="first-name">First name</label>
<input type="text" name="first-name" data-testid="first_name" />
<label for="last-name">Last name</label>
<input type="text" name="last-name" data-testid="last_name" />
<label for="company-name">Company name</label>
<input type="text" name="company-name" data-testid="company_name" />
<label for="user-name">User name</label>
<input type="text" name="user-name" data-testid="user_name" />
<label for="password">Password</label>
<input type="password" name="password" data-testid="password" />
<input type="submit" value="Continue" data-testid="continue"/>
</form>
Capybara | ケムラボ |
---|---|
主な違い
ページライブラリ設計とページオブジェクト設計の違い
既存のフレームワークで実装されているページオブジェクトでは、要素に対してアクションを実行するメソッドを定義する必要があります。(通常はワンライナー)
def set_first_name(first_name)
fill_element(:first_name, first_name)
end
def click_continue
click_element(:continue)
end
it 'sets first name and clicks continue' do
Page::Form.perform do |form|
form.set_first_name('First Name')
form.click_continue
end
end
ページライブラリは、ページの要素に基づいたメソッドを提供することで、余分なメソッドを不要にし、これをより効率的にします。
it 'sets first name and clicks continue' do
Page::Form.perform do |form|
form.first_name = 'First Name' # sets the first_name
form.continue # clicks Continue
end
end
Capybaraを使ってFirst name
フィールドのテキストを検証する必要がある場合を考えてみましょう。テキストを取得するためにワンライナーを追加する必要があります:
def get_first_name
find_element(:first_name).text
end
Page::Form.perform do |form|
form.set_first_name('First Name')
expect(form.get_first_name).to eq('First Name')
form.click_continue
end
その代わりに、ページライブラリは自動的にページ要素からメソッドを作成するので、私たち自身でメソッドを定義するコードを書くことなく、first_name
を呼び出すことでテキストを取得できます:
Page::Form.perform do |form|
form.first_name = 'First Name'
expect(form.first_name).to eq('First Name')
form.continue
end
要素の命名規則
要素のタイプはページライブラリ内部で保持されるため、data-qa-selectorに_field
または_button
サフィックスを指定する必要はありません。
<!-- Before -->
<input type="text" name="first-name" data-testid="first_name_field" />
<input type="submit" name="continue" value="Continue" data-testid="continue_button" />
<!-- After -->
<input type="text" name="first-name" data-testid="first_name" />
<input type="submit" name="continue" value="Continue" data-testid="continue" />
これにより、開発者はテストを書きやすくなり、UI を見ながら Page Library を書くことができるので、テスト容易性に貢献します。