selenium-webdriver 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/common/src/rb/CHANGES +8 -0
- data/firefox/src/extension/components/nsCommandProcessor.js +4 -2
- data/firefox/src/extension/components/webdriverserver.js +1 -1
- data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +11 -1
- data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +5 -2
- data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +2 -11
- data/remote/client/src/rb/lib/selenium/webdriver/remote/http/common.rb +56 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/http/curb.rb +61 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/http/default.rb +42 -0
- data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +10 -12
- metadata +6 -5
- data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +0 -81
- data/remote/client/src/rb/lib/selenium/webdriver/remote/patron_http_client.rb +0 -58
data/common/src/rb/CHANGES
CHANGED
@@ -133,7 +133,7 @@ Response.prototype = {
|
|
133
133
|
set status(newStatus) { this.json_.status = newStatus; },
|
134
134
|
get status() { return this.json_.status; },
|
135
135
|
set value(val) { this.json_.value = val; },
|
136
|
-
get value() { return this.json_.value; }
|
136
|
+
get value() { return this.json_.value; }
|
137
137
|
};
|
138
138
|
|
139
139
|
|
@@ -540,7 +540,9 @@ nsCommandProcessor.prototype.getSessionCapabilities = function(response) {
|
|
540
540
|
'browserName': 'firefox',
|
541
541
|
'version': appInfo.version,
|
542
542
|
'javascriptEnabled': true,
|
543
|
-
'platform': xulRuntime.OS // same as Platform.valueOf("name");
|
543
|
+
'platform': xulRuntime.OS, // same as Platform.valueOf("name");
|
544
|
+
'cssSelectorsEnabled': true,
|
545
|
+
'takesScreenshot': true
|
544
546
|
};
|
545
547
|
response.send();
|
546
548
|
};
|
@@ -44,7 +44,7 @@ WebDriverServer.prototype.newDriver = function(window) {
|
|
44
44
|
var prefs =
|
45
45
|
Utils.getService("@mozilla.org/preferences-service;1", "nsIPrefBranch");
|
46
46
|
if (!prefs.prefHasUserValue("webdriver_enable_native_events")) {
|
47
|
-
Utils.dumpn('webdriver_enable_native_events not set; defaulting to
|
47
|
+
Utils.dumpn('webdriver_enable_native_events not set; defaulting to false');
|
48
48
|
}
|
49
49
|
this.enableNativeEvents =
|
50
50
|
prefs.prefHasUserValue("webdriver_enable_native_events") ?
|
@@ -13,12 +13,22 @@ module Selenium
|
|
13
13
|
opts.delete(:profile) || DEFAULT_PROFILE_NAME
|
14
14
|
)
|
15
15
|
|
16
|
+
http_client = opts.delete(:http_client)
|
17
|
+
|
16
18
|
unless opts.empty?
|
17
19
|
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
18
20
|
end
|
19
21
|
|
20
22
|
@launcher.launch
|
21
|
-
|
23
|
+
|
24
|
+
remote_opts = {
|
25
|
+
:url => @launcher.url,
|
26
|
+
:desired_capabilities => :firefox
|
27
|
+
}
|
28
|
+
|
29
|
+
remote_opts.merge!(:http_client => http_client) if http_client
|
30
|
+
|
31
|
+
super(remote_opts)
|
22
32
|
end
|
23
33
|
|
24
34
|
def browser
|
@@ -1,9 +1,12 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
1
3
|
require "selenium/webdriver/remote/capabilities"
|
2
|
-
require "selenium/webdriver/remote/default_http_client"
|
3
4
|
require "selenium/webdriver/remote/bridge"
|
4
5
|
require "selenium/webdriver/remote/server_error"
|
5
6
|
require "selenium/webdriver/remote/response"
|
6
7
|
require "selenium/webdriver/remote/commands"
|
8
|
+
require "selenium/webdriver/remote/http/common"
|
9
|
+
require "selenium/webdriver/remote/http/default"
|
7
10
|
|
8
11
|
module Selenium
|
9
12
|
module WebDriver
|
@@ -15,4 +18,4 @@ module Selenium
|
|
15
18
|
end
|
16
19
|
end
|
17
20
|
|
18
|
-
|
21
|
+
|
@@ -395,21 +395,12 @@ module Selenium
|
|
395
395
|
def default_options
|
396
396
|
{
|
397
397
|
:url => "http://localhost:4444/wd/hub",
|
398
|
-
|
399
|
-
:http_client => DefaultHttpClient,
|
398
|
+
:http_client => Http::Default,
|
400
399
|
:desired_capabilities => Capabilities.firefox
|
401
400
|
}
|
402
401
|
end
|
403
402
|
|
404
|
-
def http_client_class
|
405
|
-
require "selenium/webdriver/remote/patron_http_client"
|
406
|
-
PatronHttpClient
|
407
|
-
rescue LoadError
|
408
|
-
# patron not available
|
409
|
-
DefaultHttpClient
|
410
|
-
end
|
411
|
-
|
412
403
|
end # Bridge
|
413
404
|
end # Remote
|
414
405
|
end # WebDriver
|
415
|
-
end # Selenium
|
406
|
+
end # Selenium
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Remote
|
4
|
+
module Http
|
5
|
+
class Common
|
6
|
+
MAX_REDIRECTS = 20 # same as chromium/gecko
|
7
|
+
CONTENT_TYPE = "application/json"
|
8
|
+
DEFAULT_HEADERS = { "Accept" => CONTENT_TYPE, "Content-Length" => "0" }
|
9
|
+
|
10
|
+
def initialize(url)
|
11
|
+
@server_url = url
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(verb, url, command_hash)
|
15
|
+
url = @server_url.merge(url) unless url.kind_of?(URI)
|
16
|
+
headers = DEFAULT_HEADERS.dup
|
17
|
+
|
18
|
+
if command_hash
|
19
|
+
payload = command_hash.to_json
|
20
|
+
headers["Content-Type"] = "#{CONTENT_TYPE}; charset=utf-8"
|
21
|
+
headers["Content-Length"] = payload.bytesize.to_s if [:post, :put].include?(verb)
|
22
|
+
|
23
|
+
if $DEBUG
|
24
|
+
puts " >>> #{payload}"
|
25
|
+
puts " > #{headers.inspect}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
request verb, url, headers, payload
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def request(verb, url, headers, payload)
|
35
|
+
raise NotImplementedError, "subclass responsibility"
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_response(code, body, content_type)
|
39
|
+
code, body, content_type = code.to_i, body.to_s.strip, content_type.to_s
|
40
|
+
puts "<- #{body}\n" if $DEBUG
|
41
|
+
|
42
|
+
if content_type.include? CONTENT_TYPE
|
43
|
+
raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
|
44
|
+
Response.new(code, JSON.parse(body))
|
45
|
+
elsif code == 204
|
46
|
+
Response.new(code)
|
47
|
+
else
|
48
|
+
raise Error::WebDriverError, "unexpected content type: #{content_type.inspect} (#{code})\n#{body}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end # Common
|
53
|
+
end # Http
|
54
|
+
end # Remote
|
55
|
+
end # WebDriver
|
56
|
+
end # Selenium
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'curb'
|
2
|
+
|
3
|
+
module Selenium
|
4
|
+
module WebDriver
|
5
|
+
module Remote
|
6
|
+
module Http
|
7
|
+
|
8
|
+
#
|
9
|
+
# An alternative to the default Net::HTTP client.
|
10
|
+
#
|
11
|
+
# This can be used for the Firefox and Remote drivers if you have Curb
|
12
|
+
# installed.
|
13
|
+
#
|
14
|
+
# @example Using Curb
|
15
|
+
#
|
16
|
+
# include Selenium
|
17
|
+
#
|
18
|
+
# driver = WebDriver.for :firefox, :http_client => WebDriver::Remote::Http::Curb
|
19
|
+
#
|
20
|
+
|
21
|
+
class Curb < Common
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def request(verb, url, headers, payload)
|
26
|
+
client.url = url.to_s
|
27
|
+
client.headers = headers
|
28
|
+
|
29
|
+
case verb
|
30
|
+
when :get
|
31
|
+
client.http_get
|
32
|
+
when :post
|
33
|
+
client.post_body = payload || ""
|
34
|
+
client.http_post
|
35
|
+
when :put
|
36
|
+
client.put_data = payload || ""
|
37
|
+
client.http_put
|
38
|
+
when :delete
|
39
|
+
client.http_delete
|
40
|
+
else
|
41
|
+
raise Error::WebDriverError, "unknown HTTP verb: #{verb.inspect}"
|
42
|
+
end
|
43
|
+
|
44
|
+
create_response client.response_code, client.body_str, client.content_type
|
45
|
+
end
|
46
|
+
|
47
|
+
def client
|
48
|
+
@client ||= (
|
49
|
+
c = Curl::Easy.new
|
50
|
+
c.max_redirects = MAX_REDIRECTS
|
51
|
+
c.follow_location = true
|
52
|
+
|
53
|
+
c
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
end # Curb
|
58
|
+
end # Http
|
59
|
+
end # Remote
|
60
|
+
end # WebDriver
|
61
|
+
end # Selenium
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "net/http"
|
2
|
+
|
3
|
+
module Selenium
|
4
|
+
module WebDriver
|
5
|
+
module Remote
|
6
|
+
module Http
|
7
|
+
# @private
|
8
|
+
class Default < Common
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def http
|
13
|
+
# ignoring SSL for now
|
14
|
+
@http ||= Net::HTTP.new @server_url.host, @server_url.port
|
15
|
+
end
|
16
|
+
|
17
|
+
def request(verb, url, headers, payload, redirects = 0)
|
18
|
+
request = Net::HTTP.const_get(verb.to_s.capitalize).new(url.path, headers)
|
19
|
+
|
20
|
+
retried = false
|
21
|
+
begin
|
22
|
+
response = http.request(request, payload)
|
23
|
+
rescue Errno::ECONNABORTED, Errno::ECONNRESET
|
24
|
+
# this happens sometimes on windows?!
|
25
|
+
raise if retried
|
26
|
+
retried = true
|
27
|
+
retry
|
28
|
+
end
|
29
|
+
|
30
|
+
if response.kind_of? Net::HTTPRedirection
|
31
|
+
raise Error::WebDriverError, "too many redirects" if redirects >= MAX_REDIRECTS
|
32
|
+
request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
|
33
|
+
else
|
34
|
+
create_response response.code, response.body, response.content_type
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end # Default
|
39
|
+
end # Http
|
40
|
+
end # Remote
|
41
|
+
end # WebDriver
|
42
|
+
end # Selenium
|
@@ -5,28 +5,26 @@ module Selenium
|
|
5
5
|
# @private
|
6
6
|
class Response
|
7
7
|
|
8
|
-
|
9
|
-
attr_writer
|
8
|
+
attr_reader :code, :payload
|
9
|
+
attr_writer :payload
|
10
|
+
|
11
|
+
def initialize(code, payload = nil)
|
12
|
+
@code = code
|
13
|
+
@payload = payload || {}
|
10
14
|
|
11
|
-
def initialize
|
12
|
-
yield self if block_given?
|
13
15
|
assert_ok
|
14
16
|
end
|
15
17
|
|
16
18
|
def error
|
17
|
-
Error.for_code
|
19
|
+
Error.for_code @payload['status']
|
18
20
|
end
|
19
21
|
|
20
22
|
def error_message
|
21
|
-
payload['value']['message']
|
23
|
+
@payload['value']['message']
|
22
24
|
end
|
23
25
|
|
24
26
|
def [](key)
|
25
|
-
payload[key]
|
26
|
-
end
|
27
|
-
|
28
|
-
def payload
|
29
|
-
@payload ||= {}
|
27
|
+
@payload[key]
|
30
28
|
end
|
31
29
|
|
32
30
|
private
|
@@ -44,4 +42,4 @@ module Selenium
|
|
44
42
|
end # Response
|
45
43
|
end # Remote
|
46
44
|
end # WebDriver
|
47
|
-
end # Selenium
|
45
|
+
end # Selenium
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 21
|
9
|
+
version: 0.0.21
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jari Bakken
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-11 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -271,10 +271,11 @@ files:
|
|
271
271
|
- remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb
|
272
272
|
- remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb
|
273
273
|
- remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb
|
274
|
-
- remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb
|
275
|
-
- remote/client/src/rb/lib/selenium/webdriver/remote/patron_http_client.rb
|
276
274
|
- remote/client/src/rb/lib/selenium/webdriver/remote/response.rb
|
277
275
|
- remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb
|
276
|
+
- remote/client/src/rb/lib/selenium/webdriver/remote/http/common.rb
|
277
|
+
- remote/client/src/rb/lib/selenium/webdriver/remote/http/curb.rb
|
278
|
+
- remote/client/src/rb/lib/selenium/webdriver/remote/http/default.rb
|
278
279
|
has_rdoc: true
|
279
280
|
homepage: http://selenium.googlecode.com
|
280
281
|
licenses: []
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require "net/http"
|
2
|
-
|
3
|
-
module Selenium
|
4
|
-
module WebDriver
|
5
|
-
module Remote
|
6
|
-
|
7
|
-
# @private
|
8
|
-
class DefaultHttpClient
|
9
|
-
MAX_REDIRECTS = 20 # same as chromium/gecko
|
10
|
-
CONTENT_TYPE = "application/json"
|
11
|
-
DEFAULT_HEADERS = { "Accept" => CONTENT_TYPE, "Content-Length" => "0" }
|
12
|
-
|
13
|
-
def initialize(url)
|
14
|
-
@server_url = url
|
15
|
-
end
|
16
|
-
|
17
|
-
def call(verb, url, command_hash)
|
18
|
-
response = nil
|
19
|
-
url = @server_url.merge(url) unless url.kind_of?(URI)
|
20
|
-
headers = DEFAULT_HEADERS.dup
|
21
|
-
|
22
|
-
if command_hash
|
23
|
-
payload = command_hash.to_json
|
24
|
-
headers["Content-Type"] = "#{CONTENT_TYPE}; charset=utf-8"
|
25
|
-
headers["Content-Length"] = payload.bytesize.to_s if [:post, :put].include?(verb)
|
26
|
-
|
27
|
-
if $DEBUG
|
28
|
-
puts " >>> #{payload}"
|
29
|
-
puts " > #{headers.inspect}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
request verb, url, headers, payload
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def http
|
39
|
-
# ignoring SSL for now
|
40
|
-
@http ||= Net::HTTP.new @server_url.host, @server_url.port
|
41
|
-
end
|
42
|
-
|
43
|
-
def request(verb, url, headers, payload, redirects = 0)
|
44
|
-
request = Net::HTTP.const_get(verb.to_s.capitalize).new(url.path, headers)
|
45
|
-
|
46
|
-
retried = false
|
47
|
-
begin
|
48
|
-
response = http.request(request, payload)
|
49
|
-
rescue Errno::ECONNABORTED
|
50
|
-
# this happens sometimes on windows?!
|
51
|
-
raise if retried
|
52
|
-
retried = true
|
53
|
-
retry
|
54
|
-
end
|
55
|
-
|
56
|
-
if response.kind_of? Net::HTTPRedirection
|
57
|
-
raise Error::WebDriverError, "too many redirects" if redirects >= MAX_REDIRECTS
|
58
|
-
request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
|
59
|
-
else
|
60
|
-
create_response response
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def create_response(res)
|
65
|
-
puts "<- #{res.body}\n" if $DEBUG
|
66
|
-
if res.content_type == CONTENT_TYPE
|
67
|
-
Response.new do |r|
|
68
|
-
r.code = res.code.to_i
|
69
|
-
r.payload = JSON.parse(res.body.strip)
|
70
|
-
end
|
71
|
-
elsif res.code == '204'
|
72
|
-
Response.new { |r| r.code = res.code.to_i }
|
73
|
-
else
|
74
|
-
raise Error::WebDriverError, "unexpected content type: #{res.content_type.inspect} (#{res.code})\n#{res.body}"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
end # DefaultHttpClient
|
79
|
-
end # Remote
|
80
|
-
end # WebDriver
|
81
|
-
end # Selenium
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require "patron"
|
2
|
-
|
3
|
-
module Selenium
|
4
|
-
module WebDriver
|
5
|
-
module Remote
|
6
|
-
|
7
|
-
# @private
|
8
|
-
class PatronHttpClient
|
9
|
-
CONTENT_TYPE = "application/json"
|
10
|
-
DEFAULT_HEADERS = { "Accept" => CONTENT_TYPE, "Content-Length" => "0" }
|
11
|
-
|
12
|
-
def initialize(url)
|
13
|
-
@session = Patron::Session.new
|
14
|
-
@session.base_url = url
|
15
|
-
end
|
16
|
-
|
17
|
-
def call(verb, url, command_hash)
|
18
|
-
DEFAULT_HEADERS.each do |key, val|
|
19
|
-
@session.headers[key] = val
|
20
|
-
end
|
21
|
-
|
22
|
-
if command_hash
|
23
|
-
payload = command_hash.to_json
|
24
|
-
@session.headers['Content-Type'] = "#{CONTENT_TYPE}; charset=utf-8;"
|
25
|
-
@session.headers['Content-Length'] = payload.bytesize.to_s if [:post, :put].include?(verb)
|
26
|
-
if $DEBUG
|
27
|
-
puts " >>> #{payload}"
|
28
|
-
puts " > #{@session.headers.inspect}"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
if [:post, :put].include?(verb)
|
33
|
-
create_response @session.send(verb, url, payload || '')
|
34
|
-
else
|
35
|
-
create_response @session.send(verb, url)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def create_response(res)
|
42
|
-
puts "<- #{res.body}\n" if $DEBUG
|
43
|
-
if res.headers['Content-Type'].include? CONTENT_TYPE
|
44
|
-
Response.new do |r|
|
45
|
-
r.code = res.status.to_i
|
46
|
-
r.payload = JSON.parse(res.body.strip)
|
47
|
-
end
|
48
|
-
elsif res.status == '204'
|
49
|
-
Response.new { |r| r.code = res.code.to_i }
|
50
|
-
else
|
51
|
-
raise "Unexpected content type: #{res.headers.inspect} (#{res.status})\n#{res.body}"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
end # PatronHttpClient
|
56
|
-
end # Remote
|
57
|
-
end # WebDriver
|
58
|
-
end # Selenium
|