WWW::Mechanizeのsubmitとclickの違い

これははまりました・・
CPANのWWW::Mechanize 1.34で click() は <input type="submit" name="name1" value="value1"> の分の name1=value1 も送信しますが、submit() ではこれを送信しません。

たとえば下のようなフォームの場合。

<form method="get" action="do.php" name="loginform">
<input type="hidden" name="login" value="123">
<input type="hidden" name="login" value="abc">
<input type="submit" name="login" value="xyz">
</form>

Firefox 2.0等のブラウザでsubmitボタンをクリックすると下のURLに飛びます。

do.php?login=123&login=abc&login=xyz

ところが WWW::Mechanize で submit() すると下のURLに飛びます。

do.php?login=123&login=abc

submit() では login=xyz が送られないのです。しかし click() を使えば送ることができます。
WWW::Mechanizeのドキュメントによると submit() だとどのボタンもクリックされないとのことです。(→参考


これが原因となって、submit_form() の際に一工夫しないとdotProjectにログインできませんでした。dotProjectはこの login=xyz に相当するものが送られないとログインできないようです。(変な仕様だな・・)
submit_form() を使う場合、下のようにbuttonパラメータを指定すると内部で click() を呼んでくれるので login=xyz が送れます。

$mech->submit_form(
  fields => {
    username => $username,
    password => $password,
  },
  button => 'login'
);

もちろん field() とかでパラメータをセットしてから click() でもいいと思いますです。


結局、フォームでは submit() じゃなくて極力 click() を使ったほうがいいということですかね。