カピバラのチェックボックスをチェックする方法は?


126

RspecとCapybaraを使用しています。

チェックするステップをどのように記述できcheckboxますか?check値で試してみましたが、が見つかりませんcheckbox。実際には同じIDで異な​​る値を持っているため、何をすべきかわかりません

これがコードです:

 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="61" name="cityID">
 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="62" name="cityID">
 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="63" name="cityID">

6
入力には同じIDを使用しないでください。名前は同じですが、IDが異なります。
SamStephens、2015年

回答:


156

私は次のことがうまくいったことを発見しました:

# Check
find(:css, "#cityID[value='62']").set(true)

# Uncheck
find(:css, "#cityID[value='62']").set(false)

1
それを聞いてうれしい!おそらく、この回答を「承認済み」としてマークし、おそらくそれを賛成票に入れます... :)
Jon M

@Jon MIには空の角かっこが付いた奇妙なIDがあるため、チェックの例でfind(:css, "#cityID[value='62']").set(true)は機能しfind(:css, "#cityID[][value='62']").set(true)ますが、見つかりませんでしたが失敗します。空のブラケットIDを使用して同じ関数を実行するにはどうすればよいですか?
TangibleDream

1
明確にするために@TangibleDream-チェックボックスのIDが[]だと言っていますか?
Jon M

1
CSSセレクターでこれを機能させる方法がまったく見つかりませんでした!角括弧をエスケープする方法はいくつかあるに違いありませんが、見つかりませんでした。私はXPathファインダーに頼らなければなりませんでした:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
この回答をマークダウンできますか?私はそれが機能することを知っていますが、利用可能な単純なAPIの一部ではない回答をマークアップするための直観に反します:check( 'name、id or text here')(下の回答を参照)
Code Novitiate

137

同じidで複数の要素を作成しないことをお勧めします。そのため(それだけでなく)、エレガントでチェックボックスを簡単にチェック/チェック解除できます

check 'cityID'
uncheck 'cityID'

同じIDを持つ複数の要素を回避できず、特定の値のチェックボックスオンにする必要がある場合は、次のようにします。

find(:css, "#cityID[value='62']").set(true)
find(:css, "#cityID[value='62']").set(false)

カピバラの入力操作の詳細については、こちらをご覧ください


2
また、有効なHTMLではないため、同じIDで複数の要素を作成しないことをお勧めします。ヘルパーフォームヘルパーを適切に使用する場合、これは問題になりません。
ihaztehcodez

1
チェックボックス/チェック解除が次の値のみを受け入れることを追加したいと思います:id、名前、または関連するラベル要素。ここでそれについてもっと読むことができます。
Nesha Zoric

58

カピバラテストを実行すると、pageオブジェクトを取得しました。これは、チェックボックスをオン/オフにするために使用できます。@ブルザエモンがすでに述べたように:

名前、ID、またはラベルテキストでチェックボックスを見つけてチェックします。

したがって、次のようなHTMLにチェックボックスがあると仮定します。

<label>  
  <input type="checkbox" value="myvalue" name="myname" id="myid">
  MyLabel
</label>

あなたはこれをチェックすることができます:

page.check('myid')
page.check('MyLabel')
page.check('myname')

チェックを外すpage.uncheck方法は同じです。


1
確かな答え、CSSセレクターを使用して受け入れられた答えよりもきれいに見える(たとえそれがカバーの下でチェックメソッドが行うものであっても)
agmin

1
はい、これが最良の答えです。それはよりクリーンで、ユーザーのアクションを厳密に模倣しています。追加のIDでフォームを汚染せず、テストを読みやすくします。
Bセブン

私はこれがよりクリーンであることに同意します。興味深いことに、受け入れられた答えはcheck、カピバラでのメソッドの実装方法とそれほど変わりません。def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan 2015年

おかげで、これはドキュメントによると同じ答えです:rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… 「チェックボックスを見つけてチェック済みとしてマークします。チェックボックスは名前で見つけることができます。 IDまたはラベルテキスト。」
マイクヴァラーノ2018


10

ボックスは、テキスト、例えば「オプション3」に関連付けられている場合、のようcapybara 3.0.3あなただけ行うことができます

check 'Option 3'

1
この応答は、8年前の構文ではなく、一番上にある必要があります。
sloneorzeszki

実際に著者によって説明したシナリオのために、@samuelからの答えは、右自身である
VP。

6

私はこれが古い質問であることを知っていますが、私はこれを自分で解決してきました。上記のすべてを試した結果、これは最終的に私にとってうまくいきました:

find("input[type='checkbox'][value='#{cityID.id}']").set(true)

これが誰かに役立つことを願っています。カピバラ2.4.4を使用しています。


4

古いトピックですが、別の解決策は次のとおりです。

check('Option 3', allow_label_click: true)


1

いくつかの問題が見つかった場合は、:cssの代わりに:xpathを使用することもできます。

find(:xpath、 '//*[@id="example"]').set(true)

Chrome(そして確かに他のブラウザ)では、「要素を検査」してから、関心のある要素を右クリックすることで、xpathが何であるかわからない場合に「xpathをコピー」することができます。


1

この例では、すべてのチェックボックスがオンになっていないことを確認することもできます。

all( 'input [type = checkbox]')。each do | checkbox | checkbox.should_not be_checked end


1

.set(true)が機能しなかったため、.clickを呼び出す必要がありました。

find(...).click


(1)clickそれだけでは有効なカピバラコマンドだとは思わない(または、少なくともそうであれば、ドキュメントに表示されていないように思われる)(2)そうである場合は、おそらくチェックボックスを切り替える。それがオンかオフかを確認しないでください
NotAnAmbiTurner

1

ラベル要素の背後に隠れているカスタムチェックボックスにいくつかの問題がありました。が必要allow_label_click: trueでした。

このブログ投稿を参考に、

check 'checkbox[name]', allow_label_click: true

ありがとうございました!これは、Boostrap 4のカスタムチェックボックスフィールドで完全に機能しました。また、チェックを外す必要がある場合は、「checkbox [name]」のチェックを外してください。allow_label_click:true
pastullo

0
check find(".whenever input")[:id]

これにより、カピバラはその入力に接続されたイベントリスナーを待機するようになると思います。これが待機しないと、時々面倒なことです。その入力にIDがない場合は、別のプロパティを選択してください。 (1つある必要があります)...


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.