Module: Async::WebDriver::RequestHelper

Included in:
Client, Element, Session
Defined in:
lib/async/webdriver/request_helper.rb

Overview

Wraps the HTTP client to provide a consistent interface.

Constant Summary collapse

ELEMENT_KEY =

The web element identifier is the string constant “element-6066-11e4-a52e-4f735466cecf”.

"element-6066-11e4-a52e-4f735466cecf"
CONTENT_TYPE =

The content type for requests and responses.

"application/json"
GET_HEADERS =

Headers to send with GET requests.

[
	["user-agent", "Async::WebDriver/#{VERSION}"],
	["accept", CONTENT_TYPE],
].freeze
POST_HEADERS =

Headers to send with POST requests.

GET_HEADERS + [
	["content-type", "#{CONTENT_TYPE}; charset=UTF-8"],
].freeze

Instance Method Summary collapse

Instance Method Details

#delete(path = nil) ⇒ Object

Make a DELETE request to the bridge and extract the value.



111
112
113
114
115
116
117
# File 'lib/async/webdriver/request_helper.rb', line 111

def delete(path = nil)
	Console.debug(self, "DELETE #{request_path(path)}")
	response = @delegate.delete(request_path(path), POST_HEADERS)
	reply = JSON.load(response.read, self.method(:unwrap_objects))
	
	return extract_value(reply)
end

#extract_value(reply) ⇒ Object

Extract the value from the reply.

If the value is a Hash and represents an error, then it will be raised as an appropriate subclass of Error.



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/async/webdriver/request_helper.rb', line 71

def extract_value(reply)
	value = reply["value"]
	
	if value.is_a?(Hash) and error = value["error"]
		raise ERROR_CODES.fetch(error, Error), value["message"]
	end
	
	if block_given?
		return yield(reply)
	else
		return value
	end
end

#get(path) ⇒ Object

Make a GET request to the bridge and extract the value.



88
89
90
91
92
93
94
# File 'lib/async/webdriver/request_helper.rb', line 88

def get(path)
	Console.debug(self, "GET #{request_path(path)}")
	response = @delegate.get(request_path(path), GET_HEADERS)
	reply = JSON.load(response.read, self.method(:unwrap_objects))
	
	return extract_value(reply)
end

#post(path, arguments = {}, &block) ⇒ Object

Make a POST request to the bridge and extract the value.



100
101
102
103
104
105
106
# File 'lib/async/webdriver/request_helper.rb', line 100

def post(path, arguments = {}, &block)
	Console.debug(self, "POST #{request_path(path)}", arguments: arguments)
	response = @delegate.post(request_path(path), POST_HEADERS, arguments ? JSON.dump(arguments) : nil)
	reply = JSON.load(response.read, self.method(:unwrap_objects))
	
	return extract_value(reply, &block)
end

#request_path(path = nil) ⇒ Object

The path used for making requests to the web driver bridge.



33
34
35
36
37
38
39
# File 'lib/async/webdriver/request_helper.rb', line 33

def request_path(path = nil)
	if path
		"/#{path}"
	else
		"/"
	end
end

#unwrap_object(value) ⇒ Object

Unwrap JSON objects into their corresponding Ruby objects.

If the value is a Hash and represents an element, then it will be unwrapped into an Element.



47
48
49
50
51
52
53
# File 'lib/async/webdriver/request_helper.rb', line 47

def unwrap_object(value)
	if value.is_a?(Hash) and value.key?(ELEMENT_KEY)
		Element.new(self.session, value[ELEMENT_KEY])
	else
		value
	end
end

#unwrap_objects(value) ⇒ Object

Used by ‘JSON.load` to unwrap objects.



56
57
58
59
60
61
62
63
# File 'lib/async/webdriver/request_helper.rb', line 56

def unwrap_objects(value)
	case value
	when Hash
		value.transform_values!(&method(:unwrap_object))
	when Array
		value.map!(&method(:unwrap_object))
	end
end