2011-12-31 9 views
3

WWW::Mechanize perlモジュールを使用して、ポストメソッドでフォームを送信しようとしています。WWW :: Mechanizeテキストフィールド問題

use WWW::Mechanize; 

my $mech = WWW::Mechanize->new(); 
... 
$mech->get($url); 
... 
my $response = $mech->submit_form(
     form_name => $name, 
     fields => { 
         $field_name => $field_value 
         }, 
     button => 'Button' 
    ); 
$field_name

(タイプがフォームで明示的に指定されていないが)一般的に予め設定された値を有し、テキストフィールドを話しています。何らかの理由で$mech->submit_form

$field_name => $field_value代わり$field_valueが元の値の後にフォームに追加され、値を置き換えるものではありません:提出する形で{provided_value}{original_value}を交換する方法

{submitted_field_value} = {original_value},{provided_value} 

答えて

0

私は自分の意志でそれを動作させることができました。ありがとうTimbusとあなたの提案のためのknb。私の場合は完全に一般的ではないかもしれませんが(私はプリセット値を知っています)、私は見つけたものを共有したいと思います(トレイルでは&のエラー)。

my $mech = WWW::Mechanize->new(); 
$mech->get($url); 
$mech->form_name($name); 

my $fields = $mech->form_name($name); 
foreach my $k (@{$fields->{inputs}}){ 
if ($k->{value} eq $default_value){ 
    $k->{value}=$field_value; 
    } 
} 

my $response = $mech->click('Button_name'); 
0

WWW :: Mechanizeは、あなたのためにHTTPリクエストのすべての厄介な部分だけを処理するLWPやcurlとは対照的に、「ヘッドレスブラウザ」と考えられることを覚えておくことが重要です。 Mechは、あなたが物事をすると、その状態を維持します。

$mech->formsまたはそれに類するもの(its best to decide from the documentation. I mean there so many ways to do it.)を使用してフォームを入手し、field methodsを使用して変更する入力フィールドを設定する必要があります。

私はこれを行うための基本的な方法はように出てくると思います:

$mech->form_name($name); 
$mech->field($field_name, $field_value); 
my $response = $mech->click('Button'); 

は動作するはずです。フィールドを取得して直接使用するとうまくいくと思います(つまり、my $field = $mech->form_name($name);は$ mechの代わりに$ fieldメソッドを使用します)

+0

yeh、あまりにも多くの方法がありますが、私はそれをやり遂げるために1つだけを探しています。このような理由から、私は特に経験に手を差し伸べてくれてありがたいと思っています。 – cur4so

+0

私はパントを取ったのは事実ですが、経験がないと言っても少し不公平です。私は何度もメカを使用しました。前にフォームから値を削除する必要はありませんでした。つまり、私は確かに私の単純な例を隠れた値のページでテストし、追加するのではなく、正常に変更しました。 –

+0

私はあなたに経験がないということを意味しませんでした。私はちょうど過去にあなたがこの問題(交換の代わりに付加価値)を持っておらず、あなたの返信の前にそれを再現しなかったことを知っています。だから、あなたは盲目的な推測をしていて、それはいつもうまくいくわけではありません;)。平和、私はあなたを怒らせるつもりはありません。もしそうなら、申し訳ありません。 – cur4so

1

$ mech-> submit_formを呼び出す前にこの行をコードに追加するとどうなりますか():

$mech->field($name, [$field_value], 1); 

これは、それがすでに存在する場合、最初の値が追加、または上書きされていることを確認します (または位置インデックス)番号パラメータである

は、WWWのドキュメントを参照してください。: :メカ:

$ mech->フィールド($名、\ @values、$番号)

フィールドの名前を指定すると、指定した値にその値を設定します。 [...]

オプションの$ numberパラメータは、同じ名前の2つのフィールドを区別するために使用されます。フィールドは1から番号が付けられます。

+0

あなたのお返事ありがとうございます。問題は、値が既に存在していても上書きされないように追加されていることです。残念ながら、ドキュメントで説明されているように、常に機能するlib /関数が大好きです。そうではありません。フィールド名は一意であり、値は正しいフィールドに追加されます。問題が私の興味のあるサイトにあるのか、それとも一般的な(既知の)バグなのかを調べようとしているだけです。 – cur4so

+0

@ cur4so:Perlデバッガで実行し、変数を調べて、必要ならば、フォーム変数を保持するWWW :: Mechanizeのデータ構造体から既存のメンバを削除できますか?それがハッシュであると仮定します。$ fields {$ name}を削除しても問題が解決しない場合は、何ができるのか分かりません。カプセル化が中断されることはわかっていますが、時にはこれを行う必要があります。おそらく、問題は、後でデータに潜む別の問題を見つけることで解決される可能性があります。 – knb

関連する問題