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() を使ったほうがいいということですかね。