forms - perl WWW::Mechanize 似乎无法找到正确的表单或分配字段或单击提交

标签 forms perl

所以我正在尝试创建一个登录到 SAP BusinessObjects 中央管理控制台 (CMC) 页面的 perl 脚本,但它看起来甚至没有找到正确的表单或找到正确的字段,甚至没有单击提交。

这是我的代码:

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 页面不是那么简单,但我需要帮助来弄清楚如何让它工作。

我尝试过的:

1

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

给我的是: 当前形式为:WWW::Mechanize=HASH(0x243d828)

Dumper 的部分输出是:

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

我只展示了 Dumper 输出的那部分,因为它似乎是相关部分。当我在我们的 Nagios 页面上尝试同样的事情时,'attr' 部分有一个上面没有的 'name' 字段。 Nagios 页面也有“输入”条目,例如“useralias”和“密码”,但上面没有任何条目。

2

$mech->form_number(1);

因为我不确定我是否正确引用了表单,所以我只是让它尝试使用它找到的第一个表单(无论如何该页面只有一个表单)。我的结果是一样的 - 没有错误,输出是具有默认值的登录页面。

3

我把字段名称中的下划线 (_) 和冒号 (:) 转义(用 '\')搞得一团糟。

我已经搜索过,但没有发现任何说明我必须转义任何字符的内容,但值得一试。我所知道的是,Nagios 页面字段名称仅包含字母并且它有效。

我从 Chrome 的开发者工具中获得了字段名称。例如,用户名表单字段显示:

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

我不知道 Mechanize 是否有以下划线开头的名称或包含冒号的名称的问题。

4

$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 页面指定)

5

Mechanize 的交互式外壳

这是我尝试检索页面上所有表单时的输出:

$ 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,所以我不知道如何进一步解决这个问题 - 特别是因为我没有看到错误。如果有人可以指导我尝试其他事情,那将会很有帮助。

最佳答案

在这个 DOM 和 Javascript 时代,Web 自动化可能会出现很多问题。从您的结果来看,表单似乎是在浏览器空间中构建的,这真的很难以编程方式处理。

确定的方法是转储原始响应并查看它包含的表单代码。

如果这最终证明是您的问题,您最简单的求助方式就是 Mozilla::Mechanize。 .

关于forms - perl WWW::Mechanize 似乎无法找到正确的表单或分配字段或单击提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935899/

相关文章:

JavaScript:找不到元素

javascript - 输入复选框总是返回 false

python - 在第二列之后查找并替换

perl - 使用 perl 的列宽自动调整功能

web-services - Catalyst:安全下载日志文件

perl - 如何安装和使用log4perl?

javascript - 以多种形式监听 ng-dirty

c# - 多形式项目的录入方法是什么?

javascript - 从 ajax 调用填充表单

regex - 我想匹配任何不包括 '#' 但包括 '\#' 的内容