我正在使用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;
新加载页面的标题会打印,但脚本会挂起。它永远不会退出。我错过了什么?
答案 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_submit
和synchronize
方法中看到了同样的问题。下一个调用仍然会提交正在提交的页面,或者脚本挂起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');