ドロップダウンリストのオプションを、一般的にカピバラの配列に入れたいと思います。プロセスの後、すべてのドロップダウンオプションを含む文字列の配列が発生することを期待しています。以下のコードを試しましたが、オプション数に関係なく、配列の長さは1のままです。
periods = Array.new()
periods = all('#MainContent_dd')
print periods.length
問題はall('#MainContent_dd')
、idを持つすべての要素を返すことMainContent_dd
です。これがドロップダウンであり、IDが一意であると仮定すると、periods.length
は1(つまりperiods
、選択リスト)であると予想されます。
あなたがしたいのは、option
要素の代わりに要素を取得することですselect
。
あなたのhtmlが次のようになっていると仮定します:
<select id="MainContent_dd">
<option>Option A</option>
<option>Option B</option>
<option>Option C</option>
</select>
次に、次のことができます。
periods = find('#MainContent_dd').all('option').collect(&:text)
p periods.length
#=> 3
p periods
#=> ["Option A", "Option B", "Option C"]
これは何をしますか:
find('#MainContent_dd')
-オプションを取得する選択リストを検索しますall('option')
-選択リスト内のすべてのオプション要素を取得しますcollect(&:text)
-各オプションのテキストを収集し、配列として返します@JustinCoの答えは、使用されているドライバーが高速でない場合に問題があります。Capybaraは、の呼び出しごとにドライバーにクエリを実行しますtext
。したがって、selectに200個の要素が含まれている場合、Capybaraはブラウザに対して1個ではなく201個のクエリを実行しますが、これは遅い場合があります。
Javascriptで1つのクエリを使用してそれを行うことをお勧めします:
periods = page.execute_script("options = document.querySelectorAll('#MainContent_dd > option'); texts=[]; for (i=0; i<options.length; i++) texts.push(options[i].textContent); return texts")
または(jQueryを使用した短いバリアント):
periods = page.evaluate_script("$('#MainContent_dd').map(function() { return $(this).text() }).get()")