1
0
Эх сурвалжийг харах

Install parameter find subs that don't croak

Daniel Gempesaw 11 жил өмнө
parent
commit
b0915bf197

+ 15 - 0
lib/Selenium/Remote/Driver.pm

@@ -22,6 +22,7 @@ use Selenium::Remote::Commands;
 use Selenium::Remote::WebElement;
 use File::Spec::Functions ();
 use File::Basename ();
+use Sub::Install ();
 
 use constant FINDERS => {
     class             => 'class name',
@@ -420,6 +421,8 @@ has 'inner_window_size' => (
 
 );
 
+with 'Selenium::Remote::Finders';
+
 sub BUILD {
     my $self = shift;
 
@@ -438,6 +441,18 @@ sub BUILD {
         my $size = $self->inner_window_size;
         $self->set_inner_window_size(@$size);
     }
+
+    # setup non-croaking, parameter versions of finders
+    foreach my $by (keys %{ $self->FINDERS }) {
+        my $finder_name = 'find_element_by_' . $by;
+        my $find_sub = $self->_build_find_by($by);
+
+        Sub::Install::install_sub({
+            code => $find_sub,
+            into => __PACKAGE__,
+            as   => $finder_name,
+        });
+    }
 }
 
 sub new_from_caps {

+ 25 - 0
lib/Selenium/Remote/Finders.pm

@@ -0,0 +1,25 @@
+package Selenium::Remote::Finders;
+
+use Try::Tiny;
+use Carp qw/carp/;
+use Moo::Role;
+use namespace::clean;
+
+sub _build_find_by {
+    my ($self, $by) = @_;
+
+    return sub {
+        my ($driver, $locator) = @_;
+        my $strategy = $by;
+
+        return try {
+            return $driver->find_element($locator, $strategy);
+        }
+        catch {
+            carp $_;
+            return 0;
+        };
+    }
+}
+
+1;

+ 52 - 0
t/Finders.t

@@ -0,0 +1,52 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More;
+
+BEGIN: {
+    unless (use_ok('Selenium::Remote::Driver')) {
+        BAIL_OUT("Couldn't load Selenium::Remote::Driver");
+        exit;
+    }
+}
+
+use FindBin;
+use lib $FindBin::Bin . '/lib';
+use TestHarness;
+
+my $harness = TestHarness->new(
+    this_file => $FindBin::Script,
+    record => 1
+);
+
+my %selenium_args = %{ $harness->base_caps };
+
+my $driver = Selenium::Remote::Driver->new(%selenium_args);
+$driver->get('http://danielgempesaw.com/Selenium-Remote-Driver/xhtmlTest.html');
+
+# This depends explicitly on the page we're visiting (xhtmlTest.html),
+my %finders = (
+    class => 'navigation',
+    class_name => 'navigation',
+    css => 'html',
+    id => 'linkId',
+    link => 'this goes to the same place',
+    link_text => 'this goes to the same place',
+    name => 'windowOne',
+    partial_link_text => 'this goes to the same',
+    tag_name => 'html',
+    xpath => '//html'
+);
+
+foreach my $by (keys %finders) {
+    my $locator = $finders{$by};
+    my $method = 'find_element_by_' . $by;
+
+    ok($driver->can($method), $method . ':  installed properly');
+    my $elem = $driver->$method($locator);
+    ok($elem, $method . ': finds an element properly');
+    ok($elem->isa('Selenium::Remote::WebElement'), $method . ': element is a WebElement');
+    ok(!$driver->$method('missing') , $method . ': does not croak on unavailable elements');
+}
+done_testing;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 0
t/mock-recordings/finders-mock-darwin.json


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно