http://navi.shinkibus.jp/snk/unkoh
こういうページの左側にある"運行案内を検索"ボタンを押したい
require 'mechanize' agent = Mechanize.new agent.get('http://navi.shinkibus.jp/snk/unkoh') p agent.page.form_with(:action => '/snk/unkoh').buttons
こういうのでやってみたらボタンが出てこなかった。
以下の 3種類はこのメソッドの返り値には含まれません。どうしても欲しい場合は #page から Mechanize::Page#parser 経由で HTML ノードを直接探してください。
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aForm#button_with
name 属性のない type="image" な input 要素
name 属性のない type="reset" な input 要素
type="reset" な button 要素
ええー
取ってきたHTMLの画像ボタンにnameを追加してMechanize::Pageに食べさせることにしました
require 'mechanize' require 'nokogiri' agent = Mechanize.new agent.get('http://navi.shinkibus.jp/snk/unkoh') doc = Nokogiri::HTML(agent.page.body) doc.search('div.subbutton > input')[0].set_attribute('name', 'nameless_button') #name属性セット page = Mechanize::Page.new( URI.parse('http://navi.shinkibus.jp/snk/unkoh'), {'content-type' => 'text/html'}, doc.to_html, '200', agent) agent.__send__(:add_to_history, page)
これでできたぜ!
$ diff -U 5 mechanize-1.0.0/lib/mechanize/form.rb mechanize-2.0.1/lib/mechanize/form.rb @@ -354,11 +375,11 @@ # Find all input tags form_node.search('input').each do |node| type = (node['type'] || 'text').downcase name = node['name'] - next if name.nil? && !(type == 'submit' || type =='button') + next if name.nil? && !%w[submit button image].include?(type) case type when 'radio' @radiobuttons << RadioButton.new(node, self) when 'checkbox' @checkboxes << CheckBox.new(node, self)
はい…
Mechanize、2.0からnameの無いimageボタンも普通に押せるようになりました、よかったですね