2013-01-15 66 views
1

我有一個HTML,這是我工作的爲什麼我無法在Perl中使用WWW :: Mechanize :: Firefox提交表單?

<form action="/goform/FormUpdateVAP" autocomplete="off" name="myform" id="formid" method="POST"> 
<table> 
    <tbody>    
      <tr> 
       <td align="right"><span class="label">Name:</span></td> 
       <td><input id="essid" name="essid" value="X" type="text"></td> 
      </tr> 
      <tr> 
       <td align="right"><input id="broadcast_essid" name="broadcast_essid" value="any" checked="" type="checkbox"></td> 
       <td><span class="label">Broadcast name:</span></td> 
      </tr> 
    </tbody> 
</table> 
<!-- BEGIN RIGHT COLUMN --> 
<table> 
    <tbody><tr> 
     <td> 
      <input name="authentication" id="authentication" value="any" onclick="Update();" type="checkbox"><span class="label"><b>authentication</b></span> 
     </td> 
     <td> 
      <input onclick="Update();" name="wp" id="wp" value="any" type="checkbox"><span class="label"><b>Wp</b></span> 
      <select id="8021x_mode" name="8021x_mode" onchange="Update();"><option value="wpa">WPA</option> 
      <option value="wep">WEP</option> 
      </select> 
     </td> 

    </tr> 
    <tr> 
     <td height="26">&nbsp; 
      <input onclick="Update();" name="w_p" id="w_p" value="any" type="checkbox"><span class="label"><b>Wp</b></span> 
      <select id="8021x_mode" name="8021x_mode" onchange="Update();"><option value="wpa">WPA</option> 
      <option value="wep">WEP</option> 
      </select> 
     </td> 
    </tr> 
    <tr> 
    <td> 
     <input id="cancel" name="cancel" value="Cancel" onclick="window.location.href = '/fg/list.asp';" type="button"> 

    </td> 
    <td> 
     <input id="add-2" name="add" value="Save" type="submit"> 
    </td> 
</tr> 
</tbody> 
</table> 

我試圖提交填寫姓名和廣播名稱形式的一部分。並檢查8021x_modewp複選框。如果我勾選8021x_mode並設置表單提交的字段就好了。但是,當我嘗試打勾wp它不提交。我沒有收到任何錯誤消息。 這裏是我到目前爲止的代碼:

use WWW::Mechanize::Firefox; 
use Crypt::SSLeay; 
use URI::Fetch; 
use HTML::TagParser; 
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0; #not verifying certificate 

my $url = 'https://'; 
$url = [email protected][0]; 
my $mech = WWW::Mechanize::Firefox->new; 
$mech->get($url); 

$mech->form_id('formid'); 
$mech->tick('8021x_mode','any'); 
$mech->tick('wp','any'); --after I add this the form doesn't submit 
my $name = @ARGV[1]; 

$mech->set_fields(
    'vap_name' => $name, 
    'essid' => $name, 
); 
$mech->click_button(id => 'add-2'); 
$mech->reload(); 

附加2是提交按鈕。任何想法爲什麼不工作?如果您需要更多信息,請立即告訴我。任何幫助將不勝感激。

+1

第一:**總是**把'use strict;使用警告;'。做到這一點,告訴我們你是否有警告。 –

+0

嗯,我只是這樣做,它給了我**標量值@ARGV [0]更好地寫爲$ ARGV [0] **,併爲我使用的每個參數。它也給了我錯誤**全局符號「$ base_href」需要顯式包名**(我正在傾倒頁面)。所以刪除它,但我想知道這是爲什麼,以及如何解決它。 –

+0

這些警告有助於您識別您的問題。就像它說的那樣,改變'@ARGV [0]到$ ARGV [0]「。至於在'$ base_href'上拋出警告的代碼,這個代碼必須是其他代碼,因爲在這段代碼中我沒有看到'$ base_href'。 –

回答

0

問題是,html不包含8021x_mode的選項any

我得到這個錯誤:發現複選框名爲「8021x_mode」和值「任意」 在test.pl線

無元素24

要檢查的形式,我建議你mech-dump實用程序(與WWW::Mechanize安裝)

$ mech-dump --forms http://domain.tld/path_to_forms 
POST /goform/FormUpdateVAP [myform] 
    essid=X      (text) 
    broadcast_essid=<UNDEF>  (checkbox) [*<UNDEF>/off|any] 
    authentication=<UNDEF>   (checkbox) [*<UNDEF>/off|any/authentication] 
    wp=<UNDEF>      (checkbox) [*<UNDEF>/off|any/Wp] 
    8021x_mode=wpa     (option) [*wpa/WPA|wep/WEP] 
    w_p=<UNDEF>     (checkbox) [*<UNDEF>/off|any/Wp] 
    8021x_mode=wpa     (option) [*wpa/WPA|wep/WEP] 
    cancel=Cancel     (button) 
    add=Save      (submit) 

正如你所看到的,有沒有any選擇...

也許javascript有一些事情我們不知道。

一種解決方法是使用LiveHttpHeadersFirefox插件趕上形式POST編到/goform/FormUpdateVAP然後代替滴答,做一個POST請求與WWW::Mechanize

+0

@sputnik我做到了,但網址是我期待的,除了提交從未發生。 –

+0

URL是公開的嗎?如果是的話,粘貼它,我會嘗試。 –

+0

不,很抱歉,但它不公開... –

相關問題