2016-01-21 50 views
3

因此,我試圖創建一個perl腳本,登錄到SAP BusinessObjects Central Management Console(CMC)頁面,但它沒有「甚至看起來像找到了正確的表單或找到正確的字段,甚至點擊提交。perl WWW :: Mechanize似乎無法找到正確的表單或分配字段或單擊提交

這裏是我的代碼:

use strict; 
use warnings; 
use WWW::Mechanize; 
use HTTP::Cookies; 

my $mech = WWW::Mechanize->new(); 
$mech->cookie_jar(HTTP::Cookies->new()); 
$mech->get("http://myserver:8080/BOE/CMC"); 
$mech->form_name("_id2"); 
$mech->field("_id2:logon:CMS", "MYSERVER:6400"); 
$mech->field("_id2:logon:SAP_SYSTEM", ""); 
$mech->field("_id2:logon:SAP_CLIENT", ""); 
$mech->field("_id2:logon:USERNAME", "MYUSER"); 
$mech->field("_id2:logon:PASSWORD", "MYPWD"); 
$mech->field("_id2:logon:AUTH_TYPE", "secEnterprise"); 
$mech->click; 
print $mech->content(); 

當我運行它,我沒有得到任何錯誤,但輸出我得到的是再次登錄頁面。更令人費解的是,它似乎並不接受我發送的字段值(輸出將顯示默認值而不是我賦值的值)。輸入一個錯誤的用戶或密碼不會改變任何東西 - 沒有錯誤,但我只是用默認值返回登錄頁面

我認爲腳本本身沒問題,因爲我改變了必要的字段,並且我能夠登錄到我們的Nagios頁面(輸出頁面肯定顯示了Nagios的詳細信息)。我認爲CMC的頁面並不那麼簡單,但我需要幫助弄清楚如何使其工作。

我已經試過:

use Data::Dumper; 
print $mech->forms; 
print Dumper($mech->forms()); 

這給了我什麼是: 目前的形式是:WWW ::機械化= HASH(0x243d828)的自卸車的

部分輸出是:

'attr' => { 
     'target' => 'servletBridgeIframe', 
     'style' => 'display:none;', 
     'method' => 'post' 
     }, 
'inputs' => [] 

我只顯示Dumper輸出的部分是因爲這似乎是相關的部分。當我用我們的Nagios頁面嘗試同樣的事情時,'attr'部分有一個'name'字段,而上面沒有。 Nagios頁面也有'輸入'的條目,如'useralias'和'password',但上面沒有任何條目。

$mech->form_number(1); 

因爲我不知道我是正確引用的形式,我只是有它嘗試使用它找到的第一個表(該頁面只有一個形式反正)。我的結果是一樣的 - 沒有錯誤,輸出是具有默認值的登錄頁面。

我逃跑(與 '\')下劃線(_)和冒號(:)字段名稱混亂左右。

我已經搜索,沒有發現任何說我必須逃脫任何角色,但它是值得一試。我所知道的是,Nagios頁面字段名稱只包含字母,它的工作。

我從Chrome的開發人員工具中獲得了字段名稱。例如,用戶名的表單字段表明:

<input type="text" id="_id2:logon:USERNAME" name="_id2:logon:USERNAME" value="Administrator"> 

我不知道,如果機械化與開始下劃線的名稱或包含冒號名稱的問題。

$mech->click("_id2:logon:logonButton"); 

因爲我不知道「登錄」按鈕,在被點擊我想說明,但它給了我一個錯誤:

No clickable input with name _id2:logon:logonButton at /usr/share/perl5/WWW/Mechanize.pm line 1676 

這可能是因爲有沒有定義按鈕上的名字(我使用了id),但我認爲這值得一試。下面是按鈕的代碼:

<input type="submit" id="_id2:logon:logonButton" value="Log On" class="logonButtonNoHover logon_button_no_hover" onmouseover="this.className = 'logonButtonHover logon_button_hover';" onmouseout="this.className = 'logonButtonNoHover logon_button_no_hover';"> 

這裏只有一個窗體上按鈕反正所以我不應該需要指定它(我並不需要爲Nagios的頁面)

機械化

的交互shell

下面是輸出的,當我試圖獲取各種形式的網頁上:

$ perl -MWWW::Mechanize::Shell -eshell 
(no url)>get http://myserver:8080/BOE/CMC 
Retrieving http://myserver:8080/BOE/CMC(200) 
http://myserver:8080/BOE/CMC>forms 
Form [1] 
POST http://myserver:8080/BOE/CMC/1412201223/admin/logon.faces 

幫助!

我真的不知道Perl,所以我不知道如何進一步排除故障 - 特別是因爲我沒有看到錯誤。如果有人可以指導我嘗試其他事情,那將會有所幫助。

+0

1)使用'$ mech-> dump_forms();'檢查字段的名稱2)使用'$ mech-> submit_form(with_fields => {...})''。像「它需要JavaScript支持」的東西可能會變成現實。 – AnFi

回答

1

我有一個比我知識淵博的人給我的幫助。主要的障礙是頁面是如何在框架中構建的以及它如何操作的。以下是詳細信息:

這裏的工作代碼:

use strict; 
use warnings; 
use WWW::Mechanize; 
use HTTP::Cookies; 

my $mech = WWW::Mechanize->new(); 
$mech->cookie_jar(HTTP::Cookies->new()); 
$mech->get("http://myserver:8080/BOE/CMC/0000000000/myuser/logon.faces"); 
$mech->form_id("_id2"); 
$mech->field("_id2:logon:CMS", "MYSERVER:6400"); 
$mech->field("_id2:logon:SAP_SYSTEM", ""); 
$mech->field("_id2:logon:SAP_CLIENT", ""); 
$mech->field("_id2:logon:USERNAME", "MyUser"); 
$mech->field("_id2:logon:PASSWORD", "MyPwd"); 
$mech->field("_id2:logon:AUTH_TYPE", "secEnterprise"); 
$mech->click; 
$mech->get("http://myserver:8080/BOE/CMC/0000000000/myuser/App/home.faces?service=%2Fmyuser%2FApp%2FappService.jsp&appKind=CMC"); 
$output_page = $mech->content(); 
if (index($output_page, "Welcome:") != -1) 
{ 
     print "\n\n+++++ Successful login! ++++++\n\n"; 
} 
else 
{ 
     print "\n\n----- Login failed!-----\n\n"; 
} 

爲了驗證,我已經成功登錄後,我一直是很簡單的,只是搜索「歡迎:」文字(如「歡迎:MYUSER」 )。

1

在這個DOM和Javascript時代,Web自動化有很多東西可能出錯。從你的結果來看,它看起來可能表單是在瀏覽器空間中構建的,這可能很難通過編程來處理。

確定的方法是轉儲原始響應並查看其包含的表單代碼。

如果事實證明是您的問題,您最簡單的方法就是像Mozilla::Mechanize

+0

感謝您的回覆。我會研究一下。 – Rim

+0

我無法在我們的Ubuntu服務器上成功安裝Mozilla :: Mechanize - 被困在「dll hell」(或者現在這些日子裏的任何東西)中。我能夠通過apt-get來安裝其兩個prereq中的一個,但另一個並不那麼容易,我很快就會進入cpan兔子洞。儘管如此,我很欣賞這種迴應。 – Rim

1

在處理表單時,複製表單生成的請求有時可能比試圖通過機械化處理表單更容易。

嘗試使用瀏覽器的開發者工具來監控當您手動登錄網站時(在Firefox或Chrome中它將在網絡標籤下)發生的情況,然後使用機械化生成相同的請求。

例如,生成的代碼可能看起來像:

my $post_data => { 
    '_id2:logon:CMS' => "MYSERVER:6400", 
    '_id2:logon:SAP_SYSTEM' => "", 
    '_id2:logon:SAP_CLIENT' => "", 
    '_id2:logon:USERNAME' => "MYUSER", 
    '_id2:logon:PASSWORD' => "MYPWD", 
    '_id2:logon:AUTH_TYPE' => "secEnterprise", 
}; 

$mech->post($url, $post_data); 
unless ($mech->success()){ 
    warn "Failed to post to $url: " . $mech->response()->status_line() . "\n"; 
} 
print $mech->content(); 

凡%post_data應該完全匹配的公司在後期手工到現場通過,而不僅是在HTML的數據 - 鍵或者在實際發佈之前數據可以通過javascript轉換。

+0

感謝您的回覆。我會先嚐試一下Mozilla :: Mechanize的建議,看看我能得到多少。 – Rim

相關問題