1

Selenium 2.* 在以 Firefox 作为浏览器的 Linux 上运行。

我正在使用 perl 和 Selenium::Remote::Driver 模块与服务器交互。

是否有任何东西可以检查是否存在警报?perl 模块提供了几个功能来单击警报上的确定,或者从中获取文本,但是如果没有警报,这将引发错误 - 如何避免错误并仍然摆脱任何警报?

基本上,我想在页面完成加载(如果有)时删除所有警报,但不确定如何?

我尝试的另一个选项是通过在 firefox 配置文件中设置一个变量来禁用所有警报(当您自己使用浏览器时有效),但是当 Selenium 使用浏览器时,警报仍然存在,因为我认为 Selenium 自己处理警报因为“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 回答