diff --git a/lib/webrat/core/field.rb b/lib/webrat/core/field.rb index cd732e40..a818d610 100644 --- a/lib/webrat/core/field.rb +++ b/lib/webrat/core/field.rb @@ -25,8 +25,8 @@ def initialize(form, element) end def label_text - return nil unless label - label.text + return nil if labels.empty? + labels.first.text end def matches_id?(id) @@ -38,8 +38,8 @@ def matches_name?(name) end def matches_label?(label_text) - return false unless label - label.matches_text?(label_text) + return false if labels.empty? + labels.any? { |label| label.matches_text?(label_text) } end def to_param @@ -65,25 +65,29 @@ def name @element["name"] end - def label - return nil if label_element.nil? - @label ||= Label.new(self, label_element) + def labels + return nil if label_elements.empty? + @labels ||= label_elements.map { |element| Label.new(self, element) } end - def label_element - @label_element ||= begin - parent = @element.parent - while parent.respond_to?(:parent) - return parent if parent.name == "label" - parent = parent.parent - end - - if id.blank? - nil - else - @form.element.at("label[@for=#{id}]") + def label_elements + return @label_elements unless @label_elements.nil? + @label_elements = [] + + parent = @element.parent + while parent.respond_to?(:parent) + if parent.name == 'label' + @label_elements.push parent + break end + parent = parent.parent end + + unless id.blank? + @label_elements += @form.element / "label[@for=#{id}]" + end + + @label_elements end def default_value diff --git a/spec/api/chooses_spec.rb b/spec/api/chooses_spec.rb index d069ceeb..1d38d513 100644 --- a/spec/api/chooses_spec.rb +++ b/spec/api/chooses_spec.rb @@ -39,6 +39,23 @@ @session.clicks_button end + it "should use any of the button's labels" do + @session.response_body = <<-EOS +
+ + + + + + + +
+ EOS + @session.expects(:get).with("/login", "user" => {"gender" => "M"}) + @session.chooses "Male" + @session.clicks_button + end + it "should only submit last chosen value" do @session.response_body = <<-EOS