Bug 20757: Capture and upload screenshot on selenium errors
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Fri, 11 May 2018 19:58:07 +0000 (16:58 -0300)
committerNick Clemens <nick@bywatersolutions.com>
Mon, 23 Jul 2018 15:21:48 +0000 (15:21 +0000)
It is a real pain to debug selenium errors, especially when it is
not reproducible locally.

This patch capture a screenshot when an error occurred and upload it
using the excellent lut.im service provided by framasoft
(We could host our own later).

Test plan:
Modify a selenium script to make it fails (search for find_element)
You will see a stack trace followed by a link to framapic.org

Signed-off-by: Mark Tompsett <mtompset@hotmail.com>
Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
t/lib/Selenium.pm

index c7a8644..15b1c57 100644 (file)
@@ -18,12 +18,24 @@ package t::lib::Selenium;
 
 use Modern::Perl;
 use Carp qw( croak );
+use JSON qw( from_json );
 
 use C4::Context;
 
 use base qw(Class::Accessor);
 __PACKAGE__->mk_accessors(qw(login password base_url opac_base_url selenium_addr selenium_port driver));
 
+sub capture {
+    my ( $class, $driver ) = @_;
+
+    my $lutim_server = q|https://framapic.org|; # Thanks Framasoft!
+    $driver->capture_screenshot('selenium_failure.png');
+    my $from_json = from_json qx{curl -s -F "format=json" -F "file=\@selenium_failure.png" -F "delete-day=1" $lutim_server};
+    if ( $from_json ) {
+        print STDERR "\nSCREENSHOT: $lutim_server/" . $from_json->{msg}->{short} . "\n";
+    }
+}
+
 sub new {
     my ( $class, $params ) = @_;
     my $self   = {};
@@ -38,14 +50,16 @@ sub new {
         port               => $self->{selenium_port},
         remote_server_addr => $self->{selenium_addr},
         error_handler => sub {
-            my $selenium_error = $_[1];
+            my ( $driver, $selenium_error ) = @_;
             print STDERR "\nSTRACE:";
             my $i = 1;
             while ( (my @call_details = (caller($i++))) ){
                 print STDERR "\t" . $call_details[1]. ":" . $call_details[2] . " in " . $call_details[3]."\n";
             }
             print STDERR "\n";
-            croak $selenium_error; }
+            $class->capture( $driver );
+            croak $selenium_error;
+        }
     );
     return bless $self, $class;
 }