2012-04-20 18 views
9

Varsayılan Rails tarihi, saati ve datetime alanlarını kullanarak Capybara ile bir tarih seçici oluşturmaya çalışıyorum. Alan için seçme kutularını bulmak için within yöntemini kullanıyorum, ancak doğru kutuyu bulmak için xPath kullandığımda, within kapsamını terk eder ve öğenin sayfasında ilk yeri bulur.capybara - Bulmak xPath alanı içinde bırakılıyor

Kullandığım kod İşte. Test ettiğim sayfanın 2 datetime alanı var, ancak sadece bu hata nedeniyle ilkini değiştirebiliyorum. Şu anda datetime alanını tamamlayan bir div kapsayıcım var ama etiketle bulmak için kodu değiştirmeyi planlıyorum.

module Marketron 
    module DateTime 

    def select_date(field, options = {}) 
     date_parse = Date.parse(options[:with]) 

     year = date_parse.year.to_s 
     month = date_parse.strftime('%B') 
     day = date_parse.day.to_s 

     within("div##{field}") do 
     find(:xpath, "//select[contains(@id, \"_#{FIELDS[:year]}\")]").select(year) 
     find(:xpath, "//select[contains(@id, \"_#{FIELDS[:month]}\")]").select(month) 
     find(:xpath, "//select[contains(@id, \"_#{FIELDS[:day]}\")]").select(day) 
     end 

    end 

    def select_time(field, options = {}) 
     require "time" 
     time_parse = Time.parse(options[:with]) 

     hour = time_parse.hour.to_s.rjust(2, '0') 
     minute = time_parse.min.to_s.rjust(2, '0') 

     within("div##{field}") do 
     find(:xpath, "//select[contains(@id, \"_#{FIELDS[:hour]}\")]").find(:xpath, "option[contains(@value, '#{hour}')]").select_option 
     find(:xpath, "//select[contains(@id, \"_#{FIELDS[:minute]}\")]").find(:xpath, "option[contains(@value, '#{minute}')]").select_option 

     end 

    end 

    def select_datetime(field, options = {}) 
     select_date(field, options) 
     select_time(field, options) 
    end 

    private 

     FIELDS = {year: "1i", month: "2i", day: "3i", hour: "4i", minute: "5i"} 

    end 
end 

World(Marketron::DateTime) 

cevap

25

Sen başlangıç ​​bir . ekleyerek akım düğümün ile başlamak istiyorum XPath'de belirtmelidir:

find(:xpath, ".//select[contains(@id, \"_#{FIELDS[:year]}\")]") 

Örnek:

Ben bir HTML sayfası test

<html> 
    <div id='div1'> 
     <span class='container'>  
      <span id='field_01'>field 1</span> 
     </span> 
    </div> 
    <div id='div2'> 
     <span class='container'> 
      <span id='field_02'>field 2</span> 
     </span> 
    </div> 
</html> 
: Bu (umarım üzerinde sayfanızı basitleştirilmesi değil)

Bunu yaparken sorununuzu görebilirsiniz yöntemleri içinde kullanma: Geçerli düğümün içinde bakmak için xpath

within("div#div1"){ puts find(:xpath, "//span[contains(@id, \"field\")]").text } 
#=> field 1 
within("div#div2"){ puts find(:xpath, "//span[contains(@id, \"field\")]").text } 
#=> field 1 

Ama bunu görebilirsiniz ama belirterek (yani . kullanarak), sonuçları almak İstediğiniz:

within("div#div1"){ puts find(:xpath, ".//span[contains(@id, \"field\")]").text } 
#=> field 1 
within("div#div2"){ puts find(:xpath, ".//span[contains(@id, \"field\")]").text } 
#=> field 2