[英]How to use synchronize method with 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;
打印新加載的頁面的標題,但是腳本只是掛起。 它永遠不會退出。 我想念什么?
您傳遞來進行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;
以下是兩個簡短的解決方案-不要指定要等待的事件(以便使用其默認列表),或者使用會自行等待的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
方法確實會等待 (可以使用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');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.