2016-07-29 16 views
0

おそらくこれを行うより良い方法があり、100回コピー貼り付けることができます。Capybara/Rspec:複数のラジオボタンを記入

しかし、本質的に私は多くのラジオボタン(正確には95)を持つフォームページを持っています。それでpage.find(:xpath)trigger('click')を使って

XPathは、このようなビットに見える:

page.find(:xpath, '/html/body/div/div[2]/div/div[2]/form/div[2]/table/tbody/tr[1]/td[2]/div/label').trigger('click') 

TR [x]が選択するTD [X]された状態で、ラジオボタンオプションの行ごとに上がる(1-10)

私は実際には、各TD毎に1〜10の間の乱数を選んで、オートメーションテスト(ちょうどそれが動作することを確認する)が必要です。

forループのいくつかの並べ替えはこれを達成するだろうか? (ないルビーを熟知し、これは、私はちょうど簡単にGoogleから引き上げものですイム)

for i in 1..85 
    $h = 1 + rand(10) 
    page.find(:xpath, '/html/body/div/div[2]/div/div[2]/form/div[2]/table/tbody/tr[i]/td[h]/div/label').trigger('click') 
end 

だろうと仕事:ような何か?

編集:ここでは、行のHTMLです:

<tr class="all no-rate complete" data-original="2" change-check="false" the-row="17"> 
<td class="face"> 
<td class="face"> 
<td class="face"> 
<td class="face"> 
<div class="radio-inline radio-inline--empty"> 
<input id="set_stuff_17_rating_3" type="radio" name="set[stuff][17][rating]" value="3" data-control="" data-rating="" filter-class="complete"> 
<label class="integer opt" for="set_stuff_17_rating_3">Number Rating</label> 
</div> 
</td> 
<td class="face"> 
<td class="face"> 
<td class="face"> 
+0

テーブルまたはdivには、クラスまたはID、またはそれらを識別するテキストがありませんか?そのような長いxpathsを使用すると、本当に信じられないほど壊れやすいテストにつながります。私はそのxpathを使用しなければならなかった場合、 '行= page.all(:xpath、 '/ html/body/div/div [2]/div/div [2]/form/div [2] /テーブル/ tbody/tr '、カウント:85); rows.each {| row | row.find(:xpath、 ".//td[#{rand(10)+1}]/div/label").click}'私はそれが何が起こっているのかを明確にしていると思うので、 85または95あなたの質問に1つ、もう1つはあなたのコードに言いました –

+0

@TomWalpole彼らはすべて同じクラス名を共有していますので、私はそのIDを使ってみました...しかし何らかの理由で、 "capybaraが機能しないためのセレクタメソッドを選んでください。私はxpathセレクタで" find "を使うことになりました。 私はIDがうまくいかない理由は分かりません。 – msmith1114

+0

しかし、祖先のテーブルにはIDがありますか?そういうものはありませんか?私は選択がうまくいかないと思うのは、ラジオ/チェックボックスが非表示になっています - これはラベルをクリックしている理由です(FYI Capybara 2.8がリリースされると、ラジオ/チェックボックスがノーであれば自動的にラベルをクリックします)。私が見ることができるように、ページ全体のhtmlを添付してください。 –

答えて

2

ページの実際の構造に関する更新情報を考えると、

page.all("table.table--ratings tbody tr", minimum: 85).each do |row| 
    row.all("td label").sample.click 
end 

のようなものが大きな脆性XPath式なしに頼まれて何だろう。

+0

私は、tbody trのほかにpage.allステートメントのすべてを理解していると思います。申し訳ありませんすべての質問 – msmith1114

+0

そのCSSセレクタ、tbodyのtr子孫 - tr子供のthead要素がある場合に備えてtbodyの子孫として指定する必要があります –

+0

cssの ""と "'に違いはありますかセレクタ(今あなたが持っているもの)。私はcapybaraでCSSを定義するときに、最初に ':css'を入れる必要があると思いましたか? – msmith1114

1

あなたはそれぞれの行を反復処理することができます:あなたはそれのメンテナンス性の向上のために、あなたのXPathをリファクタリングする必要があり

page.all(:xpath, '/html/body/div/div[2]/div/div[2]/form/div[2]/table/tbody/tr').each do |el| 
    $h = 1 + rand(10) 
    el.find(:xpath, './td[#{h}]/div/label').click 
end 

注意を。

そして、あなたが提供するHTMLで:

page.all(:xpath, "//form//tr[td[@class='face']]").each do |el| 
    h = 1 + rand(10) 
    el.find(:xpath, "(.//input[@type='radio'])[#{h}]").click 
end 
+0

どうすればリファクタリングできますか? Xpath?私はXpathが脆いが実際にそれを行うための「適切な」方法ではないことを知っていた。 – msmith1114

+0

@ msmith1114祖先html –

+0

@ msmith1114を表示すると、あなたのXpathはid属性または特定の属性/クラスを持つ要素に相対的でなければなりません。どのようにしてこのXPathを最初に手に入れましたか? Google Chromeの開発ツールは、より良いものを提供するはずです。 CSSセレクタを使用することもできます。 –

関連する問題