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.
@@ -1,3 +1,11 @@
1
+ 2010-06-11
2
+ ==========
3
+
4
+ * User can specify :http_client for the Firefox driver.
5
+ * Refactor HTTP client code
6
+ * Add Remote::Http::Curb as an alternative to the default (net/http) client.
7
+
8
+
1
9
  2010-06-03
2
10
  ==========
3
11
 
@@ -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 true');
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
- super :url => @launcher.url, :desired_capabilities => :firefox
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
- require "uri"
21
+
@@ -395,21 +395,12 @@ module Selenium
395
395
  def default_options
396
396
  {
397
397
  :url => "http://localhost:4444/wd/hub",
398
- # TODO(jari): enable Patron when http://github.com/toland/patron/issues/issue/13 is fixed
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
- attr_accessor :code
9
- attr_writer :payload
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(payload['status'])
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
- - 20
9
- version: 0.0.20
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-03 00:00:00 +02:00
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