Tips集

■超簡単なサンプル
require "mechanize"
agent = Mechanize.new
agent.get("http://d.hatena.ne.jp/shima111/")
■アクセスしたページを取得する
page = agent.page
page.uri #<URI::HTTP:0x157f698 URL:http://d.hatena.ne.jp/shima111/>
■リンクをクリックする
# 表示されてる文字列にマッチするリンクタグをクリック
page.link_with(:text=>"shima111").click
page.links_with(:text=>"shima111")[0].click

# その後再度pageを取得すると、遷移先のpageになっている
agent.page.uri #<URI::HTTP:0x1b154e0 URL:http://d.hatena.ne.jp/shima111/about>
■フォームをsubmitする
# 対象となるフォームを取得し、検索キーワードを入力
form = agent.page.form_with(:action=>"/shima111/searchdiary")
form.word = 'プログラム'
form.submit

# 検索結果ページに遷移
agent.page.uri #<URI::HTTP:0x1ace0f8 URL:http://d.hatena.ne.jp/shima111/searchdiary?word=%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0&type=detail>
■XXX_with、XXXs_with について
  • 自Node下にある特定のタグを検索する
  • 検索方法は属性名=>属性値が基本となるが、文字列だけの場合は:name=>"..."という意味。
  • :textだけは特殊でタグで囲まれた文字列となる
  • XXX_with、XXXs_with を持ってるクラスは以下の3つで、それぞれwithで検索できるものも一緒に示しておく
    • Page
      • form_with
      • link_with
      • base_with
      • frame_with
      • iframe_with
      • image_with
    • Form
      • field_with
      • button_with
      • file_upload_with
      • radiobutton_with
      • checkbox_with(複数検索は checkboxes_with)
    • MultiSelectList
      • elements_with
page.form_with("form1") # => name="form1" となるform
page.form_with(:name => "form1") # と同じ
page.link_with(:text => "リンク") # => :text は属性ではなくinner_html
page.link_with(:text => /regexp/) # => 正規表現も使える
■フォームをsubmitする2

もう少し実用的なサンプル。フォーム内の入力項目をセットしてsubmitする

# テキスト系(パスワードとかhiddenも全部同じように扱える)。コンボボックス(select)
form.input_hidden = "form.input_hidden"
form.input_password = "form.input_password"
form.input_text = "form.input_text"
form.input_textarea = "form.input_textarea"
form.input_select= "2"

# コンボボックスは個別に取得した方が扱いやすいかもしれない
form.field_with("input_select") # => Mechanize::Form::SelectList or Mechanize::Form::MultiSelectList

# チェックボックスとラジオボタンは少し面倒
rb = form.radiobutton_with("input_radio")
rb.checked # => false
rb.check # click とか uncheck で操作できる
rb.checked # => true

cb = form.checkbox_with("input_checkbox")
cb.check

# 添付ファイル
file_upload = form.file_upload_with("input_file")
file_upload.file_name = "file.txt" # 単にファイル名をセットしているだけ
file_upload.mime_type = "text/plain"
file_upload.file_data = open("c:/a.txt"){|fp| fp.read}

# バイナリも可能
file_upload.file_name = "a.png"
file_upload.mime_type = "image/png"
file_upload.file_data = open("c:/a.png", "rb"){|fp| fp.read}

# ボタンを押してsubmit
submit_button = form.button_with("input_submit")
form.click_button(submit_button)