Bladeren bron

Changes include:

- Support for the new 2.0 wire protocol described at http://code.google.com/p/selenium/wiki/JsonWireProtocol
- Added ErrorHandler to handle any errors that the RC server returns (still need to handle screen)
- Implemented a few Web Element methods to get started.
Aditya Ivaturi 15 jaren geleden
bovenliggende
commit
ca1efb0f34
4 gewijzigde bestanden met toevoegingen van 341 en 172 verwijderingen
  1. 150 154
      lib/Selenium/Remote/Commands.pm
  2. 96 11
      lib/Selenium/Remote/Driver.pm
  3. 80 0
      lib/Selenium/Remote/ErrorHandler.pm
  4. 15 7
      lib/Selenium/Remote/RemoteConnection.pm

+ 150 - 154
lib/Selenium/Remote/Commands.pm

@@ -7,219 +7,216 @@ use String::TT qw/tt/;
 
 sub new {
     my $class = shift;
+    
+    # http://code.google.com/p/selenium/wiki/JsonWireProtocol
     my $self = {
-        'addCookie' => {
-                        'method' => 'POST',
-                        'url' => "session/[% session_id %]/[% context %]/cookie"
+        'newSession' => {
+                          'method' => 'POST',
+                          'url'    => 'session'
         },
-        'goBack' => {
-                      'method' => 'POST',
-                      'url'    => "session/[% session_id %]/[% context %]/back"
+        'getCapabilities' => {
+                          'method' => 'GET',
+                          'url'    => 'session/[% session_id %]'
         },
-        'clearElement' => {
-               'method' => 'POST',
-               'url' =>
-                 "session/[% session_id %]/[% context %]/element/[% id %]/clear"
+        'quit' => {
+                    'method' => 'DELETE',
+                    'url'    => "session/[% session_id %]"
         },
-        'clickElement' => {
-               'method' => 'POST',
-               'url' =>
-                 "session/[% session_id %]/[% context %]/element/[% id %]/click"
+        'getCurrentWindowHandle' => {
+                 'method' => 'GET',
+                 'url' => "session/[% session_id %]/window_handle"
         },
-        'close' => {
-                     'method' => 'DELETE',
-                     'url'    => "session/[% session_id %]/[% context %]/window"
+        'getWindowHandles' => {
+                'method' => 'GET',
+                'url' => "session/[% session_id %]/window_handles"
         },
         'getCurrentUrl' => {
                            'method' => 'GET',
-                           'url' => "session/[% session_id %]/[% context %]/url"
+                           'url' => "session/[% session_id %]/url"
         },
-        'deleteAllCookies' => {
-                        'method' => 'DELETE',
-                        'url' => "session/[% session_id %]/[% context %]/cookie"
+        'get' => {
+                   'method' => 'POST',
+                   'url'    => "session/[% session_id %]/url"
         },
-        'deleteCookie' => {
-             'method' => 'DELETE',
-             'url' => "session/[% session_id %]/[% context %]/cookie/[% name %]"
+        'goForward' => {
+                       'method' => 'POST',
+                       'url' => "session/[% session_id %]/forward"
         },
-        'dragElement' => {
-                'method' => 'POST',
-                'url' =>
-                  "session/[% session_id %]/[% context %]/element/[% id %]/drag"
+        'goBack' => {
+                      'method' => 'POST',
+                      'url'    => "session/[% session_id %]/back"
         },
-        'elementEquals' => {
-            'method' => 'GET',
-            'url' =>
-"session/[% session_id %]/[% context %]/element/[% id %]/equals/[% other %]"
+        'refresh' => {
+                       'method' => 'POST',
+                       'url' => "session/[% session_id %]/refresh"
         },
         'executeScript' => {
                        'method' => 'POST',
-                       'url' => "session/[% session_id %]/[% context %]/execute"
+                       'url' => "session/[% session_id %]/execute"
+        },
+        'screenshot' => {
+                    'method' => 'GET',
+                    'url' => "session/[% session_id %]/screenshot"
+        },
+        'switchToFrame' => {
+                'method' => 'POST',
+                'url' => "session/[% session_id %]/frame"
+        },
+        'switchToWindow' => {
+             'method' => 'POST',
+             'url' => "session/[% session_id %]/window"
+        },
+        'getSpeed' => {
+                        'method' => 'GET',
+                        'url' => "session/[% session_id %]/speed"
+        },
+        'setSpeed' => {
+                        'method' => 'POST',
+                        'url' => "session/[% session_id %]/speed"
+        },
+        'getAllCookies' => {
+                        'method' => 'GET',
+                        'url' => "session/[% session_id %]/cookie"
+        },
+        'addCookie' => {
+                        'method' => 'POST',
+                        'url' => "session/[% session_id %]/cookie"
+        },
+        'deleteAllCookies' => {
+                        'method' => 'DELETE',
+                        'url' => "session/[% session_id %]/cookie"
+        },
+        'deleteCookieNamed' => {
+             'method' => 'DELETE',
+             'url' => "session/[% session_id %]/cookie/[% name %]"
+        },
+        'getPageSource' => {
+                        'method' => 'GET',
+                        'url' => "session/[% session_id %]/source"
+        },
+        'getTitle' => {
+                        'method' => 'GET',
+                        'url' => "session/[% session_id %]/title"
         },
         'findElement' => {
                        'method' => 'POST',
-                       'url' => "session/[% session_id %]/[% context %]/element"
+                       'url' => "session/[% session_id %]/element"
         },
         'findElements' => {
                       'method' => 'POST',
-                      'url' => "session/[% session_id %]/[% context %]/elements"
+                      'url' => "session/[% session_id %]/elements"
+        },
+        'getActiveElement' => {
+                'method' => 'POST',
+                'url' => "session/[% session_id %]/element/active"
+        },
+        'describeElement' => {
+                'method' => 'POST',
+                'url' => "session/[% session_id %]/element/[% id %]"
         },
         'findChildElement' => {
             'method' => 'POST',
-            'url' =>
-"session/[% session_id %]/[% context %]/element/[% id %]/element/[% using %]"
+            'url' => "session/[% session_id %]/element/[% id %]/element"
         },
         'findChildElements' => {
             'method' => 'POST',
-            'url' =>
-"session/[% session_id %]/[% context %]/element/[% id %]/elements/[% using %]"
-        },
-        'goForward' => {
-                       'method' => 'POST',
-                       'url' => "session/[% session_id %]/[% context %]/forward"
+            'url' => "session/[% session_id %]/element/[% id %]/elements"
         },
-        'get' => {
-                   'method' => 'POST',
-                   'url'    => "session/[% session_id %]/[% context %]/url"
+        'clickElement' => {
+               'method' => 'POST',
+               'url' => "session/[% session_id %]/element/[% id %]/click"
         },
-        'getActiveElement' => {
-                'method' => 'POST',
-                'url' => "session/[% session_id %]/[% context %]/element/active"
+        'submitElement' => {
+              'method' => 'POST',
+              'url' => "session/[% session_id %]/element/[% id %]/submit"
         },
-        'getAllCookies' => {
-                        'method' => 'GET',
-                        'url' => "session/[% session_id %]/[% context %]/cookie"
+        'getElementValue' => {
+               'method' => 'GET',
+               'url' => "session/[% session_id %]/element/[% id %]/value"
         },
-        'getCurrentWindowHandle' => {
-                 'method' => 'GET',
-                 'url' => "session/[% session_id %]/[% context %]/window_handle"
+        'sendKeysToElement' => {
+               'method' => 'POST',
+               'url' => "session/[% session_id %]/element/[% id %]/value"
         },
-        'getElementAttribute' => {
+        'isElementSelected' => {
             'method' => 'GET',
-            'url' =>
-"session/[% session_id %]/[% context %]/element/[% id %]/attribute/[% name %]"
+            'url' => "session/[% session_id %]/element/[% id %]/selected"
         },
-        'getElementLocation' => {
-            'method' => 'GET',
-            'url' =>
-              "session/[% session_id %]/[% context %]/element/[% id %]/location"
+        'setElementSelected' => {
+            'method' => 'POST',
+            'url' => "session/[% session_id %]/element/[% id %]/selected"
         },
-        'getElementSize' => {
-                'method' => 'GET',
-                'url' =>
-                  "session/[% session_id %]/[% context %]/element/[% id %]/size"
+        'toggleElement' => {
+              'method' => 'POST',
+              'url' => "session/[% session_id %]/element/[% id %]/toggle"
         },
-        'getElementText' => {
-                'method' => 'GET',
-                'url' =>
-                  "session/[% session_id %]/[% context %]/element/[% id %]/text"
+        'isElementEnabled' => {
+             'method' => 'GET',
+             'url' => "session/[% session_id %]/element/[% id %]/enabled"
         },
-        'getElementValue' => {
-               'method' => 'GET',
-               'url' =>
-                 "session/[% session_id %]/[% context %]/element/[% id %]/value"
+        'getElementLocation' => {
+            'method' => 'GET',
+            'url' => "session/[% session_id %]/element/[% id %]/location"
         },
-        'getSpeed' => {
-                        'method' => 'GET',
-                        'url' => "session/[% session_id %]/[% context %]/speed"
+        'getElementLocationInView' => {
+            'method' => 'GET',
+            'url' => "session/[% session_id %]/element/[% id %]/location_in_view"
         },
         'getElementTagName' => {
                 'method' => 'GET',
-                'url' =>
-                  "session/[% session_id %]/[% context %]/element/[% id %]/name"
+                'url' => "session/[% session_id %]/element/[% id %]/name"
         },
-        'getTitle' => {
-                        'method' => 'GET',
-                        'url' => "session/[% session_id %]/[% context %]/title"
+        'clearElement' => {
+               'method' => 'POST',
+               'url' => "session/[% session_id %]/element/[% id %]/clear"
         },
-        'getElementValueOfCssProperty' => {
+        'getElementAttribute' => {
             'method' => 'GET',
             'url' =>
-"session/[% session_id %]/[% context %]/element/[% id %]/css/[% property_name %]"
-        },
-        'getVisible' => {
-                       'method' => 'GET',
-                       'url' => "session/[% session_id %]/[% context %]/visible"
-        },
-        'getWindowHandles' => {
-                'method' => 'GET',
-                'url' => "session/[% session_id %]/[% context %]/window_handles"
+"session/[% session_id %]/element/[% id %]/attribute/[% name %]"
         },
-        'hoverOverElement' => {
-               'method' => 'POST',
-               'url' =>
-                 "session/[% session_id %]/[% context %]/element/[% id %]/hover"
+        'elementEquals' => {
+            'method' => 'GET',
+            'url' => "session/[% session_id %]/element/[% id %]/equals/[% other %]"
         },
         'isElementDisplayed' => {
             'method' => 'GET',
-            'url' =>
-"session/[% session_id %]/[% context %]/element/[% id %]/displayed"
-        },
-        'isElementEnabled' => {
-             'method' => 'GET',
-             'url' =>
-               "session/[% session_id %]/[% context %]/element/[% id %]/enabled"
+            'url' => "session/[% session_id %]/element/[% id %]/displayed"
         },
-        'isElementSelected' => {
-            'method' => 'GET',
-            'url' =>
-              "session/[% session_id %]/[% context %]/element/[% id %]/selected"
+        'close' => {
+                     'method' => 'DELETE',
+                     'url'    => "session/[% session_id %]/window"
         },
-        'newSession' => {
-                          'method' => 'POST',
-                          'url'    => 'session'
+        'dragElement' => {
+                'method' => 'POST',
+                'url' => "session/[% session_id %]/element/[% id %]/drag"
         },
-        'getPageSource' => {
-                        'method' => 'GET',
-                        'url' => "session/[% session_id %]/[% context %]/source"
+        'getElementSize' => {
+                'method' => 'GET',
+                'url' => "session/[% session_id %]/element/[% id %]/size"
         },
-        'quit' => {
-                    'method' => 'DELETE',
-                    'url'    => "session/[% session_id %]"
+        'getElementText' => {
+                'method' => 'GET',
+                'url' =>
+                  "session/[% session_id %]/element/[% id %]/text"
         },
-        'refresh' => {
-                       'method' => 'POST',
-                       'url' => "session/[% session_id %]/[% context %]/refresh"
+        'getElementValueOfCssProperty' => {
+            'method' => 'GET',
+            'url' =>
+"session/[% session_id %]/element/[% id %]/css/[% property_name %]"
         },
-        'screenshot' => {
-                    'method' => 'GET',
-                    'url' => "session/[% session_id %]/[% context %]/screenshot"
+        'getVisible' => {
+                       'method' => 'GET',
+                       'url' => "session/[% session_id %]/visible"
         },
-        'sendKeysToElement' => {
+        'hoverOverElement' => {
                'method' => 'POST',
                'url' =>
-                 "session/[% session_id %]/[% context %]/element/[% id %]/value"
-        },
-        'setElementSelected' => {
-            'method' => 'POST',
-            'url' =>
-              "session/[% session_id %]/[% context %]/element/[% id %]/selected"
-        },
-        'setSpeed' => {
-                        'method' => 'POST',
-                        'url' => "session/[% session_id %]/[% context %]/speed"
+                 "session/[% session_id %]/element/[% id %]/hover"
         },
         'setVisible' => {
                        'method' => 'POST',
-                       'url' => "session/[% session_id %]/[% context %]/visible"
-        },
-        'submitElement' => {
-              'method' => 'POST',
-              'url' =>
-                "session/[% session_id %]/[% context %]/element/[% id %]/submit"
-        },
-        'switchToFrame' => {
-                'method' => 'POST',
-                'url' => "session/[% session_id %]/[% context %]/frame/[% id %]"
-        },
-        'switchToWindow' => {
-             'method' => 'POST',
-             'url' => "session/[% session_id %]/[% context %]/window/[% name %]"
-        },
-        'toggleElement' => {
-              'method' => 'POST',
-              'url' =>
-                "session/[% session_id %]/[% context %]/element/[% id %]/toggle"
+                       'url' => "session/[% session_id %]/visible"
         },
     };
 
@@ -237,10 +234,9 @@ sub getParams {
 
     # TT does lexical template replacement, so we need exact name of the vars.
     my $session_id = $args->{'session_id'};
-    my $context = (defined $args->{'context'}) ? $args->{'context'} : 'context';
     my $id      = $args->{'id'};
     my $name    = $args->{'name'};
-    my $using   = $args->{'using'};
+    my $property_name = $args->{'property_name'};
 
     $data->{'method'} = $self->{$command}->{'method'};
     $data->{'url'}    = tt $self->{$command}->{'url'};

+ 96 - 11
lib/Selenium/Remote/Driver.pm

@@ -2,11 +2,13 @@ package Selenium::Remote::Driver;
 
 use strict;
 use warnings;
+use Data::Dumper;
 
 use Carp qw(croak);
 
 use Selenium::Remote::RemoteConnection;
 use Selenium::Remote::Commands;
+use Selenium::Remote::ErrorHandler;
 
 =head1 NAME
 
@@ -58,10 +60,12 @@ sub new {
           version            => delete $args{version}            || '',
           session_id         => undef,
           remote_conn        => undef,
+          error_handler      => undef,
           commands           => $commands,
     };
     bless $self, $class or die "Can't bless $class: $!";
-
+    
+    $self->{error_handler} = new Selenium::Remote::ErrorHandler;
     # Connect to remote server & establish a new session
     $self->{remote_conn} =
       new Selenium::Remote::RemoteConnection($self->{remote_server_addr},
@@ -77,26 +81,31 @@ sub new {
 
 # When a command is processed by the remote server & a result is sent back, it
 # also includes other relevant info. We strip those & just return the value we're
-# interested in.
+# interested in. And if there is an error, ErrorHandler will handle it.
 sub _get_command_result {
     my ($self, @args) = @_;
     my $resp = $self->{remote_conn}->request(@args);
-    if (defined $resp->{'value'}) {
+    if (defined $resp->{'status'} && $resp->{'status'} != 0) {
+        $self->{error_handler}->process_error($resp);
+    }
+    elsif (defined $resp->{'value'}) {
         return $resp->{'value'};
     }
     else {
-        return;
+        # If there is no value or status assume success
+        return 1;
     }
 }
 
 sub new_session {
     my $self = shift;
-    my $args = {
-                 'browserName'       => $self->{browser_name},
-                 'platform'          => $self->{platform},
-                 'javascriptEnabled' => $self->{javascript},
-                 'version'           => $self->{version},
-    };
+    my $args = { 'desiredCapabilities' => {
+                                            'browserName'       => $self->{browser_name},
+                                            'platform'          => $self->{platform},
+                                            'javascriptEnabled' => $self->{javascript},
+                                            'version'           => $self->{version},
+                                          }
+                };
     my $resp =
       $self->{remote_conn}->request(
                                   $self->{commands}->{'newSession'}->{'method'},
@@ -106,6 +115,23 @@ sub new_session {
     if ((defined $resp->{'sessionId'}) && $resp->{'sessionId'} ne '') {
         $self->{session_id} = $resp->{'sessionId'};
     }
+    else {
+        croak "Could not create new session";
+    }
+}
+
+sub get_capabilities {
+    my $self = shift;
+    my $command = 'getCapabilities';
+    my $args = { 'session_id' => $self->{'session_id'}, };
+    my $data = $self->{commands}->getParams($command, $args);
+    
+    if ($data) {
+        return $self->_get_command_result($data->{'method'}, $data->{'url'});
+    }
+    else {
+        croak "Couldn't retrieve command $command settings\n";
+    }
 }
 
 sub quit {
@@ -122,6 +148,48 @@ sub quit {
     }
 }
 
+sub get_current_window_handle {
+    my $self = shift;
+    my $command = 'getCurrentWindowHandle';
+    my $args = { 'session_id' => $self->{'session_id'}, };
+    my $data = $self->{commands}->getParams($command, $args);
+    
+    if ($data) {
+        return $self->_get_command_result($data->{'method'}, $data->{'url'});
+    }
+    else {
+        croak "Couldn't retrieve command $command settings\n";
+    }
+}
+
+sub get_window_handles {
+    my $self = shift;
+    my $command = 'getWindowHandles';
+    my $args = { 'session_id' => $self->{'session_id'}, };
+    my $data = $self->{commands}->getParams($command, $args);
+    
+    if ($data) {
+        return $self->_get_command_result($data->{'method'}, $data->{'url'});
+    }
+    else {
+        croak "Couldn't retrieve command $command settings\n";
+    }
+}
+
+sub get_current_url {
+    my $self = shift;
+    my $command = 'getCurrentUrl';
+    my $args = { 'session_id' => $self->{'session_id'}, };
+    my $data = $self->{commands}->getParams($command, $args);
+    
+    if ($data) {
+        return $self->_get_command_result($data->{'method'}, $data->{'url'});
+    }
+    else {
+        croak "Couldn't retrieve command $command settings\n";
+    }
+}
+
 sub navigate {
     my ($self, $url) = @_;
     $self->get($url);
@@ -132,9 +200,10 @@ sub get {
     my $command = 'get';
     my $args    = { 'session_id' => $self->{'session_id'}, };
     my $data    = $self->{commands}->getParams($command, $args);
+    my $params = {'url' => $url};
 
     if ($data) {
-        $self->{remote_conn}->request($data->{'method'}, $data->{'url'}, $url);
+        $self->{remote_conn}->request($data->{'method'}, $data->{'url'}, $params);
     }
     else {
         croak "Couldn't retrieve command $command settings\n";
@@ -183,6 +252,22 @@ sub go_forward {
     }
 }
 
+sub refresh {
+    my $self    = shift;
+    my $command = 'goForward';
+    my $args    = { 'session_id' => $self->{'session_id'}, };
+    my $data    = $self->{commands}->getParams($command, $args);
+
+    if ($data) {
+        $self->{remote_conn}->request($data->{'method'}, $data->{'url'});
+    }
+    else {
+        croak "Couldn't retrieve command $command settings\n";
+    }
+}
+
+
+
 1;
 
 __END__

+ 80 - 0
lib/Selenium/Remote/ErrorHandler.pm

@@ -0,0 +1,80 @@
+package Selenium::Remote::ErrorHandler;
+
+use strict;
+use warnings;
+
+use Data::Dumper;
+use Carp qw(croak);
+
+# We're going to handle only codes that are errors.
+use constant STATUS_CODE => {
+                    7 => {
+                            'code' => 'NO_SUCH_ELEMENT',
+                            'msg'  => 'An element could not be located on the page using the given search parameters.',
+                         },
+                    8 => {
+                            'code' => 'NO_SUCH_FRAME',
+                            'msg'  => 'A request to switch to a frame could not be satisfied because the frame could not be found.',
+                         },
+                    9 => {
+                            'code' => 'UNKNOWN_COMMAND',
+                            'msg'  => 'The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.',
+                         },
+                    10 => {
+                            'code' => 'STALE_ELEMENT_REFERENCE',
+                            'msg'  => 'An element command failed because the referenced element is no longer attached to the DOM.',
+                         },
+                    11 => {
+                            'code' => 'ELEMENT_NOT_VISIBLE',
+                            'msg'  => 'An element command could not be completed because the element is not visible on the page.',
+                         },
+                    12 => {
+                            'code' => 'INVALID_ELEMENT_STATE',
+                            'msg'  => 'An element command could not be completed because the element is in an invalid state (e.g. attempting to click a disabled element).',
+                         },
+                    13 => {
+                            'code' => 'UNKNOWN_ERROR',
+                            'msg'  => 'An unknown server-side error occurred while processing the command.',
+                         },
+                    15 => {
+                            'code' => 'ELEMENT_IS_NOT_SELECTABLE',
+                            'msg'  => 'An attempt was made to select an element that cannot be selected.',
+                         },
+                    19 => {
+                            'code' => 'XPATH_LOOKUP_ERROR',
+                            'msg'  => 'An error occurred while searching for an element by XPath.',
+                         },
+                    23 => {
+                            'code' => 'NO_SUCH_WINDOW',
+                            'msg'  => 'A request to switch to a different window could not be satisfied because the window could not be found.',
+                         },
+                    24 => {
+                            'code' => 'INVALID_COOKIE_DOMAIN',
+                            'msg'  => 'An illegal attempt was made to set a cookie under a different domain than the current page.',
+                         },
+                    25 => {
+                            'code' => 'UNABLE_TO_SET_COOKIE',
+                            'msg'  => 'A request to set a cookie\'s value could not be satisfied.',
+                         },
+};
+
+sub new {
+    my ($class) = @_;
+    
+    my $self = {};
+    bless $self, $class or die "Can't bless $class: $!";
+    
+    return $self;
+}
+
+sub process_error {
+    my ($self, $resp) = @_;
+    
+    # TODO: Handle screen if it sent back with the response.
+    
+    croak "ERROR: ".$self->STATUS_CODE->{$resp->{'status'}}->{'code'}."\n".
+          "DETAIL: ".$self->STATUS_CODE->{$resp->{'status'}}->{'msg'}."\n".
+          "RESPONSE: ".Dumper($resp);
+}
+
+1;

+ 15 - 7
lib/Selenium/Remote/RemoteConnection.pm

@@ -6,9 +6,11 @@ use warnings;
 use LWP::UserAgent;
 use HTTP::Headers;
 use HTTP::Request;
+use Net::Ping;
 use Carp qw(croak);
 use JSON;
-#use Data::Dumper;
+use Error;
+use Data::Dumper;
 
 sub new {
     my ($class, $remote_srvr, $port) = @_;
@@ -19,7 +21,12 @@ sub new {
     };
     bless $self, $class or die "Can't bless $class: $!";
     
-    # Add extra code to ping the remote server to see if it is alive.
+    # Try connecting to the Selenium RC port
+    my $p = Net::Ping->new("tcp", 2);
+    $p->port_number($self->{'port'});
+    croak "Selenium RC server is not responding\n"
+            unless $p->ping($self->{'remote_server_addr'});
+    undef($p);
 
     return $self;
 }
@@ -41,11 +48,10 @@ sub request {
           . "/wd/hub/$url";
     }
 
-    #print "Full URL: $fullurl\n";
-
     if ((defined $params) && $params ne '') {
         my $json = new JSON;
-        $content = "[" . $json->allow_nonref->utf8->encode($params) . "]";
+        #$content = "[" . $json->allow_nonref->utf8->encode($params) . "]";
+        $content = $json->allow_nonref->utf8->encode($params);
     }
 
     # HTTP request
@@ -54,6 +60,8 @@ sub request {
       HTTP::Headers->new(Content_Type => 'application/json; charset=utf-8');
     $header->header('Accept' => 'application/json');
     my $request = HTTP::Request->new($method, $fullurl, $header, $content);
+    
+    #print Dumper($request);
     my $response = $ua->request($request);
 
     #return $response;
@@ -62,14 +70,14 @@ sub request {
 
 sub _process_response {
     my ($self, $response) = @_;
-    my $data = "";    #returned data from server
+    my $data;    #returned data from server
 
     if ($response->is_redirect) {
         return $self->request('GET', $response->header('location'));
     }
     elsif (($response->is_success) && ($response->code == 200)) {
         $data = from_json($response->content);
-        if ($data->{'error'} eq 'true') {
+        if ($data->{'status'} != 0) {
             croak "Error occurred in server while processing request: $data";
         }
         return $data;