瀏覽代碼

Support for recording

Emmanuel 'BHS_error' Peroumalnaik 11 年之前
父節點
當前提交
73562be206
共有 4 個文件被更改,包括 45 次插入12 次删除
  1. 4 2
      lib/Selenium/Remote/RemoteConnection.pm
  2. 14 4
      t/01-driver.t
  3. 27 5
      t/lib/MockRemoteConnection.pm
  4. 0 1
      t/lib/MockSeleniumWebDriver.pm

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

@@ -55,7 +55,7 @@ sub BUILD {
 
 # This request method is tailored for Selenium RC server
 sub request {
-    my ($self,$resource,$params) = @_;
+    my ($self,$resource,$params,$dont_process_response) = @_;
     my $method =        $resource->{method};
     my $url =        $resource->{url};
     my $no_content_success =        $resource->{no_content_success} // 0;
@@ -96,7 +96,9 @@ sub request {
     $header->header('Accept' => 'application/json');
     my $request = HTTP::Request->new($method, $fullurl, $header, $content);
     my $response = $self->ua->request($request);
-
+    if ($dont_process_response) { 
+        return $response;
+    }
     return $self->_process_response($response, $no_content_success);
 }
 

+ 14 - 4
t/01-driver.t

@@ -6,8 +6,12 @@ use Net::Ping;
 use HTTP::Headers;
 use Test::More;
 use LWP::Protocol::PSGI;
+use LWP::UserAgent;
 use Test::LWP::UserAgent;
 use Selenium::Remote::Driver;
+    use lib 't/lib';
+    use MockCommands; 
+    use MockRemoteConnection;
 
 BEGIN {
     if (defined $ENV{'WD_MOCKING_RECORD'} && ($ENV{'WD_MOCKING_RECORD'}==1)) {
@@ -33,7 +37,16 @@ if (!$record && !(-e "t/mock-recordings/$mock_file")) {
 }
 t::lib::MockSeleniumWebDriver::register($record,"t/mock-recordings/$mock_file");
 
-my $driver = Selenium::Remote::Driver->new(browser_name => 'firefox');
+my $driver = Selenium::Remote::Driver->new(
+    browser_name => 'firefox',
+    remote_conn  => MockRemoteConnection->new(
+        spec               => {},
+        record             => 1,
+        remote_server_addr => 'localhost',
+        port               => 4444,
+        ua                 => LWP::UserAgent->new
+    )
+);
 my $website = 'http://localhost:63636';
 my $ret;
 
@@ -366,9 +379,6 @@ INNER_WINDOW_SIZE: {
 }
 
 BASE_URL: {
-    use lib 't/lib';
-    use MockCommands; 
-    use MockRemoteConnection;
     {
         package MySeleniumRemoteDriver;
         use Moo;

+ 27 - 5
t/lib/MockRemoteConnection.pm

@@ -6,6 +6,8 @@ use Moo;
 use JSON; 
 use Carp;
 use Try::Tiny;
+# use lib 't/lib';
+# use MockCommands;
 
 extends 'Selenium::Remote::RemoteConnection';
 
@@ -16,6 +18,7 @@ has 'spec' => (
 
 has 'mock_cmds' => ( 
     is => 'ro', 
+    # default => sub { return MockCommands->new }
 );
 
 has 'fake_session_id' => ( 
@@ -37,11 +40,15 @@ has 'session_store' => (
     default => sub { {} }
 );
 
+has 'session_id' => ( 
+    is => 'rw',
+    default => sub { undef },
+);
+
 sub dump_session_store { 
     my $self = shift; 
     my ($file,$session_id) = @_;
-    croak "'$file' is not a file" unless (-f $file);
-    open my $fh, $file, '>' or croak "Opening '$file' failed";
+    open (my $fh, '>', $file) or croak "Opening '$file' failed";
     my $session_store = $self->session_store;
     my $dump = {};
     foreach my $path (keys %{$session_store->{$session_id}}) { 
@@ -57,13 +64,28 @@ sub dump_session_store {
 sub request { 
     my $self = shift;
     my ($resource, $params) = @_;
-    if ($self->record) { 
-       my ($m,$u) = ($resource->{method},$resource->{url}); 
-    }
     my $method =        $resource->{method};
     my $url =        $resource->{url};
     my $no_content_success =        $resource->{no_content_success} // 0;
     my $url_params = $resource->{url_params};
+    if ( $self->record ) {
+        my $response = $self->SUPER::request( $resource, $params, 1 );
+
+        if (   ( $response->message ne 'No Content' )
+            && ( $response->content ne '' ) )
+        {
+            if ( $response->content_type =~ m/json/i ) {
+                my $json = JSON->new;
+                $json->allow_blessed;
+                my $decoded_json =
+                  $json->allow_nonref(1)->utf8(1)->decode( $response->content );
+                $self->session_id( $decoded_json->{'sessionId'} )
+                  unless $self->session_id;
+            }
+        }
+        $self->session_store->{$self->session_id}->{"$method $url"} = $response if ($self->session_id);
+        return $self->_process_response($response,$no_content_success);
+    }
     my $mock_cmds = $self->mock_cmds;
     my $spec = $self->spec; 
     my $cmd = $mock_cmds->get_method_name_from_parameters({method => $method,url => $url});

+ 0 - 1
t/lib/MockSeleniumWebDriver.pm

@@ -60,7 +60,6 @@ sub psgi_app {
     my $expected = $self->{req_resp}->[$$req_index]->{request}->{content};
     $expected = $expected eq "" ? $expected : decode_json($expected);
     my $actual = $content eq "" ? $content : decode_json($content);
-
     if (  $self->{req_resp}->[$$req_index]->{request}->{verb} eq $env->{REQUEST_METHOD}
       and $self->{req_resp}->[$$req_index]->{request}->{uri} eq $uri
       and (   $self->{req_resp}->[$$req_index]->{request}->{content} eq $content