Skip to content

Commit

Permalink
Make use of subroutine signatures
Browse files Browse the repository at this point in the history
  • Loading branch information
JRaspass committed Jan 2, 2018
1 parent 77b66f6 commit f799294
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 66 deletions.
1 change: 1 addition & 0 deletions Changes
Original file line number Diff line number Diff line change
@@ -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
Expand Down
63 changes: 26 additions & 37 deletions lib/WebDriver/Tiny.pm
Original file line number Diff line number Diff line change
@@ -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.
#
Expand Down Expand Up @@ -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};

Expand Down Expand Up @@ -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.
Expand All @@ -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 ) {
Expand All @@ -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' );
Expand All @@ -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',
Expand Down Expand Up @@ -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] }
Expand All @@ -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 },
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
45 changes: 20 additions & 25 deletions lib/WebDriver/Tiny/Elements.pm
Original file line number Diff line number Diff line change
@@ -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.. $#$_ ], @_ ] }
Expand All @@ -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 $!;
Expand All @@ -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;
}
Expand Down
12 changes: 8 additions & 4 deletions t/return_self.t
Original file line number Diff line number Diff line change
@@ -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
/;

Expand Down

0 comments on commit f799294

Please sign in to comment.