浏览代码

selenium-test-server.pl is going to simulate a Selenium 2.0 REST servie to aid in testing. It will support all the resources defined in JSON Wire protocol. Think of this an instance of a MockObject so that the remote bindings can be tested without the need for an actual Selenium 2.0 remote server. This script will start a server at port 4444.

Aditya Ivaturi 15 年之前
父节点
当前提交
2170221d0e
共有 1 个文件被更改,包括 237 次插入0 次删除
  1. 237 0
      t/selenium-test-server.pl

+ 237 - 0
t/selenium-test-server.pl

@@ -0,0 +1,237 @@
+use strict;
+use warnings;
+
+use HTTP::Daemon;
+use HTTP::Status;
+use Data::Compare;
+use JSON;
+
+# Port where Selenium server listens
+my $port = 4444;
+my $daemon = HTTP::Daemon->new( LocalPort => $port )
+  || die "Couldn't start HTTP server at $port ";
+print "Server listening at: ", $daemon->url, "\n";
+
+my $resource = {
+    '/wd/hub/session' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/window_handle' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/window_handles' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/url' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/forward' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/back' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/refresh' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/execute' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/screenshot' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/frame' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/window' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/speed' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/cookie' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/cookie/foo-bar' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/source' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/title' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/elements' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/active' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/element' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/elements' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/click' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/submit' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/text' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/value' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/name' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/clear' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/selected' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/toggle' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/enabled' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/attribute/attrName' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/equals/otherElemID' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/displayed' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/location' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/location_in_view' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/size' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/css/propName' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/hover' => {
+        'input'  =>,
+        'output' =>,
+    },
+    '/wd/hub/session/123456789/element/elemID/drag' => {
+        'input'  =>,
+        'output' =>,
+    },
+};
+
+my $json = new JSON;
+while ( my $client = $daemon->accept ) {
+    while ( my $request = $client->get_request ) {
+        my $url = $request->uri->path;
+
+        # Check if the resource is defined
+        if ( !( defined $resource->{$url} ) ) {
+            $client->send_error(404);
+        }
+        elsif ( $url eq '/wd/hub/session' ) {
+            # our dummy session 123456789...
+            my $rs = new HTTP::Response(303);
+            $rs->header( 'Location' => 'http://localhost:4444/wd/hub/session/123456789' );
+            my $resp = {
+                'sessionId' => '123456789',
+                'value'     => {
+                    'browserName'       => 'firefox',
+                    'version'           => '',
+                    'javascriptEnabled' => JSON::true,
+                    'class' => 'org.openqa.selenium.remote.DesiredCapabilities',
+                    'platform' => 'ANY'
+                },
+                'status' => 0,
+                'class'  => 'org.openqa.selenium.remote.Response'
+            };
+            my $json_data = $json->allow_nonref->utf8(1)->encode($resp);
+            $rs->content($json_data);
+            $client->send_response($rs);
+        }
+        else {
+            my $rs = new HTTP::Response(200);
+            my $json_data = '';
+            if ( defined $resource->{$url}->{'input'} ) {
+                my $post_data =
+                  $json->allow_nonref->utf8(1)->decode( $request->content );
+                if ( !( Compare( $post_data, $resource->{$url}->{'input'} ) ) )
+                {
+                    $rs->code(400);
+                    $json_data = "";
+                }
+                else {
+                    $json_data =
+                      $json->allow_nonref->utf8(1)
+                      ->encode( $resource->{$url}->{'output'} );
+                }
+            }
+            $rs->header( 'Content-Type' => 'application/json; charset=utf-8' );
+            $rs->content($json_data);
+            $client->send_response($rs);
+        }
+    }
+
+    # clean up
+    $client->close();
+    undef($client);
+}