Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

'find_element'-like functions in Test::Selenium::Remote::Driver should support a locator strategy as an argument #179

Merged
merged 13 commits into from Jan 24, 2015
Merged
1 change: 1 addition & 0 deletions lib/Selenium/Remote/Driver.pm
Expand Up @@ -36,6 +36,7 @@ use constant FINDERS => {
xpath => 'xpath',
};


=head1 SYNOPSIS

use Selenium::Remote::Driver;
Expand Down
5 changes: 0 additions & 5 deletions lib/Selenium/Remote/Mock/RemoteConnection.pm
Expand Up @@ -147,10 +147,6 @@ sub request {
my $ret = { cmd_status => 'OK', cmd_return => 1 };
if ( defined( $spec->{$cmd} ) ) {
my $return_sub = $spec->{$cmd};
if ($no_content_success) {
$ret->{cmd_return} = 1;
}
else {
my $mock_return = $return_sub->( $url_params, $params );
if ( ref($mock_return) eq 'HASH' ) {
$ret->{cmd_status} = $mock_return->{status};
Expand All @@ -160,7 +156,6 @@ sub request {
else {
$ret = $mock_return;
}
}
$ret->{session_id} = $self->fake_session_id if ( ref($ret) eq 'HASH' );
}
else {
Expand Down
255 changes: 146 additions & 109 deletions lib/Test/Selenium/Remote/Driver.pm
Expand Up @@ -33,7 +33,7 @@ has func_list => (
'send_modifier_ok', 'accept_alert_ok', 'dismiss_alert_ok',
'get_ok', 'go_back_ok', 'go_forward_ok', 'add_cookie_ok',
'get_page_source_ok', 'find_element_ok', 'find_elements_ok',
'find_child_element_ok', 'find_child_elements_ok',
'find_child_element_ok', 'find_child_elements_ok', 'find_no_element_ok',
'compare_elements_ok', 'click_ok', 'double_click_ok',
'body_like',
];
Expand All @@ -44,8 +44,12 @@ sub has_args {
my $self = shift;
my $fun_name = shift;
my $hash_fun_args = {
'find_element' => 1,
'find_elements' => 1,
'find_element' => 2,
'find_no_element' => 2,
'find_child_element' => 3,
'find_child_elements' => 3,
'find_element' => 2,
'find_elements' => 2,
'compare_elements' => 2,
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah wow I see what you mean about complicated. yeah the named parameter version seems more and more attractive. this is good for now!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah :)
We could try and migrate T::S::R::D on a named parameter version, since this class seems to be used by few. Something to add on the roadmap at some point ?

'get' => 1,
};
Expand Down Expand Up @@ -235,66 +239,173 @@ more documentation, see the related test methods in L<Selenium::Remote::Driver>

click_ok
double_click_ok
=cut


=head2 $twd->type_element_ok($search_target, $keys, [, $desc ]);
# function composing a find_element with locator with a webelement test

$twd->type_element_ok( $search_target, $keys [, $desc ] );
sub _find_element_with_action {
my $self = shift;
my $method = shift;
my ($locator,$locator_strategy,$params,$desc) = @_;
# case 4 args
if ($desc) {
$self->croak('Invalid locator strategy') unless ($self->FINDERS->{$locator_strategy});
}
else {
if ($params) {
# means that we called it the 'old way' (no locator strategy)
if (!defined($self->FINDERS->{$locator_strategy})) {
$desc = $params;
$params = $locator_strategy;
$locator_strategy = $self->default_finder;
}
}
else {
# means it was called with no locator strategy and no desc
if ($locator_strategy) {
if (!defined($self->FINDERS->{$locator_strategy})) {
$params = $locator_strategy;
$locator_strategy = $self->default_finder;
}
}
else {
$self->croak('Not enough arguments');
}
}
}
unless ($desc) {
$desc = $method;
$desc .= "'" . join( " ", ($params // '') ) . "'";
}
return $self->find_element($locator,$locator_strategy)->$method( $params, $desc );
}


=head2 $twd->type_element_ok($search_target [,$locator], $keys, [, $desc ]);

$twd->type_element_ok( $search_target [,$locator], $keys [, $desc ] );

Use L<Selenium::Remote::Driver/find_element> to resolve the C<$search_target>
to a web element, and then type C<$keys> into it, providing an optional test
to a web element and an optional locator, and then type C<$keys> into it, providing an optional test
label.

Currently, other finders besides the default are not supported for C<type_ok()>.

=cut

sub type_element_ok {
my $self = shift;
my $locator = shift;
my $keys = shift;
my $desc = shift;
return $self->find_element($locator)->send_keys_ok( $keys, $desc );
my $method = 'send_keys_ok';
return $self->_find_element_with_action($method,@_);
}


=head2 $twd->element_text_is($search_target[,$finder],$expected_text [,$desc]);

$twd->element_text_is($search_target[,$finder],$expected_text [,$desc]);

=cut

sub element_text_is {
my $self = shift;
my $method = 'text_is';
return $self->_find_element_with_action($method,@_);
}

=head2 $twd->element_value_is($search_target[,$finder],$expected_value [,$desc]);

=head2 $twd->find_element_ok($search_target [, $desc ]);
$twd->element_value_is($search_target[,$finder],$expected_value [,$desc]);

=cut

$twd->find_element_ok( $search_target [, $desc ] );
sub element_value_is {
my $self = shift;
my $method = 'value_is';
return $self->_find_element_with_action($method,@_);
}

=head2 $twd->click_element_ok($search_target [,$desc]);

$twd->click_element_ok($search_target [,$desc]);

Find an element and then click on it.

=cut

sub click_element_ok {
my $self = shift;
my $method = 'click_ok';
return $self->_find_element_with_action($method,@_);
}

=head2 $twd->clear_element_ok($search_target [,$desc]);

$twd->clear_element_ok($search_target [,$desc]);

Find an element and then clear on it.

=cut

sub clear_element_ok {
my $self = shift;
my $method = 'clear_ok';
return $self->_find_element_with_action($method,@_);
}

=head2 $twd->is_element_displayed_ok($search_target [,$desc]);

$twd->is_element_displayed_ok($search_target [,$desc]);

Find an element and check to confirm that it is displayed. (visible)

=cut

sub is_element_displayed_ok {
my $self = shift;
my $method = 'is_displayed_ok';
return $self->_find_element_with_action($method,@_);
}

=head2 $twd->is_element_enabled_ok($search_target [,$desc]);

$twd->is_element_enabled_ok($search_target [,$desc]);

Find an element and check to confirm that it is enabled.

=cut

sub is_element_enabled_ok {
my $self = shift;
my $method = 'is_enabled_ok';
return $self->_find_element_with_action($method,@_);
}


=head2 $twd->find_element_ok($search_target [,$finder, $desc ]);

$twd->find_element_ok( $search_target [,$finder, $desc ] );

Returns true if C<$search_target> is successfully found on the page. L<$search_target>
is passed to L<Selenium::Remote::Driver/find_element> using the C<default_finder>. See
there for more details on the format. Currently, other finders besides the default are not supported
for C<find_element_ok()>.
is passed to L<Selenium::Remote::Driver/find_element> using a finder or the C<default_finder>
if none passed.
See there for more details on the format for C<find_element_ok()>.

=cut

# Eventually, it would be nice to support other finds like Test::WWW::Selenium does, like this:
# 'xpath=//foo', or 'css=.foo', etc.

=head2 $twd->find_no_element_ok($search_target [, $desc ]);
=head2 $twd->find_no_element_ok($search_target [,$finder, $desc ]);

$twd->find_no_element_ok( $search_target [, $desc ] );
$twd->find_no_element_ok( $search_target [,$finder, $desc ] );

Returns true if C<$search_target> is I<not> found on the page. L<$search_target>
is passed to L<Selenium::Remote::Driver/find_element> using the C<default_finder>. See
there for more details on the format. Currently, other finders besides the default are not supported
is passed to L<Selenium::Remote::Driver/find_element> using a finder or the
C<default_finder> if none passed.See there for more details on the format.
for C<find_no_element_ok()>.

=cut

sub find_no_element_ok {
my $self = shift;
my $search_target = shift;
my $desc = shift;
my $rv = 0 ;
local $Test::Builder::Level = $Test::Builder::Level + 1;
try {
$self->find_element($search_target)
} catch {
$rv = 1 if ($_);
};
return $self->ok($rv == 1,$desc);
}

=head2 $twd->content_like( $regex [, $desc ] )

Expand Down Expand Up @@ -349,18 +460,17 @@ sub content_unlike {
my $self = shift;
my $regex = shift;
my $desc = shift;

local $Test::Builder::Level = $Test::Builder::Level + 1;

my $content = $self->get_page_source();

if ( not ref $regex eq 'ARRAY' ) {
my $desc = qq{Content is unlike "$regex"} if ( not defined $desc );
$desc = qq{Content is unlike "$regex"} if ( not defined $desc );
return unlike_string( $content, $regex, $desc );
}
elsif ( ref $regex eq 'ARRAY' ) {
for my $re (@$regex) {
my $desc = qq{Content is unlike "$re"} if ( not defined $desc );
$desc = qq{Content is unlike "$re"} if ( not defined $desc );
unlike_string( $content, $re, $desc );
}
}
Expand Down Expand Up @@ -590,79 +700,6 @@ sub body_text_lacks {
}
}

=head2 $twd->element_text_is($search_target,$expected_text [,$desc]);

$twd->element_text_is($search_target,$expected_text [,$desc]);

=cut

sub element_text_is {
my ( $self, $search_target, $expected, $desc ) = @_;
return $self->find_element($search_target)->text_is( $expected, $desc );
}

=head2 $twd->element_value_is($search_target,$expected_value [,$desc]);

$twd->element_value_is($search_target,$expected_value [,$desc]);

=cut

sub element_value_is {
my ( $self, $search_target, $expected, $desc ) = @_;
return $self->find_element($search_target)->value_is( $expected, $desc );
}

=head2 $twd->click_element_ok($search_target [,$desc]);

$twd->click_element_ok($search_target [,$desc]);

Find an element and then click on it.

=cut

sub click_element_ok {
my ( $self, $search_target, $desc ) = @_;
return $self->find_element($search_target)->click_ok($desc);
}

=head2 $twd->clear_element_ok($search_target [,$desc]);

$twd->clear_element_ok($search_target [,$desc]);

Find an element and then clear on it.

=cut

sub clear_element_ok {
my ( $self, $search_target, $desc ) = @_;
return $self->find_element($search_target)->clear_ok($desc);
}

=head2 $twd->is_element_displayed_ok($search_target [,$desc]);

$twd->is_element_displayed_ok($search_target [,$desc]);

Find an element and check to confirm that it is displayed. (visible)

=cut

sub is_element_displayed_ok {
my ( $self, $search_target, $desc ) = @_;
return $self->find_element($search_target)->is_displayed_ok($desc);
}

=head2 $twd->is_element_enabled_ok($search_target [,$desc]);

$twd->is_element_enabled_ok($search_target [,$desc]);

Find an element and check to confirm that it is enabled.

=cut

sub is_element_enabled_ok {
my ( $self, $search_target, $desc ) = @_;
return $self->find_element($search_target)->is_enabled_ok($desc);
}

1;

Expand Down