ポクポク

ポクッとしてツナッ

Mechanizeでnameの無いimageボタンを押す

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 ノードを直接探してください。
name 属性のない type="image" な input 要素
name 属性のない type="reset" な input 要素
type="reset" な button 要素

http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aForm#button_with

ええー


取ってきた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)

これでできたぜ!


f:id:pokutuna:20111001142336p:image
あれ…

$ 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ボタンも普通に押せるようになりました、よかったですね