2012-04-20 19 views
9

デフォルトのRailsの日付、時刻、日付時刻フィールドを使用して、Capybaraで日付セレクタを作成しようとしています。私はフィールドの選択ボックスを見つけるためにwithinメソッドを使用していますが、xPathを使用して正しいボックスを見つけると、withinのスコープが残り、エレメントのページで最初のオカレンスが見つかります。capybara - xPathで検索すると範囲内に残る

ここに私が使用しているコードがあります。私がテストしているページには2つのdatetimeフィールドがありますが、このエラーのために最初のフィールドを変更することしかできません。現時点では、datetimeフィールドを囲むIDを持つdivコンテナがありますが、ラベルで検索するコードを切り替える予定です。

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) 

答えて

25

あなたが先頭に.を追加することによって、現在のノードを開始したいのXPathで指定する必要があります。

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

例:

を私はHTMLページをテストこれはあなたのページを簡単に過度に過ぎないようにしてください:

<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> 

あなたがこれを行うときの方法の中、あなたはあなたの問題を見ることができます使用:

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 

をしかし、あなたはそれを見ることができますが、現在のノード(すなわち.を使用して)以内に見て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 2 
関連する問題