Updated RestAPI commands

This commit is contained in:
jvelilla
2013-04-15 16:16:16 -03:00
parent 1daab0598a
commit c63e307179
11 changed files with 2183 additions and 121 deletions

View File

@@ -7,36 +7,45 @@ note
class class
COMMAND_EXECUTOR COMMAND_EXECUTOR
inherit inherit
JSON_HELPER JSON_HELPER
SE_JSON_WIRE_PROTOCOL_COMMANDS SE_JSON_WIRE_PROTOCOL_COMMANDS
-- TODO
-- clean and improve the code
-- handle response from the server in a smart way
create create
make make
feature -- Initialization feature -- Initialization
make (a_host : STRING_32)
make (a_host: STRING_32)
local
h: LIBCURL_HTTP_CLIENT
do do
host := a_host host := a_host
create h.make
http_session := h.new_session (a_host)
-- http_session.set_is_debug (True)
-- http_session.set_proxy ("127.0.0.1", 8888)
end end
feature -- Status Report feature -- Status Report
is_available : BOOLEAN
-- Is the Seleniun server up and running? is_available: BOOLEAN
local -- Is the Seleniun server up and running?
resp: HTTP_CLIENT_RESPONSE
do do
-- resp := execute_get (cmd_ping) Result := http_session.is_available
-- if resp.status = 200 then
-- Result := True
-- end
Result := true
end end
feature -- Commands feature -- Commands
status : SE_RESPONSE status: SE_RESPONSE
require require
selinum_server_available : is_available selinum_server_available: is_available
local local
resp: HTTP_CLIENT_RESPONSE resp: HTTP_CLIENT_RESPONSE
do do
@@ -47,57 +56,358 @@ feature -- Commands
end end
end end
new_session (capabilities : STRING_32) : SE_RESPONSE new_session (capabilities: STRING_32): SE_RESPONSE
require require
selinum_server_available : is_available selinum_server_available: is_available
local local
resp: HTTP_CLIENT_RESPONSE resp: HTTP_CLIENT_RESPONSE
do do
create Result.make_empty create Result.make_empty
resp := execute_post (cmd_new_session, capabilities) resp := execute_post (cmd_new_session, capabilities)
if attached resp.body as l_body then if attached resp.header ("Location") as l_location then
Result := build_response(l_body) resp := http_new_session (l_location).get ("", context_executor)
if attached resp.body as l_body then
Result := build_response (l_body)
end
end end
end end
sessions : SE_RESPONSE sessions: SE_RESPONSE
require require
selinum_server_available : is_available selinum_server_available: is_available
local local
resp: HTTP_CLIENT_RESPONSE resp: HTTP_CLIENT_RESPONSE
do do
create Result.make_empty create Result.make_empty
resp := execute_get (cmd_sessions) resp := execute_get (cmd_sessions)
if attached resp.body as l_body then if attached resp.body as l_body then
Result := build_response(l_body) Result := build_response (l_body)
end end
end end
retrieve_session (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_by_id (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
delete_session (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_delete (cmd_session_by_id (cmd_session_by_id (session_id)))
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
set_session_timeouts (a_session_id: STRING_32; a_data_timeout: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_timeouts (a_session_id), a_data_timeout)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
set_session_timeouts_async_script (a_session_id: STRING_32; a_data_timeout: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_timeouts_async_script (a_session_id), a_data_timeout)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
set_session_timeouts_implicit_wait (a_session_id: STRING_32; a_data_timeout: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_timeouts_implicit_wait (a_session_id), a_data_timeout)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
retrieve_window_handle (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_window_handle (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
retrieve_window_handles (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_window_handles (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
retrieve_url (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_url (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
navigate_to_url (a_session_id: STRING_32; a_url: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_url (a_session_id), a_url)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
forward (a_session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_forward (a_session_id), Void)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
back (a_session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_back (a_session_id), Void)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
refresh (a_session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_refresh (a_session_id), Void)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
execute
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
-- TODO
end
execute_async
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
-- TODO
end
screenshot (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_screenshot (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
ime_available_engines (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_ime_available (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
ime_active_engine (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_ime_active_engine (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
ime_activated (session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_get (cmd_session_ime_activated (session_id))
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
ime_deactivate (a_session_id: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_ime_deactivate (a_session_id), Void)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
ime_activate (a_session_id: STRING_32; an_engine: STRING_32): SE_RESPONSE
require
selinum_server_available: is_available
local
resp: HTTP_CLIENT_RESPONSE
do
create Result.make_empty
resp := execute_post (cmd_session_ime_activate (a_session_id), an_engine)
if resp.status = 204 then
Result.set_status (0)
Result.set_session_id (a_session_id)
else
if attached resp.body as l_body then
Result := build_response (l_body)
end
end
end
feature {NONE} -- Implementation feature {NONE} -- Implementation
execute_get (command_name:STRING_32) : HTTP_CLIENT_RESPONSE
local execute_get (command_name: STRING_32): HTTP_CLIENT_RESPONSE
h: LIBCURL_HTTP_CLIENT
http_session : HTTP_CLIENT_SESSION
do do
create h.make
http_session := h.new_session (host)
Result := http_session.get (command_name, context_executor) Result := http_session.get (command_name, context_executor)
end end
execute_post (command_name:STRING_32; data: STRING_32) : HTTP_CLIENT_RESPONSE execute_post (command_name: STRING_32; data: detachable READABLE_STRING_8): HTTP_CLIENT_RESPONSE
local
h: LIBCURL_HTTP_CLIENT
http_session : HTTP_CLIENT_SESSION
do do
create h.make
http_session := h.new_session (host)
Result := http_session.post (command_name, context_executor, data) Result := http_session.post (command_name, context_executor, data)
end end
execute_delete (command_name: STRING_32): HTTP_CLIENT_RESPONSE
do
Result := http_session.delete (command_name, context_executor)
end
build_response (a_message : STRING_32) : SE_RESPONSE build_response (a_message: STRING_32): SE_RESPONSE
do do
create Result.make_empty create Result.make_empty
initialize_converters (json) initialize_converters (json)
@@ -107,14 +417,26 @@ feature {NONE} -- Implementation
Result.set_json_response (a_message) Result.set_json_response (a_message)
end end
context_executor: HTTP_CLIENT_REQUEST_CONTEXT
context_executor : HTTP_CLIENT_REQUEST_CONTEXT -- request context for each request
-- request context for each request do
once
create Result.make create Result.make
Result.headers.put ("application/json;charset=UTF-8", "Content-Type") Result.headers.put ("application/json;charset=UTF-8", "Content-Type")
Result.headers.put ("application/json;charset=UTF-8", "Accept") Result.headers.put ("application/json;charset=UTF-8", "Accept")
end end
host : STRING_32 host: STRING_32
http_session: HTTP_CLIENT_SESSION
http_new_session (url: STRING_32): HTTP_CLIENT_SESSION
local
h: LIBCURL_HTTP_CLIENT
do
create h.make
Result := h.new_session (url)
-- Result.set_is_debug (True)
-- Result.set_proxy ("127.0.0.1", 8888)
end
end end

View File

@@ -29,8 +29,8 @@ feature -- Conversion
from_json (j: like to_json): detachable like object from_json (j: like to_json): detachable like object
do do
create Result create Result
if attached {INTEGER_8} json_to_object (j.item (status_key), Void) as l_ucs then if attached {INTEGER_32} json_to_object (j.item (status_key), Void) as l_ucs then
Result.set_status (l_ucs.out) Result.set_status (l_ucs)
end end
if attached {STRING_32} json_to_object (j.item (session_id_key), Void) as l_ucs then if attached {STRING_32} json_to_object (j.item (session_id_key), Void) as l_ucs then
Result.set_session_id (l_ucs) Result.set_session_id (l_ucs)

View File

@@ -27,7 +27,7 @@ feature -- Access
do do
initialize_converters (json) initialize_converters (json)
create parser.make_parser (str) create parser.make_parser (str)
if attached parser.parse_object as st and parser.is_parsed then if attached parser.parse as st and parser.is_parsed then
Result := st Result := st
end end
end end
@@ -68,5 +68,6 @@ feature -- Access
j.add_converter (create {SE_STATUS_VALUE_JSON_CONVERTER}.make) j.add_converter (create {SE_STATUS_VALUE_JSON_CONVERTER}.make)
j.add_converter (create {SE_CAPABILITIES_JSON_CONVERTER}.make) j.add_converter (create {SE_CAPABILITIES_JSON_CONVERTER}.make)
j.add_converter (create {SE_RESPONSE_JSON_CONVERTER}.make) j.add_converter (create {SE_RESPONSE_JSON_CONVERTER}.make)
j.add_converter (create {SE_TIMEOUT_TYPE_JSON_CONVERTER}.make)
end end
end end

File diff suppressed because it is too large Load Diff

View File

@@ -19,25 +19,148 @@ feature
--POST /session Create a new session. --POST /session Create a new session.
cmd_sessions : STRING = "sessions" cmd_sessions : STRING = "sessions"
--GET /sessions Returns a list of the currently active sessions. --GET /sessions Returns a list of the currently active sessions.
--GET /session/:sessionId Retrieve the capabilities of the specified session.
--DELETE /session/:sessionId Delete the session. cmd_session_by_id_tmpl : STRING ="session/$id"
--POST /session/:sessionId/timeouts Configure the amount of time that a particular type of operation can execute for before they are aborted and a |Timeout| error is returned to the client.
--POST /session/:sessionId/timeouts/async_script Set the amount of time, in milliseconds, that asynchronous scripts executed by /session/:sessionId/execute_async are permitted to run before they are aborted and a |Timeout| error is returned to the client. cmd_session_by_id (id: STRING_32): STRING_32
--POST /session/:sessionId/timeouts/implicit_wait Set the amount of time the driver should wait when searching for elements. do
--GET /session/:sessionId/window_handle Retrieve the current window handle. create Result.make_from_string (cmd_session_by_id_tmpl)
--GET /session/:sessionId/window_handles Retrieve the list of all window handles available to the session. Result.replace_substring_all ("$id", id)
--GET /session/:sessionId/url Retrieve the URL of the current page. end
--POST /session/:sessionId/url Navigate to a new URL.
--POST /session/:sessionId/forward Navigate forwards in the browser history, if possible.
--POST /session/:sessionId/back Navigate backwards in the browser history, if possible. cmd_session_timeouts_tmpl : STRING ="session/$id/timeouts"
--POST /session/:sessionId/refresh Refresh the current page.
cmd_session_timeouts (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_timeouts_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_timeouts_async_script_tmpl : STRING ="session/$id/timeouts/async_script"
cmd_session_timeouts_async_script (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_timeouts_async_script_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_timeouts_implicit_wait_tmpl : STRING ="/session/$id/timeouts/implicit_wait"
cmd_session_timeouts_implicit_wait (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_timeouts_implicit_wait_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_window_handle_tmpl : STRING ="/session/$id/window_handle"
cmd_session_window_handle (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_window_handle_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_window_handles_tmpl : STRING ="/session/$id/window_handles"
cmd_session_window_handles (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_window_handles_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_url_tmpl : STRING ="/session/$id/url"
cmd_session_url (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_url_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_forward_tmpl : STRING ="/session/$id/forward"
cmd_session_forward (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_forward_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_back_tmpl : STRING ="/session/$id/back"
cmd_session_back (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_back_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_refresh_tmpl : STRING ="/session/$id/refresh"
cmd_session_refresh (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_refresh_tmpl)
Result.replace_substring_all ("$id", id)
end
--POST /session/:sessionId/execute Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame. --POST /session/:sessionId/execute Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame.
--POST /session/:sessionId/execute_async Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame. --POST /session/:sessionId/execute_async Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame.
--GET /session/:sessionId/screenshot Take a screenshot of the current page.
--GET /session/:sessionId/ime/available_engines List all available engines on the machine.
--GET /session/:sessionId/ime/active_engine Get the name of the active IME engine. cmd_session_screenshot_tmpl : STRING ="/session/$id/screenshot"
--GET /session/:sessionId/ime/activated Indicates whether IME input is active at the moment (not if it's available.
--POST /session/:sessionId/ime/deactivate De-activates the currently-active IME engine. cmd_session_screenshot (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_screenshot_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_ime_available_engines_tmpl : STRING ="/session/$id/ime/available_engines"
cmd_session_ime_available (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_ime_available_engines_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_ime_active_engine_tmpl : STRING ="/session/$id/ime/active_engine"
cmd_session_ime_active_engine (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_ime_active_engine_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_ime_activated_tmpl : STRING ="/session/$id/ime/activated"
cmd_session_ime_activated (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_ime_activated_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_ime_deactivate_tmpl : STRING ="/session/$id/ime/deactivate"
cmd_session_ime_deactivate (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_ime_deactivate_tmpl)
Result.replace_substring_all ("$id", id)
end
cmd_session_ime_activate_tmpl : STRING ="/session/$id/ime/activate"
cmd_session_ime_activate (id: STRING_32): STRING_32
do
create Result.make_from_string (cmd_session_ime_activate_tmpl)
Result.replace_substring_all ("$id", id)
end
--POST /session/:sessionId/ime/activate Make an engines that is available (appears on the listreturned by getAvailableEngines) active. --POST /session/:sessionId/ime/activate Make an engines that is available (appears on the listreturned by getAvailableEngines) active.
--POST /session/:sessionId/frame Change focus to another frame on the page. --POST /session/:sessionId/frame Change focus to another frame on the page.
--POST /session/:sessionId/window Change focus to another window. --POST /session/:sessionId/window Change focus to another window.

View File

@@ -14,7 +14,7 @@ inherit
end end
feature -- Access feature -- Access
status: detachable STRING_32 status: INTEGER_32
session_id: detachable STRING_32 session_id: detachable STRING_32
state: detachable STRING_32 state: detachable STRING_32
class_name: detachable STRING_32 class_name: detachable STRING_32
@@ -22,7 +22,7 @@ feature -- Access
hash_code: detachable STRING_32 hash_code: detachable STRING_32
feature -- Change Element feature -- Change Element
set_status (a_status : STRING_32) set_status (a_status : INTEGER_32)
do do
status := a_status status := a_status
end end
@@ -55,12 +55,11 @@ feature -- Change Element
out : STRING out : STRING
do do
create Result.make_from_string ("Response : ") create Result.make_from_string ("Response : ")
if attached status as l_satus then Result.append ("[Status:")
Result.append ("[Status:") Result.append (status.out)
Result.append (l_satus.out) Result.append ("]")
Result.append ("]") Result.append (" ")
Result.append (" ")
end
if attached session_id as l_session_id then if attached session_id as l_session_id then
Result.append ("[SessionId:") Result.append ("[SessionId:")
Result.append (l_session_id.out) Result.append (l_session_id.out)

View File

@@ -21,4 +21,13 @@ feature -- Access
code : INTEGER_32 code : INTEGER_32
summary : STRING_32 summary : STRING_32
detail : STRING_32 detail : STRING_32
feature -- Report
full_message : STRING_32
-- Full error description
do
create Result.make_empty
Result.append ("code : " + code.out + " - summary:" + summary + " - detail:" + detail)
end
end end

View File

@@ -0,0 +1,45 @@
note
description: "Summary description for {SE_TIMEOUT_TYPE}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
SE_TIMEOUT_TYPE
create
make,
make_empty
feature -- Initialization
make (a_type : STRING_32; a_ms : INTEGER_32)
do
set_type (a_type)
set_ms (a_ms)
end
make_empty
do
end
feature -- Access
type : detachable STRING_32
-- The type of operation to set the timeout for.
-- Valid values are: "script" for script timeouts,
-- "implicit" for modifying the implicit wait timeout and
-- "page load" for setting a page load timeout.
ms : INTEGER_32
-- The amount of time, in milliseconds, that time-limited commands are permitted to run.
feature -- Change Element
set_type (a_type : STRING_32)
do
type := a_type
end
set_ms (a_ms : INTEGER_32)
do
ms := a_ms
end
end

View File

@@ -6,5 +6,21 @@ note
class class
WEB_ELEMENT WEB_ELEMENT
create
make
feature
make
do
end
feature -- Access
element : detachable STRING_32
--The opaque ID assigned to the element by the server.
--This ID should be used in all subsequent commands issued against the element.
feature -- Change Element
set_element (an_element : STRING)
do
element := an_element
end
end end

View File

@@ -24,13 +24,16 @@ feature {NONE} -- Initialization
if attached web_driver.status as l_status then if attached web_driver.status as l_status then
print (l_status) print (l_status)
-- retrieve sessions
if attached web_driver.sessions as l_session then
across l_session as item loop -- create a new session
print (item) create capabilities.make
end capabilities.set_browser_name ("chrome")
if attached web_driver.create_session_with_desired_capabilities (capabilities) as l_session then
print ("%NSessionId:" + l_session.session_id)
end end
-- create a new session -- create a new session
create capabilities.make create capabilities.make
capabilities.set_browser_name ("chrome") capabilities.set_browser_name ("chrome")
@@ -41,8 +44,8 @@ feature {NONE} -- Initialization
-- retrieve sessions -- retrieve sessions
if attached web_driver.sessions as l_session then if attached web_driver.sessions as l_session then
across l_session as item loop across l_session as l_item loop
print (item) print (l_item)
end end
end end

View File

@@ -0,0 +1,28 @@
test: system execution failed.
Following is the set of recorded exceptions:
-------------------------------------------------------------------------------
Class / Object Routine Nature of exception Effect
-------------------------------------------------------------------------------
JSON_PARSER make_parser @1 json_not_empty:
<00000000029AAD48> Precondition violated. Fail
-------------------------------------------------------------------------------
SE_JSON_WIRE_PROTOCOL
string_to_json @2
<00000000029705E8> (From JSON_HELPER) Routine failure. Fail
-------------------------------------------------------------------------------
SE_JSON_WIRE_PROTOCOL
build_session @1
<00000000029705E8> Routine failure. Fail
-------------------------------------------------------------------------------
SE_JSON_WIRE_PROTOCOL
create_session_with_desired_capabilities @5
<00000000029705E8> Routine failure. Fail
-------------------------------------------------------------------------------
APPLICATION make @6
<00000000029705A8> Routine failure. Fail
-------------------------------------------------------------------------------
APPLICATION root's creation
<00000000029705A8> Routine failure. Exit
-------------------------------------------------------------------------------