Selaa lähdekoodia

Migrated Selenium::Remote::Commands and fixed the tests accordingly

Emmanuel Peroumalnaik 12 vuotta sitten
vanhempi
sitoutus
d593bbbdec
4 muutettua tiedostoa jossa 305 lisäystä ja 295 poistoa
  1. 298 291
      lib/Selenium/Remote/Commands.pm
  2. 4 2
      lib/Selenium/Remote/Driver.pm
  3. 1 1
      t/03-spec-coverage.t
  4. 2 1
      t/04-commands-implemented.t

+ 298 - 291
lib/Selenium/Remote/Commands.pm

@@ -1,310 +1,317 @@
 package Selenium::Remote::Commands;
+use Moo;
 
-use strict;
-use warnings;
-
-sub new {
-    my $class = shift;
-    
-    # http://code.google.com/p/selenium/wiki/JsonWireProtocol
-    my $self = {
-        'status'     => {
-                          'method' => 'GET',
-                          'url'    => 'status'
-        },
-        'newSession' => {
-                          'method' => 'POST',
-                          'url'    => 'session'
-        },
-        'getSessions' => {
-                          'method' => 'GET',
-                          'url'    => 'sessions'
-        },
-        'getCapabilities' => {
-                          'method' => 'GET',
-                          'url'    => 'session/:sessionId'
-        },
-        'setTimeout' => {
-                        'method' => 'POST',
-                        'url'    => 'session/:sessionId/timeouts'
-        },
-        'setAsyncScriptTimeout' => {
-                        'method' => 'POST',
-                        'url'    => 'session/:sessionId/timeouts/async_script'
-        },
-        'setImplicitWaitTimeout' => {
-                        'method' => 'POST',
-                        'url'    => 'session/:sessionId/timeouts/implicit_wait'
-        },
-        'quit' => {
-                    'method' => 'DELETE',
-                    'url'    => "session/:sessionId"
-        },
-        'getCurrentWindowHandle' => {
-                 'method' => 'GET',
-                 'url' => "session/:sessionId/window_handle"
-        },
-        'getWindowHandles' => {
+has '_cmds' => (
+    is      => 'lazy',
+    reader  => 'get_cmds',
+    builder => sub {
+        return {
+            'status' => {
+                'method' => 'GET',
+                'url'    => 'status'
+            },
+            'newSession' => {
+                'method' => 'POST',
+                'url'    => 'session'
+            },
+            'getSessions' => {
+                'method' => 'GET',
+                'url'    => 'sessions'
+            },
+            'getCapabilities' => {
+                'method' => 'GET',
+                'url'    => 'session/:sessionId'
+            },
+            'setTimeout' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/timeouts'
+            },
+            'setAsyncScriptTimeout' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/timeouts/async_script'
+            },
+            'setImplicitWaitTimeout' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/timeouts/implicit_wait'
+            },
+            'quit' => {
+                'method' => 'DELETE',
+                'url'    => "session/:sessionId"
+            },
+            'getCurrentWindowHandle' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/window_handles"
-        },
-        'getWindowSize' => {
+                'url'    => "session/:sessionId/window_handle"
+            },
+            'getWindowHandles' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/window_handles"
+            },
+            'getWindowSize' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/window/:windowHandle/size"
+            },
+            'getWindowPosition' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/window/:windowHandle/position"
+            },
+            'setWindowSize' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/window/:windowHandle/size"
+            },
+            'setWindowPosition' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/window/:windowHandle/position"
+            },
+            'getCurrentUrl' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/url"
+            },
+            'get' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/url"
+            },
+            'goForward' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/forward"
+            },
+            'goBack' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/back"
+            },
+            'refresh' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/refresh"
+            },
+            'executeScript' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/execute"
+            },
+            'executeAsyncScript' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/execute_async"
+            },
+            'screenshot' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/window/:windowHandle/size"
-        },
-        'getWindowPosition' => {
+                'url'    => "session/:sessionId/screenshot"
+            },
+            'availableEngines' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/window/:windowHandle/position"
-        },
-        'setWindowSize' => {
-                'method' => 'POST',
-                'url' => "session/:sessionId/window/:windowHandle/size"
-        },
-        'setWindowPosition' => {
-                'method' => 'POST',
-                'url' => "session/:sessionId/window/:windowHandle/position"
-        },
-        'getCurrentUrl' => {
-                           'method' => 'GET',
-                           'url' => "session/:sessionId/url"
-        },
-        'get' => {
-                   'method' => 'POST',
-                   'url'    => "session/:sessionId/url"
-        },
-        'goForward' => {
-                       'method' => 'POST',
-                       'url' => "session/:sessionId/forward"
-        },
-        'goBack' => {
-                      'method' => 'POST',
-                      'url'    => "session/:sessionId/back"
-        },
-        'refresh' => {
-                       'method' => 'POST',
-                       'url' => "session/:sessionId/refresh"
-        },
-        'executeScript' => {
-                       'method' => 'POST',
-                       'url' => "session/:sessionId/execute"
-        },
-        'executeAsyncScript' => {
-                       'method' => 'POST',
-                       'url' => "session/:sessionId/execute_async"
-        },
-        'screenshot' => {
-                    'method' => 'GET',
-                    'url' => "session/:sessionId/screenshot"
-        },
-        'availableEngines' => {
-                    'method' => 'GET',
-                    'url' => "session/:sessionId/ime/available_engines"
-        },
-        'switchToFrame' => {
-                'method' => 'POST',
-                'url' => "session/:sessionId/frame"
-        },
-        'switchToWindow' => {
-             'method' => 'POST',
-             'url' => "session/:sessionId/window"
-        },
-        'getAllCookies' => {
-                        'method' => 'GET',
-                        'url' => "session/:sessionId/cookie"
-        },
-        'addCookie' => {
-                        'method' => 'POST',
-                        'url' => "session/:sessionId/cookie"
-        },
-        'deleteAllCookies' => {
-                        'method' => 'DELETE',
-                        'url' => "session/:sessionId/cookie"
-        },
-        'deleteCookieNamed' => {
-             'method' => 'DELETE',
-             'url' => "session/:sessionId/cookie/:name"
-        },
-        'getPageSource' => {
-                        'method' => 'GET',
-                        'url' => "session/:sessionId/source"
-        },
-        'getTitle' => {
-                        'method' => 'GET',
-                        'url' => "session/:sessionId/title"
-        },
-        'findElement' => {
-                       'method' => 'POST',
-                       'url' => "session/:sessionId/element"
-        },
-        'findElements' => {
-                      'method' => 'POST',
-                      'url' => "session/:sessionId/elements"
-        },
-        'getActiveElement' => {
-                'method' => 'POST',
-                'url' => "session/:sessionId/element/active"
-        },
-        'describeElement' => {
+                'url'    => "session/:sessionId/ime/available_engines"
+            },
+            'switchToFrame' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/frame"
+            },
+            'switchToWindow' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/window"
+            },
+            'getAllCookies' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/element/:id"
-        },
-        'findChildElement' => {
-            'method' => 'POST',
-            'url' => "session/:sessionId/element/:id/element"
-        },
-        'findChildElements' => {
-            'method' => 'POST',
-            'url' => "session/:sessionId/element/:id/elements"
-        },
-        'clickElement' => {
-               'method' => 'POST',
-               'url' => "session/:sessionId/element/:id/click"
-        },
-        'submitElement' => {
-              'method' => 'POST',
-              'url' => "session/:sessionId/element/:id/submit"
-        },
-        'sendKeysToElement' => {
-               'method' => 'POST',
-               'url' => "session/:sessionId/element/:id/value"
-        },
-        'sendKeysToActiveElement' => {
-               'method' => 'POST',
-               'url' => "session/:sessionId/keys"
-        },
-        'sendModifier' => {
-               'method' => 'POST',
-               'url' => "session/:sessionId/modifier"
-        },
-        'isElementSelected' => {
-            'method' => 'GET',
-            'url' => "session/:sessionId/element/:id/selected"
-        },
-        'setElementSelected' => {
-            'method' => 'POST',
-            'url' => "session/:sessionId/element/:id/selected"
-        },
-        'toggleElement' => {
-              'method' => 'POST',
-              'url' => "session/:sessionId/element/:id/toggle"
-        },
-        'isElementEnabled' => {
-             'method' => 'GET',
-             'url' => "session/:sessionId/element/:id/enabled"
-        },
-        'getElementLocation' => {
-            'method' => 'GET',
-            'url' => "session/:sessionId/element/:id/location"
-        },
-        'getElementLocationInView' => {
-            'method' => 'GET',
-            'url' => "session/:sessionId/element/:id/location_in_view"
-        },
-        'getElementTagName' => {
+                'url'    => "session/:sessionId/cookie"
+            },
+            'addCookie' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/cookie"
+            },
+            'deleteAllCookies' => {
+                'method' => 'DELETE',
+                'url'    => "session/:sessionId/cookie"
+            },
+            'deleteCookieNamed' => {
+                'method' => 'DELETE',
+                'url'    => "session/:sessionId/cookie/:name"
+            },
+            'getPageSource' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/element/:id/name"
-        },
-        'clearElement' => {
-               'method' => 'POST',
-               'url' => "session/:sessionId/element/:id/clear"
-        },
-        'getElementAttribute' => {
-            'method' => 'GET',
-            'url' =>
-"session/:sessionId/element/:id/attribute/:name"
-        },
-        'elementEquals' => {
-            'method' => 'GET',
-            'url' => "session/:sessionId/element/:id/equals/:other"
-        },
-        'isElementDisplayed' => {
-            'method' => 'GET',
-            'url' => "session/:sessionId/element/:id/displayed"
-        },
-        'close' => {
-                     'method' => 'DELETE',
-                     'url'    => "session/:sessionId/window"
-        },
-        'dragElement' => {
-                'method' => 'POST',
-                'url' => "session/:sessionId/element/:id/drag"
-        },
-        'getElementSize' => {
+                'url'    => "session/:sessionId/source"
+            },
+            'getTitle' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/element/:id/size"
-        },
-        'getElementText' => {
+                'url'    => "session/:sessionId/title"
+            },
+            'findElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element"
+            },
+            'findElements' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/elements"
+            },
+            'getActiveElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/active"
+            },
+            'describeElement' => {
                 'method' => 'GET',
-                'url' => "session/:sessionId/element/:id/text"
-        },
-        'getElementValueOfCssProperty' => {
-            'method' => 'GET',
-            'url' => "session/:sessionId/element/:id/css/:propertyName"
-        },
-        'mouseMoveToLocation' => {
-               'method' => 'POST',
-               'url' => "session/:sessionId/moveto"
-        },
-        'getAlertText' => {
-               'method' => 'GET',
-               'url'    => 'session/:sessionId/alert_text'
-        },
-        'sendKeysToPrompt' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/alert_text'
-        },
-        'acceptAlert' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/accept_alert'
-        },
-        'dismissAlert' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/dismiss_alert'
-        },
-        'click' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/click'
-        },
-        'doubleClick' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/doubleclick'
-        },
-        'buttonDown' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/buttondown'
-        },
-        'buttonUp' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/buttonup'
-        },
-        'uploadFile' => {
-               'method' => 'POST',
-               'url'    => 'session/:sessionId/file'
-        },
-        #'setVisible' => {
-        #               'method' => 'POST',
-        #               'url' => "session/:sessionId/visible"
-        #},
-        #'getVisible' => {
-        #               'method' => 'GET',
-        #               'url' => "session/:sessionId/visible"
-        #},
-    };
+                'url'    => "session/:sessionId/element/:id"
+            },
+            'findChildElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/element"
+            },
+            'findChildElements' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/elements"
+            },
+            'clickElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/click"
+            },
+            'submitElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/submit"
+            },
+            'sendKeysToElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/value"
+            },
+            'sendKeysToActiveElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/keys"
+            },
+            'sendModifier' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/modifier"
+            },
+            'isElementSelected' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/selected"
+            },
+            'setElementSelected' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/selected"
+            },
+            'toggleElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/toggle"
+            },
+            'isElementEnabled' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/enabled"
+            },
+            'getElementLocation' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/location"
+            },
+            'getElementLocationInView' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/location_in_view"
+            },
+            'getElementTagName' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/name"
+            },
+            'clearElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/clear"
+            },
+            'getElementAttribute' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/attribute/:name"
+            },
+            'elementEquals' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/equals/:other"
+            },
+            'isElementDisplayed' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/displayed"
+            },
+            'close' => {
+                'method' => 'DELETE',
+                'url'    => "session/:sessionId/window"
+            },
+            'dragElement' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/element/:id/drag"
+            },
+            'getElementSize' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/size"
+            },
+            'getElementText' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/text"
+            },
+            'getElementValueOfCssProperty' => {
+                'method' => 'GET',
+                'url'    => "session/:sessionId/element/:id/css/:propertyName"
+            },
+            'mouseMoveToLocation' => {
+                'method' => 'POST',
+                'url'    => "session/:sessionId/moveto"
+            },
+            'getAlertText' => {
+                'method' => 'GET',
+                'url'    => 'session/:sessionId/alert_text'
+            },
+            'sendKeysToPrompt' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/alert_text'
+            },
+            'acceptAlert' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/accept_alert'
+            },
+            'dismissAlert' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/dismiss_alert'
+            },
+            'click' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/click'
+            },
+            'doubleClick' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/doubleclick'
+            },
+            'buttonDown' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/buttondown'
+            },
+            'buttonUp' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/buttonup'
+            },
+            'uploadFile' => {
+                'method' => 'POST',
+                'url'    => 'session/:sessionId/file'
+            },
+
+            #'setVisible' => {
+            #               'method' => 'POST',
+            #               'url' => "session/:sessionId/visible"
+            #},
+            #'getVisible' => {
+            #               'method' => 'GET',
+            #               'url' => "session/:sessionId/visible"
+            #},
+        };
+    }
+);
 
-    bless $self, $class or die "Can't bless $class: $!";
-    return $self;
+# helper methods to manipulate the _cmds hash
+sub get_url {
+    my ( $self, $command ) = @_;
+    return $self->get_cmds->{$command}->{url};
+}
+
+sub get_method {
+    my ( $self, $command ) = @_;
+    return $self->get_cmds->{$command}->{method};
 }
 
 # This method will replace the template & return
 sub get_params {
-    my ($self, $args) = @_;
-    if (!(defined $args->{'session_id'})) {
+    my ( $self, $args ) = @_;
+    if ( !( defined $args->{'session_id'} ) ) {
         return;
     }
-    my $data = {};
+    my $data    = {};
     my $command = $args->{'command'};
-    my $url = $self->{$command}->{'url'};
-    
+    my $url     = $self->get_url($command);
+
     # Do the var substitutions.
     $url =~ s/:sessionId/$args->{'session_id'}/;
     $url =~ s/:id/$args->{'id'}/;
@@ -313,7 +320,7 @@ sub get_params {
     $url =~ s/:other/$args->{'other'}/;
     $url =~ s/:windowHandle/$args->{'window_handle'}/;
 
-    $data->{'method'} = $self->{$command}->{'method'};
+    $data->{'method'} = $self->get_method($command);
     $data->{'url'}    = $url;
 
     return $data;

+ 4 - 2
lib/Selenium/Remote/Driver.pm

@@ -312,10 +312,12 @@ sub new_session {
         $args->{desiredCapabilities}->{proxy} = $self->{proxy};
     }
 
+    # command => 'newSession' to fool the tests of commands implemented
+    # TODO: rewrite the testing better, this is so fragile. 
     my $resp =
       $self->{remote_conn}
-      ->request( $self->{commands}->{'newSession'}->{'method'},
-        $self->{commands}->{'newSession'}->{'url'}, $args, );
+      ->request( $self->{commands}->get_method('newSession'),
+        $self->{commands}->get_url('newSession'), $args, );
     if ( ( defined $resp->{'sessionId'} ) && $resp->{'sessionId'} ne '' ) {
         $self->{session_id} = $resp->{'sessionId'};
     }

+ 1 - 1
t/03-spec-coverage.t

@@ -63,7 +63,7 @@ for my $line (@lines) {
     push @methods, $method;
   }
 }
-my $commands = Selenium::Remote::Commands->new;
+my $commands = Selenium::Remote::Commands->new->get_cmds;
 SOURCE_COMMAND: for my $method_source (@methods) {
   my $command = "$method_source->{method} $method_source->{path}";
   my $msg     = "Looking for '$command'";

+ 2 - 1
t/04-commands-implemented.t

@@ -2,6 +2,7 @@
 use strict;
 use warnings;
 
+# TODO: find another way to do this checking, this is so fragile
 use Selenium::Remote::Commands;
 use Test::More;
 
@@ -9,7 +10,7 @@ unless($ENV{RELEASE_TESTING}) {
   plan(skip_all=>"Author tests not required for installation.");
 }
 
-my $comm = Selenium::Remote::Commands->new;
+my $comm = Selenium::Remote::Commands->new->get_cmds;
 for my $command (keys %{$comm}) {
   my $found_command = 0;
   for my $file (