3

ドロップダウンリストでオプションを設定できますが、エラーメッセージが表示されます。同じエラーを返すオンラインサイトを見つけました:

http://www.100candles.com/floating_candles.htm

irb(main):124:0>  $ie = Watir::IE.attach(:url, /100candles/)
=> #<Watir::IE:0x..fd64f0146 url="http://www.100candles.com/t/Vessels?PN=1&SB=Updated" title="Vessels - 100 Candles">
irb(main):126:0> $ie.select_list(:name, "SB").flash
=> #<Watir::SelectList:0x4960ea5e located=true specifiers={:tag_name=>["select"], :name=>"SB"}>
irb(main):127:0> $ie.select_list(:name, "SB").select("Price")
Watir::Exception::ObjectDisabledException: object {:index=>0, :ole_object=>#<WIN32OLE:0x3759e58>} is disabled
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/element.rb:329:in `assert_enabled'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/element.rb:470:in `perform_action'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/input_elements.rb:117:in `select'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/input_elements.rb:46:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/input_elements.rb:46:in `block in select'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/element.rb:472:in `perform_action'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-classic-3.4.0/lib/watir-classic/input_elements.rb:41:in `select'
    from (irb):127
    from C:/Ruby193/bin/irb:12:in `<main>'
irb(main):128:0>
4

1 に答える 1

5

問題

選択は一部のオプション(バルクコストなど)では機能しますが、他のオプション(価格など)では機能しません。SelectList#selectのwatirコードを見てください。

def select(item)
  matching_options = []
  perform_action do
    matching_options = matching_items_in_select_list(:text, item) +
      matching_items_in_select_list(:label, item) +
      matching_items_in_select_list(:value, item)
    raise NoValueFoundException, "No option with :text, :label or :value of #{item.inspect} in this select element" if matching_options.empty?
    matching_options.each(&:select)
  end
  matching_options.first.text
end

そしてページhtml:

<select id="SB" onchange="document.location='/floating_candles.htm?PN=1&amp;SB=' + this.value;" name="SB">
    <optgroup style="font-style: normal;" label="Please Choose">
    <option value="">-
    <option value="PieceCost">Bulk Cost
    <option value="Updated">New Arrivals
    <option value="Popularity">Popularity
    <option value="Price">Price
    <option selected="" value="Relevance">Relevance
    </option></optgroup>
</select>

例外の理由は次のとおりです。

  1. SelectList#selectでは、指定された基準に一致するテキスト、ラベル、または値を持つすべてのオプションが収集されます。「Price」(および失敗した他のオプション)の場合、オプションは2回収集されます(つまり、matching_optionsに追加されます)。1回はテキストによる照合用で、もう1回は値による照合用です。対照的に、機能するもの(バルクコストなど)は、テキストと値が異なるため、一度だけ一致します。
  2. SelectList#selectは、各matching_optionを選択します。「価格」の場合、これは2つの選択を意味します。
  3. ページの選択リストには、ページを更新するonchangeイベントがあります。「価格」の場合、オプションの最初の選択が機能します(スクリプトを見ているときにわかるように)。ただし、失敗するのは2番目の選択です。ページが更新されている間に選択が試行され、例外が発生したと思います。

解決

解決策は、オプション要素を直接選択することです。これにより、オプションが1回だけ選択されるようになります。

$ie.select_list(:name, "SB").option(:text => "Price").select
于 2013-01-30T03:40:02.803 に答える