簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM