21

ajax 経由で結果を読み込むページに Select2 要素がありますこれを capybara/rspec (ポルターガイスト ドライバーを使用) でテストしたいのですが、Select2 要素は実際には隠しフィールドとして開始され、<ul>結果が処理されるとデータが入力されるため、通常のselect,fill_inまたはchooseヘルパーは機能しません。

私が今持っているのは次のようなものです

  it "should have a search field for events" do
    click_link "Select an Event"       # this works as expected
    within('.select2-container') do    # works
      find('.select2-search input').set(event.description[0,5])  # won't work!
      find(:xpath, "li[text()='#{event.description}']").click 
    end
    click_button "Search"
    page.should have_content("Displaying all 2 photos")
  end

上記の 4 行目、明らかにカピバラは要素を見つけることができますが、値は変更されず、Select2 は ajax 呼び出しを行いません。fill_in(検索フィールド要素にラベル、id、または名前の属性がないため、通常は使用できません)

4

18 に答える 18

9

頭を掻くのはやめて、これをやればうまくいく

select "option_name_here", :from => "Id Of Your select field"

私はすべてのモジュールとできる限りのことを試しましたが、最終的には単純なコード行でヘルパーなどを使用せずにこれを実行しました。

于 2016-04-13T18:16:29.753 に答える
8

Cucumber で使用できるヘルパーを作成しました。 がないsleepため、上記の方法よりも高速です。createSearchChoiceこれは、Select2 が提供するを使用する場合にも機能します。

中に入れてfeatures/support/select2_helper.rb

module Select2Helper
  def select2(value, attrs)
    first("#s2id_#{attrs[:from]}").click
    find(".select2-input").set(value)
    within ".select2-result" do
      find("span", text: value).click
    end
  end
end

World(Select2Helper)

次のように使用します。

Then(/^I select2 "([^"]*)" from "([^"]*)"$/) do |value, select_name|
  select2 value, from: select_name
end

Rails 4.1.1 および Cucumber 1.3.15 でテスト済み。

于 2014-06-22T13:30:19.500 に答える
4

必要な値とイベントを検索フィールドpage.execute_scriptに手動でハックすることで、これを解決できました。keyup

  it "should have a search field for events" do
    click_link "Select an Event"
    page.execute_script("i = $('.select2-container input').first();
                         i.val('#{event.description[0,4]}').trigger('keyup');");
    sleep 2
    find('.select2-results li:first-child').click
    click_button "Search"
    page.should have_content("Displaying all 2 photos")
  end
于 2012-10-07T19:02:27.877 に答える
4

ページに複数の select2 コンポーネントがある場合は、次のヘルパー メソッドを作成しました。

def select2(id, value)
  page.execute_script %Q{
    i = $('#s2id_#{id} .select2-input');
    i.trigger('keydown').val('#{value}').trigger('keyup');
  }
  sleep 2
  find('div.select2-result-label').click
end

def remove_all_from_select2(id)
  page.execute_script %Q{
    $('#s2id_#{id} .select2-choices a').click();
  }
end

def remove_from_select2(id, value)
  page.execute_script %Q{
    $('#s2id_#{id} .select2-choices div:contains("#{value}")').closest('li').find('a').click();
  }
end
于 2013-09-18T09:44:35.577 に答える
2

この回答とCapybara select2 ヘルパーの回答に触発されて、同じページの単一選択と複数選択の両方の複数の select2 フィールドに対して堅牢と思われるものを思いつきました。

def select2(value, attrs)
  s2c = first("#s2id_#{attrs[:from]}")
  (s2c.first(".select2-choice") || s2c.find(".select2-choices")).click

  find(:xpath, "//body").all("input.select2-input")[-1].set(value)
  page.execute_script(%|$("input.select2-input:visible").keyup();|)
  drop_container = ".select2-results"
  find(:xpath, "//body").all("#{drop_container} li", text: value)[-1].click
end
于 2015-03-10T17:43:25.460 に答える
1

私は2つのリモートselect2を持っています。最初の文字列を検索し、見つかった結果に従って、2 番目の文字列が入力されます。capybara-select2 gem とここにリストされているすべてのソリューションを試した後、私は独自のソリューションを考え出さなければなりませんでした。私の場合、何を選択するかは重要ではないため、特定の値を持つ結果ラベルを選択しようとしませんでした。これが私の状況で誰かを助けることを願っています。

Given(/^I have selected  "(.*?)" category$/) do |arg1|  
  page.find(:css, ".select2-choice.select2-default").click 
  page.find(:css, "#s2id_autogen1_search").set "Dip Boya"
  sleep 2
  page.all(:css, '.select2-result-label')[1].click

end

Given(/^I have selected "(.*?)" variation$/) do |arg1|  
  page.find(:css, ".select2-choice.select2-default").click 
  page.all(:css, '.select2-result-label')[1].click
end
于 2014-06-07T02:30:22.167 に答える
1

select2 AJAXオートコンプリートでも、これが私にとってうまくいくものです:

find('#user_id').sibling('span.select2').click
find('.select2-search__field').set('ABCDEF')
find('.select2-results li', text: 'ABCDEF').click
于 2018-02-23T11:03:00.483 に答える
0

簡単な答え:

page.find('.select2-drop-active .select2-input').set('foo')
page.find('.select2-drop-active .select2-input').native.send_keys(:return)
于 2014-01-03T18:09:19.703 に答える
0

ねえ、誰もまだ気にかけているのかどうかはわかりませんが、私もこの問題を抱えていたので、簡単に対処する方法を見つけました.

まず、各ドロップダウン選択にクラスを追加するのではなく、次のようにグローバルに追加します。

    class CollectionSelectInput < SimpleForm::Inputs::CollectionSelectInput
      def input_html_classes
        super.push('chosen-select')
      end
    end

そのため、カピバラがselect2ドロップダウンを使用できないという問題が発生し始めたとき、私の修正は、テスト環境でない場合はグローバルプッシュのみを使用することでした:

    class CollectionSelectInput < SimpleForm::Inputs::CollectionSelectInput
      unless Rails.env.test?
        def input_html_classes
          super.push('chosen-select')
        end
      end
    end

以前は capybara-select2 gem を使用していましたが、メンテナンスされていないようです :(

于 2014-03-09T03:02:41.857 に答える
0
def select2(id, value)
  find("##{id} ~ span.select2").click
  within ".select2-results" do
    find("li", text: value).click
  end
end
于 2017-02-02T13:10:55.383 に答える
0

このヘルパーは私のために働いた(プレースホルダーを使用):

  # Add this helper
  def select2(placeholder, option)
    find("select[data-placeholder='#{placeholder}'] + .select2").click
    within '.select2-results' do
      find('span', text: option).click
    end
  end

そして、次のように呼び出します。

select2 'Placeholder', 'some option'
于 2020-11-16T00:01:16.210 に答える