<form name="mselect_test"> <select name="select3" size="3" multiple> <option value="one" selected>選択1</option> <option value="two">選択2</option> <option value="three">選択3</option> </select> </form>#options に選択項目の Mechanize::Form::Option オブジェクトをまとめた配列を保持しています。
agent.page.form_with(:name => 'mselect_test'){|form| form.field_with(:name => 'select3'){|menu| # HTML上のselectedをクリアして項目を全て無選択にする menu.select_none # value が one であるメニューをfindで探し、選択 menu.options.find{|o| o.value == 'one'}.select # value が one であるメニューをfindで探し、選択択 menu.options.find{|o| o.value == 'three'}.select } }#value= を利用すると、「表示」しているものを無視して直接
agent.page.form_with(:name => 'mselect_test'){|form| form.field_with(:name => 'select3'){|menu| menu.value = ['one', 'three'] } }と書くことができます。最終的に選択状態にしたい項目の value だけを配列で指定します(select_noneは不要)。なお、Mechanize::Form#[]= は value= メソッドを利用するので、
agent.page.form_with(:name => 'mselect_test'){|form| form['select3'] = ['one', 'three'] }と短く書くことも可能です。
agent.page.form_with(:name => 'select_test1'){|form| form.field_with(:name => 'select3'){|menu| menu.options.find{|o| o.value == 'two'}.select } }のように、個々の Option オブジェクトの Mechanize::Form::Option#select メソッドを使わなければなりません。
<select name="mlist" size="4" multiple> ... </select>という HTML の場合、name メソッドは文字列 "mlist" を返します。
<form name="mselect_test"> <select name="select3" size="3" multiple> <option value="one" selected>選択1</option> <option value="two">選択2</option> <option value="three" selected>選択3</option> </select> </form>に対して
irb> p agent.page.form('mselect_test').options.map{|o| o.text} ["選択1", "選択2", "選択3"]
# value が "one" な項目だけを選択する form.field_with(:name => 'select3'){|menu| menu.select_none menu.options.find{|o| o.value == 'one'}.select
# value が "one" な項目を追加選択する form.field_with(:name => 'select3'){|menu| menu.options.find{|o| o.value == 'one'}.select
form.field_with(:name => 'select3'){|menu| menu.value = ['one', 'three'] }これは #options と連動しており、
form.field_with(:name => 'select3'){|menu| p menu.option_with(:value => 'one').selected? #=> false menu.value = ['one', 'three'] p menu.option_with(:value => 'one').selected? #=> true }引数 values は文字列を要素とした配列です。1項目だけを選択したいという場合は文字列でも構いません。
好きな果物: <form name="f1"> <select name="fav_fruits" size="2" multiple> <option value="one" selected>りんご</option> <option value="two">みかん</option> </select> </form>
form.field_with(:name=>'fav_fruits'){|menu| menu.value=['みかん', 'メロン'] p menu.value #=> ["メロン", "みかん"] }
form.field_with(:name => 'select3'){|menu| menu.select_none menu.options.find{|o| o.value == 'one'}.select menu.options.find{|o| o.value == 'three'}.select p menu.query_value #=> [['select3', 'one'], ['select3', 'three']]#value が空、つまり選択状態の項目が無かった場合は空の配列 [] を返します。