die Qual der Wahl mit Selenium 1

Posted by fwoeck
on Tuesday, May 26

Wie bringe ich meinem Integrationstest – also hier letztlich Selenium – bei, mehrere Optionen eines Multiselect-Feldes auszuwählen? Die vom SeleniumDriver angebotene Methode select sieht so aus:

select(selectLocator,optionLocator)

wobei der optionLocator soweit ich es sehe nur eine(1) Option zulässt. Das mehrmalige Aufrufen nacheinander klappt leider auch nicht, weil die vorher angewählte Option beim neuen Schritt wieder deaktiviert wird.

Dazu ist mir nur eingefallen, den Wert mit JavaScript zu setzen. Hier benutze ich jQuery, weil es in der Website eh benutzt wird. Mit “run_script” lassen sich Skripte unter dem Driver ausführen. In einer Cucumber-Stepsdefinition sieht das dann so aus:

Given /^I choose "([^\"]*)" and "([^\"]*)" from "([^\"]*)"$/ do |opt1, opt2, field|
  selenium.run_script("$('##{field}').val(['#{opt1}','#{opt2}'])")
end

Der val-Methode von jQuery kann man ein Wertearray übergeben.

Weblinks

  1. selenium.rubyforge.org/rdoc/classes/Selenium
  2. jquery-select-elements-tips-and-tricks

Tip: multi-select-Helpers 0

Posted by fwoeck
on Saturday, November 01

Hier sind mehrere Anforderungen zusammen zu erfüllen:

  1. im Formular soll eine Mehrfachselektion möglich sein
  2. die Zuweisung der Auswahl soll mit mass-Assignment an ein Proxymodell erfolgen (hier User und Roll)
  3. falls ein neuer User angelegt wird, soll die Auswahl leer sein
  4. falls ein bestehender User editiert wird, soll die Auswahl seinen aktuellen Status wiedergeben
<%= select_tag 'user[roll_ids][]', options_for_select(Roll.all_cached.map 
      {|w| [w.name, w.id]}, @user.rolls.map(&:id)), :multiple => true %></p>