如何使用capybara DSL测试Select2元素?

sbe*_*eam 18 ruby-on-rails capybara capybara-webkit jquery-select2

我在页面上有一个Select2元素,通过ajax加载结果.希望能与水豚/ rspec的测试这个(使用捉弄人的鬼司机),但是由于选择二元素实际上开始作为一个隐藏字段,然后填充一个<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
Run Code Online (Sandbox Code Playgroud)

上面的第4行,显然capybara可以找到元素,但值不会改变,Select2永远不会进行ajax调用.(不能fill_in在那里使用普通因为搜索字段元素没有label,id或name属性)

Jan*_*svw 8

我创建了一个可以与Cucumber一起使用的帮助器,它没有sleep它比上面的方法更快.如果您使用createSearchChoiceSelect2提供的功能,这也适用.

把它放进去 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)
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

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

用Rails 4.1.1和Cucumber 1.3.15测试.


Huz*_*din 8

不要挠挠头,这样做会有效

select "option_name_here", :from => "Id Of Your select field"
Run Code Online (Sandbox Code Playgroud)

我尝试了每一个模块和每一个该死的东西,最后只是通过简单的代码行完成了没有任何助手和这样的事情.


Hir*_*103 6

您可以使用capybara-select-2 gem,它将为您完成所有工作。只需传递search: true给辅助选项即可进行 Ajax 调用:

select2 'Marriage', from: 'Event', search: true
Run Code Online (Sandbox Code Playgroud)


sbe*_*eam 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
Run Code Online (Sandbox Code Playgroud)

  • 这应该有效,但我收到错误“元素在点 (296, 637) 处不可点击。其他元素将收到点击: &lt;div id="select2-drop-mask" class="select2-drop-mask" 样式=""&gt;&lt;/div&gt;" (3认同)
  • 这不是你想要的,它有 2 秒的睡眠时间。 (2认同)