2011-12-31 78 views
3

我試圖通過post方法使用WWW::Mechanize perl模塊提交表單。WWW ::機械化文本字段問題

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加入到形式的原始值後:

{submitted_field_value} = {original_value},{provided_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更好地被認爲是「無頭瀏覽器」,而不是說LWP或curl,它只處理http請求的所有煩雜位。 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

+0

你好,有太多的方法可以做到這一點,但我正在尋找一個(任何)做它。出於這個原因,我特別欣賞一個經驗不是猜測... – cur4so 2012-01-02 19:43:52

+0

嗯,這是真的,我拿了一個平底船,但它有點不公平,說我沒有經驗,我已經使用機械化很多次,我已經根本就不需要從表單中刪除一個值。也就是說,我當然在一個隱藏值的頁面上測試了我的簡單示例,併成功更改了它,而不是添加到它,所以.. – 2012-01-03 01:36:35

+0

我並不是說你沒有經驗。我只是看到你以前沒有遇到過這個問題(附加值而不是替換),在你回覆之前沒有複製它。所以,你正在盲目猜測,並不總是有效;)。和平,我不打算冒犯你。對不起,如果是這樣。 – cur4so 2012-01-03 23:28:53

1

如果您將此單行添加到您的代碼之前調用$ mech-> submit_form ():

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

這可以確保所述第一值被加到或覆蓋如果它已經存在 是數字參數(或位置索引)

參見萬維網的文檔。: :機械化:

$ mech->字段($名,\ @values,$數)

給定字段的名稱,其值設置爲指定的值。 [...]

可選的$ number參數用於區分具有相同名稱的兩個 字段。這些字段從1開始編號。

+0

knb,謝謝你的回覆。問題是添加的值不會被覆蓋,儘管它已經存在。我很想有一個lib /函數,它總是像文檔中描述的那樣工作,不幸的是,事實並非如此。該字段名稱是唯一的,並將該值添加到正確的字段中。試圖找出問題是出在我感興趣的網站上還是常見的(已知的)錯誤。 – cur4so 2012-01-02 19:37:51

+0

@ cur4so:你可以通過perl調試器運行它,然後檢查變量,並且,如果有必要,從Test:WWW :: Mechanize的包含表單變量的數據結構中刪除現有的成員?假設它是一個哈希值:如果調用delete $ fields {$ name}不能解決您的問題,我不知道會發生什麼。我知道這會破壞封裝,但有時候這是必須完成的。無論如何,這個問題可能會在數據中找到另一個潛在的問題。 – knb 2012-01-03 21:23:14