因此,我試圖創建一個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,所以我不知道如何進一步排除故障 - 特別是因爲我沒有看到錯誤。如果有人可以指導我嘗試其他事情,那將會有所幫助。
1)使用'$ mech-> dump_forms();'檢查字段的名稱2)使用'$ mech-> submit_form(with_fields => {...})''。像「它需要JavaScript支持」的東西可能會變成現實。 – AnFi