8

ドロップダウンリストのオプションを、一般的にカピバラの配列に入れたいと思います。プロセスの後、すべてのドロップダウンオプションを含む文字列の配列が発生することを期待しています。以下のコードを試しましたが、オプション数に関係なく、配列の長さは1のままです。

periods = Array.new()
periods = all('#MainContent_dd')
print periods.length
4

2 に答える 2

27

問題は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"]

これは何をしますか:

  1. find('#MainContent_dd')-オプションを取得する選択リストを検索します
  2. all('option')-選択リスト内のすべてのオプション要素を取得します
  3. collect(&:text)-各オプションのテキストを収集し、配列として返します
于 2013-02-21T16:33:53.133 に答える
2

@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()")
于 2013-03-01T20:54:14.593 に答える