From f799294bc9526d63a820c9160cebc31b27f0551d Mon Sep 17 00:00:00 2001 From: James Raspass Date: Tue, 2 Jan 2018 09:39:51 +0000 Subject: [PATCH] Make use of subroutine signatures --- Changes | 1 + lib/WebDriver/Tiny.pm | 63 ++++++++++++++-------------------- lib/WebDriver/Tiny/Elements.pm | 45 +++++++++++------------- t/return_self.t | 12 ++++--- 4 files changed, 55 insertions(+), 66 deletions(-) diff --git a/Changes b/Changes index d379b2d..2e903fd 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,6 @@ 0.101 2018-01-02 - Try harder to get a meaningful error message. + - Make use of subroutine signatures. 0.100 2017-12-21 - This is a breaking chance, we now support the latest WebDriver spec and diff --git a/lib/WebDriver/Tiny.pm b/lib/WebDriver/Tiny.pm index c2254cc..58c6467 100644 --- a/lib/WebDriver/Tiny.pm +++ b/lib/WebDriver/Tiny.pm @@ -1,9 +1,9 @@ package WebDriver::Tiny 0.100; use 5.020; -use feature 'postderef'; +use feature qw/postderef signatures/; use warnings; -no warnings 'experimental::postderef'; +no warnings 'experimental'; # Allow "cute" $drv->('selector') syntax. # @@ -68,9 +68,7 @@ sub import { # 3: The capabilities of the WebDriver daemon, # 4: Cached closure of $self for ->() syntax, # ] -sub new { - my ( $class, %args ) = @_; - +sub new($class, %args) { Carp::croak qq/$class - Missing required parameter "port"/ unless exists $args{port}; @@ -102,15 +100,15 @@ sub new { $self; } -sub capabilities { $_[0][3] } +sub capabilities($self) { $self->[3] } -sub html { $_[0]->_req( GET => '/source' ) } -sub title { $_[0]->_req( GET => '/title' ) } -sub url { $_[0]->_req( GET => '/url' ) } +sub html($self) { $self->_req( GET => '/source' ) } +sub title($self) { $self->_req( GET => '/title' ) } +sub url($self) { $self->_req( GET => '/url' ) } -sub back { $_[0]->_req( POST => '/back' ); $_[0] } -sub forward { $_[0]->_req( POST => '/forward' ); $_[0] } -sub refresh { $_[0]->_req( POST => '/refresh' ); $_[0] } +sub back($self) { $self->_req( POST => '/back' ); $self } +sub forward($self) { $self->_req( POST => '/forward' ); $self } +sub refresh($self) { $self->_req( POST => '/refresh' ); $self } sub status { # /status is the only path without the session prefix, so surpress it. @@ -119,10 +117,10 @@ sub status { $_[0]->_req( GET => '/status' ); } -sub alert_accept { $_[0]->_req( POST => '/alert/accept' ); $_[0] } -sub alert_dismiss { $_[0]->_req( POST => '/alert/dismiss' ); $_[0] } +sub alert_accept($self) { $self->_req( POST => '/alert/accept' ); $self } +sub alert_dismiss($self) { $self->_req( POST => '/alert/dismiss' ); $self } -sub alert_text { $_[0]->_req( GET => '/alert/text' ) } +sub alert_text($self) { $self->_req( GET => '/alert/text' ) } sub base_url { if ( @_ == 2 ) { @@ -146,11 +144,9 @@ sub cookie { $self; } -sub cookie_delete { - my $self = shift; - - if (@_) { - $self->_req( DELETE => "/cookie/$_" ) for @_; +sub cookie_delete($self, @cookies) { + if (@cookies) { + $self->_req( DELETE => "/cookie/$_" ) for @cookies; } else { $self->_req( DELETE => '/cookie' ); @@ -169,9 +165,7 @@ sub cookies { } # NOTE This method can be called from a driver or a collection of elements. -sub find { - my ( $self, $selector, %args ) = @_; - +sub find($self, $selector, %args) { state $methods = { css => 'css selector', ecmascript => 'ecmascript', @@ -211,8 +205,7 @@ sub find { : bless [ $drv, @ids ], 'WebDriver::Tiny::Elements'; } -my $js = sub { - my ( $path, $self, $script, @args ) = @_; +my $js = sub($path, $self, $script, @args) { # Currently only takes the first ID in the collection, this should change. $_ = { ELEMENT => $_->[1] } @@ -224,9 +217,7 @@ my $js = sub { sub js { unshift @_, '/execute/sync'; goto $js } sub js_async { unshift @_, '/execute/async'; goto $js } -sub get { - my ( $self, $url ) = @_; - +sub get($self, $url) { $self->_req( POST => '/url', { url => $url =~ m(^https?://) ? $url : $self->[2] . $url }, @@ -257,13 +248,13 @@ sub screenshot { sub user_agent { $js->( '/execute/sync', $_[0], 'return window.navigator.userAgent') } -sub window { $_[0]->_req( GET => '/window' ) } -sub windows { $_[0]->_req( GET => '/window/handles' ) } +sub window($self) { $self->_req( GET => '/window' ) } +sub windows($self) { $self->_req( GET => '/window/handles' ) } -sub window_close { $_[0]->_req( DELETE => '/window' ); $_[0] } -sub window_fullscreen { $_[0]->_req( POST => '/window/fullscreen' ); $_[0] } -sub window_maximize { $_[0]->_req( POST => '/window/maximize' ); $_[0] } -sub window_minimize { $_[0]->_req( POST => '/window/minimize' ); $_[0] } +sub window_close($self) { $self->_req( DELETE => '/window' ); $self } +sub window_fullscreen($self) { $self->_req( POST => '/window/fullscreen' ); $self } +sub window_maximize($self) { $self->_req( POST => '/window/maximize' ); $self } +sub window_minimize($self) { $self->_req( POST => '/window/minimize' ); $self } sub window_rect { my $self = shift; @@ -280,9 +271,7 @@ sub window_rect { $self; } -sub window_switch { - my ( $self, $handle ) = @_; - +sub window_switch( $self, $handle) { $self->_req( POST => '/window', { handle => $handle } ); $self; diff --git a/lib/WebDriver/Tiny/Elements.pm b/lib/WebDriver/Tiny/Elements.pm index 69d9c46..246e48a 100644 --- a/lib/WebDriver/Tiny/Elements.pm +++ b/lib/WebDriver/Tiny/Elements.pm @@ -1,9 +1,9 @@ package WebDriver::Tiny::Elements 0.100; use 5.020; -use feature 'postderef'; +use feature qw/postderef signatures/; use warnings; -no warnings 'experimental::postderef'; +no warnings 'experimental'; # Manip sub append { bless [ shift->@*, map @$_[ 1.. $#$_ ], @_ ] } @@ -13,40 +13,38 @@ sub size { $#{ $_[0] } } sub slice { my ( $drv, @ids ) = shift->@*; bless [ $drv, @ids[@_] ] } sub split { my ( $drv, @ids ) = $_[0]->@*; map { bless [ $drv, $_ ] } @ids } -sub uniq { - my ( $drv, @ids ) = $_[0]->@*; +sub uniq($self) { + my ( $drv, @ids ) = @$self; bless [ $drv, keys %{ { map { $_ => undef } @ids } } ]; } -sub attr { $_[0]->_req( GET => "/attribute/$_[1]" ) } -sub css { $_[0]->_req( GET => "/css/$_[1]" ) } -sub prop { $_[0]->_req( GET => "/property/$_[1]" ) } +sub attr($self, $value) { $self->_req( GET => "/attribute/$value" ) } +sub css($self, $value) { $self->_req( GET => "/css/$value" ) } +sub prop($self, $value) { $self->_req( GET => "/property/$value" ) } -sub clear { $_[0]->_req( POST => '/clear' ); $_[0] } -sub click { $_[0]->_req( POST => '/click' ); $_[0] } -sub tap { $_[0]->_req( POST => '/tap' ); $_[0] } +sub clear($self) { $self->_req( POST => '/clear' ); $self } +sub click($self) { $self->_req( POST => '/click' ); $self } +sub tap($self) { $self->_req( POST => '/tap' ); $self } -sub enabled { $_[0]->_req( GET => '/enabled' ) } -sub rect { $_[0]->_req( GET => '/rect' ) } -sub selected { $_[0]->_req( GET => '/selected' ) } -sub tag { $_[0]->_req( GET => '/name' ) } -sub visible { $_[0]->_req( GET => '/displayed' ) } +sub enabled($self) { $self->_req( GET => '/enabled' ) } +sub rect($self) { $self->_req( GET => '/rect' ) } +sub selected($self) { $self->_req( GET => '/selected' ) } +sub tag($self) { $self->_req( GET => '/name' ) } +sub visible($self) { $self->_req( GET => '/displayed' ) } sub html { $_[0][0]->js( 'return arguments[0].outerHTML', $_[0] ) } *find = \&WebDriver::Tiny::find; -sub screenshot { - my ($self, $file) = @_; - +sub screenshot($self, $file = undef) { require MIME::Base64; my $data = MIME::Base64::decode_base64( $self->_req( GET => '/screenshot' ) ); - if ( @_ == 2 ) { + if ( defined $file ) { open my $fh, '>', $file or die $!; print $fh $data; close $fh or die $!; @@ -57,16 +55,13 @@ sub screenshot { $data; } -sub send_keys { - my ( $self, $keys ) = @_; - +sub send_keys($self, $keys) { $self->_req( POST => '/value', { text => "$keys" } ); - $self; } -sub text { - my ( $drv, @ids ) = $_[0]->@*; +sub text($self) { + my ( $drv, @ids ) = @$self; join ' ', map $drv->_req( GET => "/element/$_/text" ), @ids; } diff --git a/t/return_self.t b/t/return_self.t index 5398379..592b998 100644 --- a/t/return_self.t +++ b/t/return_self.t @@ -1,17 +1,21 @@ use lib 't'; -use t '16'; +use t '17'; -is $drv->$_('foo'), $drv, "drv->$_('foo') should return \$self" for qw/ +is $drv->$_, $drv, "drv->$_ should return \$self" for qw/ alert_accept alert_dismiss back - base_url cookie_delete forward - get refresh window_close window_maximize +/; + +is $drv->$_('foo'), $drv, "drv->$_('foo') should return \$self" for qw/ + base_url + cookie_delete + get window_switch /;