浏览代码

Added around modifier for #203

Emmanuel Peroumalnaik 10 年之前
父节点
当前提交
091005614f
共有 2 个文件被更改,包括 35 次插入0 次删除
  1. 26 0
      lib/Selenium/Remote/Driver.pm
  2. 9 0
      t/01-driver.t

+ 26 - 0
lib/Selenium/Remote/Driver.pm

@@ -324,6 +324,12 @@ has 'remote_conn' => (
     },
 );
 
+has 'on_error' => ( 
+    is => 'rw', 
+    predicate => 1,
+    clearer => 1,
+);
+
 has 'ua' => (
     is      => 'lazy',
     builder => sub { return LWP::UserAgent->new }
@@ -456,6 +462,26 @@ sub DEMOLISH {
     $self->quit() if ( $self->auto_close && defined $self->session_id );
 }
 
+around '_execute_command' => sub { 
+    my $orig = shift; 
+    my $self = shift; 
+    # copy @_ because it gets lost in the way
+    my @args = @_;
+    my $return_value; 
+    try { 
+        $return_value = $orig->($self,@args);
+    }
+    catch { 
+        if ($self->has_on_error) { 
+            $self->on_error->($self,$_);
+        }
+        else { 
+            croak $_;
+        }
+    };
+    return $return_value;
+};
+
 # This is an internal method used the Driver & is not supposed to be used by
 # end user. This method is used by Driver to set up all the parameters
 # (url & JSON), send commands & receive processed response from the server.

+ 9 - 0
t/01-driver.t

@@ -9,6 +9,7 @@ use IO::Socket::INET;
 use Selenium::Remote::Driver;
 use Selenium::Remote::Mock::Commands;
 use Selenium::Remote::Mock::RemoteConnection;
+use Carp;
 
 use FindBin;
 use lib $FindBin::Bin . '/lib';
@@ -515,6 +516,14 @@ UPLOAD: {
     }
 }
 
+ERROR: { 
+    # driver behaviour on error
+    $driver->on_error(sub { my ($self,$error_msg) = @_; croak("Got message: $error_msg");});
+    like( exception{ $driver->find_element("somethingthatdoesnotexist") }, qr/^Got message:/, "Error handler catches correctly an error"); 
+    $driver->clear_on_error;
+    unlike( exception{ $driver->find_element("somethingthatdoesnotexist") }, qr/^Got message:/, "Error handler was correctly cleared");
+}
+
 QUIT: {
     $ret = $driver->quit();
     ok((not defined $driver->{'session_id'}), 'Killed the remote session');