File Coverage

blib/lib/Selenium/Waiter.pm
Criterion Covered Total %
statement 31 31 100.0
branch 13 14 92.8
condition 2 3 66.6
subroutine 8 8 100.0
pod 1 1 100.0
total 55 57 96.4


line stmt bran cond sub pod time code
1             package Selenium::Waiter;
2             $Selenium::Waiter::VERSION = '1.50';
3 14     14   310303 use strict;
  14         33  
  14         488  
4 14     14   64 use warnings;
  14         22  
  14         692  
5              
6             # ABSTRACT: Provides a utility wait_until function
7 14     14   2293 use Try::Tiny;
  14         7788  
  14         5657  
8             require Exporter;
9             our @ISA = qw/Exporter/;
10             our @EXPORT = qw/wait_until/;
11              
12              
13             sub wait_until (&%) {
14 8     8 1 331742 my $assert = shift;
15 8         55 my $args = {
16             timeout => 30,
17             interval => 1,
18             debug => 0,
19             die => 0,
20             @_
21             };
22              
23 8         20 my $start = time;
24             my $timeout_not_elapsed = sub {
25 11     11   26 my $elapsed = time - $start;
26 11         59 return $elapsed < $args->{timeout};
27 8         39 };
28              
29 8         17 my $exception = '';
30 8         24 while ( $timeout_not_elapsed->() ) {
31 8         16 my $assert_ret;
32             my $try_ret = try {
33 8     8   547 $assert_ret = $assert->();
34 6 100       24 return $assert_ret if $assert_ret;
35             }
36             catch {
37 2     2   59 $exception = $_;
38 2 100       13 die $_ if $args->{die};
39 1 50       3 warn $_ if $args->{debug};
40 1         7 return '';
41             }
42             finally {
43 8 100   8   182 if ( !$assert_ret ) {
44 4         4004574 sleep( $args->{interval} );
45             }
46 8         72 };
47              
48 7 100       238 return $try_ret if $try_ret;
49             }
50              
51 3 100       37 warn 'timeout' if $args->{debug};
52              
53             # No need to repeat ourselves if we're already debugging.
54 3 100 66     48 warn $exception if $exception && !$args->{debug};
55 3         37 return '';
56             }
57              
58             1;
59              
60             __END__