如何在WWW :: Mechanize :: Firefox中使用synchronize方法?

时间:2016-03-27 02:47:55

标签: perl www-mechanize-firefox

我正在使用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;

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

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

我在form_submitsynchronize方法中看到了同样的问题。下一个调用仍然会提交正在提交的页面,或者脚本挂起synchronize(正确使用,如Borodin's answer中所示)。我测试了一个在提交表单时做了一些工作的网站。

synchronize中包含电话会带来一些细微之处。触发或未触发的事件不明确,也可能受到影响(代码中较早)。我发现代码在调用中没有指定事件时有效,因此检查了events()的默认列表。

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

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

文档从未提及等待form方法,因此需要进行一些同步。但是,click方法确实等待,默认情况下(可以使用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');