2

我正在使用WWW::Mechanize::Firefox并且正在尝试使用这样的synchronize方法:

$mech->get('http://example.com/wp-login.php');
$mech->submit_form( with_fields => {log => 'admin', pwd => 'password'});
$self->synchronize( 'DOMContentLoaded', sub {print Dumper($self->title()); });
exit;

打印新加载页面的标题,但脚本只是挂起。它永远不会退出。我错过了什么?

4

2 回答 2

2

您传递给的子例程synchronize旨在执行一些启动浏览器页面更新的操作。synchronize调用它,然后在它返回之前等待您指定的事件

显然,您的print声明根本不会更改网页,因此不会触发任何事件,并且您的代码将无限期暂停

我建议你把调用放到submit_form你传递给的子例程中synchronize。这至少有可能引起DOMContentLoaded火灾

它看起来像这样

$mech->get('http://example.com/wp-login.php');

$mech->synchronize('DOMContentLoaded', sub {
    $mech->submit_form( with_fields => { log => 'admin', pwd => 'password' });  
});

print Dumper $self->title;
于 2016-03-27T08:10:13.270 回答
2

简短   的以下两个解决方案 - 不指定要等待的事件(以便使用其默认列表),或使用click自行等待的方法,而不是submit_form.


form_submit我在, 和方法上看到了同样的问题synchronize。下一次调用仍然会获取正在提交的页面,或者脚本挂起synchronize(正确使用,如Borodin 的回答)。我使用一个网站进行测试,该网站在提交表单时会做一些工作。

包装电话synchronize有一些微妙之处。触发或不触发哪些事件尚不清楚,也可能受到影响(在代码的前面部分)。我发现当调用中没有指定事件时代码可以工作,events()因此会检查默认列表。

mech->synchronize( sub { 
    $mech->submit_form( with_fields => { log => 'admin', pwd => 'password' } );
});
$mech->save_content('after_submit.html');

以下调用获取正确的页面。


该文档从未提及等待form方法,因此需要一些同步。但是,默认情况下,该click方法确实 wait(可以使用synchronize选项更改它)。

所以我发现这也可以解决问题:填写表格和click它。

# Get the page with the form
$mech->fields( log => 'admin', pwd => 'password' );
$mech->click( name => 'Login' );  # whatever the name is  
$mech->save_content('after_submit.html');

之后的下一个调用click获取实际的下一页。

例如,如果表单在 上没有名称<input>,这也可以

$mech->click_button(input => 'submit');
于 2016-03-28T08:35:06.823 回答