1

Selenium 2.* は、ブラウザーとして Firefox を使用して Linux で実行されています。

サーバーと対話するために、Selenium::Remote::Driver モジュールで perl を使用しています。

アラートが存在するかどうかを確認できるものはありますか? perl モジュールは、アラートで [OK] をクリックしたり、アラートからテキストを取得したりするためのいくつかの機能を提供しますが、アラートがない場合はエラーが発生します - エラーを回避し、アラートを取り除くには?

基本的に、ページの読み込みが完了したときにすべてのアラートを削除したいのですが (存在する場合)、どのようにすればよいですか?

私が試した別のオプションは、firefoxプロファイルに変数を設定してすべてのアラートを無効にすることです(これは、ブラウザを自分で使用するときに機能します)が、Seleniumがアラート自体を処理すると思うため、ブラウザがSeleniumによって使用されている場合でもアラートが残っています常に true に設定されている「handlesAlerts」機能が原因で、無効にする方法がわかりません。アラートの存在を確認できない場合の解決策になる可能性があります。

誰にもアイデアがありますか?

4

2 に答える 2

2

アラートを却下し、 eval ブロッ​​クを使用して例外を処理することができます

eval {
   $driver->accept_alert;
};
if ($@){
 warn "Maybe no alert?":
 warn $@;
}
于 2013-02-13T09:42:17.643 に答える
1

アラートをチェックし、必要に応じてアラートをキャンセルまたは操作する関数をいくつか作成しました。

use Try::Tiny qw( try catch );

# checks if there is a javascript alert/confirm/input on the screen
sub alert_is_present
{
    my $d = shift;
    my $alertPresent = 0;
    try{
        my $alertTxt = $d->get_alert_text();

        logIt( "alert open: $alertTxt", 'DEBUG' ) if $alertTxt;
        $alertPresent++;

    }catch{
        my $err = $_;
        if( $err =~ 'modal dialog when one was not open' ){
            logIt( 'no alert open', 'DEBUG2' );
        }else{
            logIt( "ERROR: getting alert_text: $_", 'ERROR' );
        }
    };

    return $alertPresent;
}

# Assumes caller confirmed an alert is present!! Either cancels the alert or
  types any passed in data and accepts it.
sub handle_alert
{
    my ( $d, $action, $data ) = @_;

    logIt( "handle_alert called with: $action, $data", 'DEBUG' );

    if( $action eq 'CANCEL' ){
        $d->dismiss_alert();
    }else{
        $d->send_keys_to_alert( $data )
            if $data;
        $d->accept_alert();
    }

    $d->pause( 500 );
}
于 2015-05-27T16:14:48.853 に答える