browserstack-webdriver 0.0.1

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.
Files changed (202) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +791 -0
  3. data/README.md +31 -0
  4. data/build.desc +334 -0
  5. data/lib/selenium-client.rb +2 -0
  6. data/lib/selenium-webdriver.rb +1 -0
  7. data/lib/selenium/client.rb +37 -0
  8. data/lib/selenium/client/base.rb +132 -0
  9. data/lib/selenium/client/driver.rb +10 -0
  10. data/lib/selenium/client/errors.rb +9 -0
  11. data/lib/selenium/client/extensions.rb +118 -0
  12. data/lib/selenium/client/idiomatic.rb +488 -0
  13. data/lib/selenium/client/javascript_expression_builder.rb +116 -0
  14. data/lib/selenium/client/javascript_frameworks/jquery.rb +13 -0
  15. data/lib/selenium/client/javascript_frameworks/prototype.rb +13 -0
  16. data/lib/selenium/client/legacy_driver.rb +1720 -0
  17. data/lib/selenium/client/protocol.rb +104 -0
  18. data/lib/selenium/client/selenium_helper.rb +34 -0
  19. data/lib/selenium/rake/server_task.rb +157 -0
  20. data/lib/selenium/server.rb +248 -0
  21. data/lib/selenium/webdriver.rb +71 -0
  22. data/lib/selenium/webdriver/android.rb +9 -0
  23. data/lib/selenium/webdriver/android/bridge.rb +47 -0
  24. data/lib/selenium/webdriver/chrome.rb +26 -0
  25. data/lib/selenium/webdriver/chrome/bridge.rb +120 -0
  26. data/lib/selenium/webdriver/chrome/profile.rb +90 -0
  27. data/lib/selenium/webdriver/chrome/service.rb +75 -0
  28. data/lib/selenium/webdriver/common.rb +44 -0
  29. data/lib/selenium/webdriver/common/action_builder.rb +352 -0
  30. data/lib/selenium/webdriver/common/alert.rb +30 -0
  31. data/lib/selenium/webdriver/common/bridge_helper.rb +67 -0
  32. data/lib/selenium/webdriver/common/core_ext/base64.rb +9 -0
  33. data/lib/selenium/webdriver/common/core_ext/dir.rb +42 -0
  34. data/lib/selenium/webdriver/common/core_ext/string.rb +5 -0
  35. data/lib/selenium/webdriver/common/driver.rb +301 -0
  36. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +17 -0
  37. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +39 -0
  38. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +25 -0
  39. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +13 -0
  40. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +22 -0
  41. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +19 -0
  42. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +22 -0
  43. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +45 -0
  44. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +43 -0
  45. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +46 -0
  46. data/lib/selenium/webdriver/common/element.rb +293 -0
  47. data/lib/selenium/webdriver/common/error.rb +207 -0
  48. data/lib/selenium/webdriver/common/file_reaper.rb +47 -0
  49. data/lib/selenium/webdriver/common/html5/local_storage.rb +42 -0
  50. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  51. data/lib/selenium/webdriver/common/html5/session_storage.rb +44 -0
  52. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +42 -0
  53. data/lib/selenium/webdriver/common/json_helper.rb +34 -0
  54. data/lib/selenium/webdriver/common/keyboard.rb +55 -0
  55. data/lib/selenium/webdriver/common/keys.rb +109 -0
  56. data/lib/selenium/webdriver/common/log_entry.rb +29 -0
  57. data/lib/selenium/webdriver/common/logs.rb +23 -0
  58. data/lib/selenium/webdriver/common/mouse.rb +72 -0
  59. data/lib/selenium/webdriver/common/navigation.rb +43 -0
  60. data/lib/selenium/webdriver/common/options.rb +136 -0
  61. data/lib/selenium/webdriver/common/platform.rb +218 -0
  62. data/lib/selenium/webdriver/common/port_prober.rb +42 -0
  63. data/lib/selenium/webdriver/common/profile_helper.rb +67 -0
  64. data/lib/selenium/webdriver/common/proxy.rb +149 -0
  65. data/lib/selenium/webdriver/common/search_context.rb +92 -0
  66. data/lib/selenium/webdriver/common/socket_poller.rb +105 -0
  67. data/lib/selenium/webdriver/common/target_locator.rb +81 -0
  68. data/lib/selenium/webdriver/common/timeouts.rb +38 -0
  69. data/lib/selenium/webdriver/common/touch_action_builder.rb +64 -0
  70. data/lib/selenium/webdriver/common/touch_screen.rb +105 -0
  71. data/lib/selenium/webdriver/common/wait.rb +63 -0
  72. data/lib/selenium/webdriver/common/window.rb +104 -0
  73. data/lib/selenium/webdriver/common/zipper.rb +82 -0
  74. data/lib/selenium/webdriver/firefox.rb +37 -0
  75. data/lib/selenium/webdriver/firefox/binary.rb +158 -0
  76. data/lib/selenium/webdriver/firefox/bridge.rb +70 -0
  77. data/lib/selenium/webdriver/firefox/extension.rb +52 -0
  78. data/lib/selenium/webdriver/firefox/launcher.rb +106 -0
  79. data/lib/selenium/webdriver/firefox/profile.rb +263 -0
  80. data/lib/selenium/webdriver/firefox/profiles_ini.rb +62 -0
  81. data/lib/selenium/webdriver/firefox/socket_lock.rb +61 -0
  82. data/lib/selenium/webdriver/firefox/util.rb +29 -0
  83. data/lib/selenium/webdriver/ie.rb +19 -0
  84. data/lib/selenium/webdriver/ie/bridge.rb +68 -0
  85. data/lib/selenium/webdriver/ie/server.rb +86 -0
  86. data/lib/selenium/webdriver/iphone.rb +9 -0
  87. data/lib/selenium/webdriver/iphone/bridge.rb +45 -0
  88. data/lib/selenium/webdriver/opera.rb +24 -0
  89. data/lib/selenium/webdriver/opera/bridge.rb +112 -0
  90. data/lib/selenium/webdriver/opera/service.rb +49 -0
  91. data/lib/selenium/webdriver/phantomjs.rb +22 -0
  92. data/lib/selenium/webdriver/phantomjs/bridge.rb +59 -0
  93. data/lib/selenium/webdriver/phantomjs/service.rb +90 -0
  94. data/lib/selenium/webdriver/remote.rb +22 -0
  95. data/lib/selenium/webdriver/remote/bridge.rb +644 -0
  96. data/lib/selenium/webdriver/remote/capabilities.rb +267 -0
  97. data/lib/selenium/webdriver/remote/commands.rb +193 -0
  98. data/lib/selenium/webdriver/remote/http/common.rb +74 -0
  99. data/lib/selenium/webdriver/remote/http/curb.rb +79 -0
  100. data/lib/selenium/webdriver/remote/http/default.rb +139 -0
  101. data/lib/selenium/webdriver/remote/http/persistent.rb +38 -0
  102. data/lib/selenium/webdriver/remote/response.rb +97 -0
  103. data/lib/selenium/webdriver/remote/server_error.rb +17 -0
  104. data/lib/selenium/webdriver/safari.rb +46 -0
  105. data/lib/selenium/webdriver/safari/bridge.rb +110 -0
  106. data/lib/selenium/webdriver/safari/browser.rb +20 -0
  107. data/lib/selenium/webdriver/safari/extension.rb +120 -0
  108. data/lib/selenium/webdriver/safari/server.rb +145 -0
  109. data/lib/selenium/webdriver/support.rb +5 -0
  110. data/lib/selenium/webdriver/support/abstract_event_listener.rb +28 -0
  111. data/lib/selenium/webdriver/support/block_event_listener.rb +17 -0
  112. data/lib/selenium/webdriver/support/color.rb +110 -0
  113. data/lib/selenium/webdriver/support/event_firing_bridge.rb +112 -0
  114. data/lib/selenium/webdriver/support/select.rb +293 -0
  115. data/ruby.iml +13 -0
  116. data/spec/integration/selenium/client/api/backward_compatible_api_spec.rb +22 -0
  117. data/spec/integration/selenium/client/api/browser_xpath_library_spec.rb +17 -0
  118. data/spec/integration/selenium/client/api/click_spec.rb +39 -0
  119. data/spec/integration/selenium/client/api/cookie_spec.rb +39 -0
  120. data/spec/integration/selenium/client/api/element_spec.rb +14 -0
  121. data/spec/integration/selenium/client/api/highlight_located_element_spec.rb +19 -0
  122. data/spec/integration/selenium/client/api/retrieve_last_remote_control_logs_spec.rb +33 -0
  123. data/spec/integration/selenium/client/api/screenshot_spec.rb +31 -0
  124. data/spec/integration/selenium/client/api/select_window_spec.rb +46 -0
  125. data/spec/integration/selenium/client/api/start_stop_spec.rb +9 -0
  126. data/spec/integration/selenium/client/api/wait_for_ajax_spec.rb +27 -0
  127. data/spec/integration/selenium/client/api/wait_for_element_spec.rb +56 -0
  128. data/spec/integration/selenium/client/api/wait_for_field_value_spec.rb +52 -0
  129. data/spec/integration/selenium/client/api/wait_for_text_spec.rb +98 -0
  130. data/spec/integration/selenium/client/api/webdriver_backed_spec.rb +21 -0
  131. data/spec/integration/selenium/client/sample-app/public/jquery-1.3.2.js +4376 -0
  132. data/spec/integration/selenium/client/sample-app/public/jquery.html +55 -0
  133. data/spec/integration/selenium/client/sample-app/public/prototype-1.6.0.3.js +4320 -0
  134. data/spec/integration/selenium/client/sample-app/public/prototype.html +59 -0
  135. data/spec/integration/selenium/client/sample-app/sample_app.rb +32 -0
  136. data/spec/integration/selenium/client/spec_helper.rb +139 -0
  137. data/spec/integration/selenium/webdriver/app_cache_spec.rb +47 -0
  138. data/spec/integration/selenium/webdriver/browser_connection_spec.rb +20 -0
  139. data/spec/integration/selenium/webdriver/chrome/driver_spec.rb +28 -0
  140. data/spec/integration/selenium/webdriver/chrome/profile_spec.rb +63 -0
  141. data/spec/integration/selenium/webdriver/driver_spec.rb +266 -0
  142. data/spec/integration/selenium/webdriver/element_spec.rb +191 -0
  143. data/spec/integration/selenium/webdriver/error_spec.rb +30 -0
  144. data/spec/integration/selenium/webdriver/firefox/driver_spec.rb +21 -0
  145. data/spec/integration/selenium/webdriver/firefox/profile_spec.rb +141 -0
  146. data/spec/integration/selenium/webdriver/keyboard_spec.rb +57 -0
  147. data/spec/integration/selenium/webdriver/location_spec.rb +29 -0
  148. data/spec/integration/selenium/webdriver/mouse_spec.rb +57 -0
  149. data/spec/integration/selenium/webdriver/navigation_spec.rb +46 -0
  150. data/spec/integration/selenium/webdriver/opera/driver_spec.rb +47 -0
  151. data/spec/integration/selenium/webdriver/options_spec.rb +77 -0
  152. data/spec/integration/selenium/webdriver/remote/driver_spec.rb +19 -0
  153. data/spec/integration/selenium/webdriver/remote/element_spec.rb +26 -0
  154. data/spec/integration/selenium/webdriver/spec_helper.rb +36 -0
  155. data/spec/integration/selenium/webdriver/spec_support.rb +12 -0
  156. data/spec/integration/selenium/webdriver/spec_support/guards.rb +110 -0
  157. data/spec/integration/selenium/webdriver/spec_support/helpers.rb +51 -0
  158. data/spec/integration/selenium/webdriver/spec_support/rack_server.rb +123 -0
  159. data/spec/integration/selenium/webdriver/spec_support/test_environment.rb +239 -0
  160. data/spec/integration/selenium/webdriver/sql_database_spec.rb +59 -0
  161. data/spec/integration/selenium/webdriver/storage_spec.rb +96 -0
  162. data/spec/integration/selenium/webdriver/target_locator_spec.rb +186 -0
  163. data/spec/integration/selenium/webdriver/timeout_spec.rb +69 -0
  164. data/spec/integration/selenium/webdriver/touch_spec.rb +176 -0
  165. data/spec/integration/selenium/webdriver/window_spec.rb +70 -0
  166. data/spec/integration/selenium/webdriver/zipper_spec.rb +66 -0
  167. data/spec/unit/selenium/client/base_spec.rb +239 -0
  168. data/spec/unit/selenium/client/extensions_spec.rb +174 -0
  169. data/spec/unit/selenium/client/idiomatic_spec.rb +500 -0
  170. data/spec/unit/selenium/client/javascript_expression_builder_spec.rb +79 -0
  171. data/spec/unit/selenium/client/javascript_frameworks/jquery_spec.rb +10 -0
  172. data/spec/unit/selenium/client/javascript_frameworks/prototype_spec.rb +10 -0
  173. data/spec/unit/selenium/client/protocol_spec.rb +124 -0
  174. data/spec/unit/selenium/client/selenium_helper_spec.rb +56 -0
  175. data/spec/unit/selenium/client/spec_helper.rb +24 -0
  176. data/spec/unit/selenium/rake/task_spec.rb +79 -0
  177. data/spec/unit/selenium/server_spec.rb +150 -0
  178. data/spec/unit/selenium/webdriver/action_builder_spec.rb +97 -0
  179. data/spec/unit/selenium/webdriver/android/bridge_spec.rb +43 -0
  180. data/spec/unit/selenium/webdriver/chrome/bridge_spec.rb +137 -0
  181. data/spec/unit/selenium/webdriver/chrome/profile_spec.rb +57 -0
  182. data/spec/unit/selenium/webdriver/chrome/service_spec.rb +44 -0
  183. data/spec/unit/selenium/webdriver/error_spec.rb +41 -0
  184. data/spec/unit/selenium/webdriver/firefox/bridge_spec.rb +47 -0
  185. data/spec/unit/selenium/webdriver/ie/bridge_spec.rb +91 -0
  186. data/spec/unit/selenium/webdriver/iphone/bridge_spec.rb +42 -0
  187. data/spec/unit/selenium/webdriver/log_entry_spec.rb +11 -0
  188. data/spec/unit/selenium/webdriver/opera/bridge_spec.rb +44 -0
  189. data/spec/unit/selenium/webdriver/phantomjs/bridge_spec.rb +55 -0
  190. data/spec/unit/selenium/webdriver/proxy_spec.rb +106 -0
  191. data/spec/unit/selenium/webdriver/remote/bridge_spec.rb +16 -0
  192. data/spec/unit/selenium/webdriver/remote/capabilities_spec.rb +115 -0
  193. data/spec/unit/selenium/webdriver/remote/http/common_spec.rb +24 -0
  194. data/spec/unit/selenium/webdriver/remote/http/default_spec.rb +124 -0
  195. data/spec/unit/selenium/webdriver/search_context_spec.rb +61 -0
  196. data/spec/unit/selenium/webdriver/socket_poller_spec.rb +68 -0
  197. data/spec/unit/selenium/webdriver/spec_helper.rb +27 -0
  198. data/spec/unit/selenium/webdriver/support/color_spec.rb +119 -0
  199. data/spec/unit/selenium/webdriver/support/event_firing_spec.rb +111 -0
  200. data/spec/unit/selenium/webdriver/support/select_spec.rb +290 -0
  201. data/spec/unit/selenium/webdriver/wait_spec.rb +49 -0
  202. metadata +370 -0
@@ -0,0 +1,42 @@
1
+ module Selenium
2
+ module WebDriver
3
+ class PortProber
4
+ def self.above(port)
5
+ port += 1 until free? port
6
+ port
7
+ end
8
+
9
+ def self.random
10
+ # TODO: Avoid this
11
+ #
12
+ # (a) should pick a port that's guaranteed to be free on all interfaces
13
+ # (b) should pick a random port outside the ephemeral port range
14
+ #
15
+ server = TCPServer.new(Platform.localhost, 0)
16
+ port = server.addr[1]
17
+ server.close
18
+
19
+ port
20
+ end
21
+
22
+ IGNORED_ERRORS = [Errno::EADDRNOTAVAIL]
23
+ IGNORED_ERRORS << Errno::EBADF if Platform.cygwin?
24
+
25
+ def self.free?(port)
26
+ Platform.interfaces.each do |host|
27
+ begin
28
+ TCPServer.new(host, port).close
29
+ rescue *IGNORED_ERRORS => ex
30
+ $stderr.puts "port prober could not bind to #{host}:#{port} (#{ex.message})" if $DEBUG
31
+ # ignored - some machines appear unable to bind to some of their interfaces
32
+ end
33
+ end
34
+
35
+ true
36
+ rescue SocketError, Errno::EADDRINUSE
37
+ false
38
+ end
39
+
40
+ end # PortProber
41
+ end # WebDriver
42
+ end # Selenium
@@ -0,0 +1,67 @@
1
+ module Selenium
2
+ module WebDriver
3
+
4
+ #
5
+ # @api private
6
+ #
7
+ # Common methods for Chrome::Profile and Firefox::Profile
8
+ # Includers must implement #layout_on_disk
9
+ #
10
+
11
+ module ProfileHelper
12
+
13
+ def self.included(base)
14
+ base.extend ClassMethods
15
+ end
16
+
17
+ def as_json(opts = nil)
18
+ {'zip' => Zipper.zip(layout_on_disk)}
19
+ end
20
+
21
+ def to_json(*args)
22
+ WebDriver.json_dump as_json
23
+ end
24
+
25
+ private
26
+
27
+ def create_tmp_copy(directory)
28
+ tmp_directory = Dir.mktmpdir("webdriver-rb-profilecopy")
29
+
30
+ # TODO: must be a better way..
31
+ FileUtils.rm_rf tmp_directory
32
+ FileUtils.mkdir_p File.dirname(tmp_directory), :mode => 0700
33
+ FileUtils.cp_r directory, tmp_directory
34
+
35
+ tmp_directory
36
+ end
37
+
38
+ def verify_model(model)
39
+ return unless model
40
+
41
+ raise Errno::ENOENT, model unless File.exist?(model)
42
+ raise Errno::ENOTDIR, model unless File.directory?(model)
43
+
44
+ model
45
+ end
46
+
47
+ module ClassMethods
48
+ def from_json(json)
49
+ data = WebDriver.json_load(json).fetch('zip')
50
+
51
+ # can't use Tempfile here since it doesn't support File::BINARY mode on 1.8
52
+ # can't use Dir.mktmpdir(&blk) because of http://jira.codehaus.org/browse/JRUBY-4082
53
+ tmp_dir = Dir.mktmpdir
54
+ begin
55
+ zip_path = File.join(tmp_dir, "webdriver-profile-duplicate-#{json.hash}.zip")
56
+ File.open(zip_path, "wb") { |zip_file| zip_file << Base64.decode64(data) }
57
+
58
+ new Zipper.unzip(zip_path)
59
+ ensure
60
+ FileUtils.rm_rf tmp_dir
61
+ end
62
+ end
63
+ end # ClassMethods
64
+
65
+ end # ProfileHelper
66
+ end # WebDriver
67
+ end # Selenium
@@ -0,0 +1,149 @@
1
+ module Selenium
2
+ module WebDriver
3
+ class Proxy
4
+ TYPES = {
5
+ :direct => "DIRECT", # Direct connection, no proxy (default on Windows).
6
+ :manual => "MANUAL", # Manual proxy settings (e.g., for httpProxy).
7
+ :pac => "PAC", # Proxy autoconfiguration from URL.
8
+ :auto_detect => "AUTODETECT", # Proxy autodetection (presumably with WPAD).
9
+ :system => "SYSTEM" # Use system settings (default on Linux).
10
+ }
11
+
12
+ attr_reader :type,
13
+ :ftp,
14
+ :http,
15
+ :socks,
16
+ :socks_username,
17
+ :socks_password,
18
+ :no_proxy,
19
+ :pac,
20
+ :ssl,
21
+ :auto_detect
22
+
23
+ def initialize(opts = {})
24
+ opts = opts.dup
25
+
26
+ self.type = opts.delete(:type) if opts.has_key? :type
27
+ self.ftp = opts.delete(:ftp) if opts.has_key? :ftp
28
+ self.http = opts.delete(:http) if opts.has_key? :http
29
+ self.no_proxy = opts.delete(:no_proxy) if opts.has_key? :no_proxy
30
+ self.ssl = opts.delete(:ssl) if opts.has_key? :ssl
31
+ self.pac = opts.delete(:pac) if opts.has_key? :pac
32
+ self.auto_detect = opts.delete(:auto_detect) if opts.has_key? :auto_detect
33
+ self.socks = opts.delete(:socks) if opts.has_key? :socks
34
+ self.socks_username = opts.delete(:socks_username) if opts.has_key? :socks_username
35
+ self.socks_password = opts.delete(:socks_password) if opts.has_key? :socks_password
36
+
37
+ unless opts.empty?
38
+ raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
39
+ end
40
+ end
41
+
42
+ def ==(other)
43
+ other.kind_of?(self.class) && as_json == other.as_json
44
+ end
45
+ alias_method :eql?, :==
46
+
47
+ def ftp=(value)
48
+ self.type = :manual
49
+ @ftp = value
50
+ end
51
+
52
+ def http=(value)
53
+ self.type = :manual
54
+ @http = value
55
+ end
56
+
57
+ def no_proxy=(value)
58
+ self.type = :manual
59
+ @no_proxy = value
60
+ end
61
+
62
+ def ssl=(value)
63
+ self.type = :manual
64
+ @ssl = value
65
+ end
66
+
67
+ def pac=(url)
68
+ self.type = :pac
69
+ @pac = url
70
+ end
71
+
72
+ def auto_detect=(bool)
73
+ self.type = :auto_detect
74
+ @auto_detect = bool
75
+ end
76
+
77
+ def socks=(value)
78
+ self.type = :manual
79
+ @socks = value
80
+ end
81
+
82
+ def socks_username=(value)
83
+ self.type = :manual
84
+ @socks_username = value
85
+ end
86
+
87
+ def socks_password=(value)
88
+ self.type = :manual
89
+ @socks_password = value
90
+ end
91
+
92
+ def type=(type)
93
+ unless TYPES.has_key? type
94
+ raise ArgumentError, "invalid proxy type: #{type.inspect}, expected one of #{TYPES.keys.inspect}"
95
+ end
96
+
97
+ if defined?(@type) && type != @type
98
+ raise ArgumentError, "incompatible proxy type #{type.inspect} (already set to #{@type.inspect})"
99
+ end
100
+
101
+ @type = type
102
+ end
103
+
104
+ def as_json(opts = nil)
105
+ json_result = {
106
+ "proxyType" => TYPES[type]
107
+ }
108
+
109
+ json_result["ftpProxy"] = ftp if ftp
110
+ json_result["httpProxy"] = http if http
111
+ json_result["noProxy"] = no_proxy if no_proxy
112
+ json_result["proxyAutoconfigUrl"] = pac if pac
113
+ json_result["sslProxy"] = ssl if ssl
114
+ json_result["autodetect"] = auto_detect if auto_detect
115
+ json_result["socksProxy"] = socks if socks
116
+ json_result["socksUsername"] = socks_username if socks_username
117
+ json_result["socksPassword"] = socks_password if socks_password
118
+
119
+ json_result if json_result.length > 1
120
+ end
121
+
122
+ def to_json(*args)
123
+ WebDriver.json_dump as_json
124
+ end
125
+
126
+ class << self
127
+ def json_create(data)
128
+ return if data['proxyType'] == 'UNSPECIFIED'
129
+
130
+ proxy = new
131
+
132
+ proxy.type = data['proxyType'].downcase.to_sym if data.has_key? 'proxyType'
133
+ proxy.ftp = data['ftpProxy'] if data.has_key? 'ftpProxy'
134
+ proxy.http = data['httpProxy'] if data.has_key? 'httpProxy'
135
+ proxy.no_proxy = data['noProxy'] if data.has_key? 'noProxy'
136
+ proxy.pac = data['proxyAutoconfigUrl'] if data.has_key? 'proxyAutoconfigUrl'
137
+ proxy.ssl = data['sslProxy'] if data.has_key? 'sslProxy'
138
+ proxy.auto_detect = data['autodetect'] if data.has_key? 'autodetect'
139
+ proxy.socks = data['socksProxy'] if data.has_key? 'socksProxy'
140
+ proxy.socks_username = data['socksUsername'] if data.has_key? 'socksUsername'
141
+ proxy.socks_password = data['socksPassword'] if data.has_key? 'socksPassword'
142
+
143
+ proxy
144
+ end
145
+ end # class << self
146
+
147
+ end # Proxy
148
+ end # WebDriver
149
+ end # Selenium
@@ -0,0 +1,92 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module SearchContext
4
+
5
+ # @api private
6
+ FINDERS = {
7
+ :class => 'class name',
8
+ :class_name => 'class name',
9
+ :css => 'css selector',
10
+ :id => 'id',
11
+ :link => 'link text',
12
+ :link_text => 'link text',
13
+ :name => 'name',
14
+ :partial_link_text => 'partial link text',
15
+ :tag_name => 'tag name',
16
+ :xpath => 'xpath',
17
+ }
18
+
19
+ #
20
+ # Find the first element matching the given arguments.
21
+ #
22
+ # When using Element#find_element with :xpath, be aware that webdriver
23
+ # follows standard conventions: a search prefixed with "//" will search
24
+ # the entire document, not just the children of this current node. Use
25
+ # ".//" to limit your search to the children of the receiving Element.
26
+ #
27
+ # @param [:class, :class_name, :css, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath] how
28
+ # @param [String] what
29
+ # @return [Element]
30
+ #
31
+ # @raise [Error::NoSuchElementError] if the element doesn't exist
32
+ #
33
+ #
34
+
35
+ def find_element(*args)
36
+ how, what = extract_args(args)
37
+
38
+ unless by = FINDERS[how.to_sym]
39
+ raise ArgumentError, "cannot find element by #{how.inspect}"
40
+ end
41
+
42
+ bridge.find_element_by by, what.to_s, ref
43
+ end
44
+
45
+ #
46
+ # Find all elements matching the given arguments
47
+ #
48
+ # @see SearchContext#find_element
49
+ #
50
+ # @param [:class, :class_name, :css, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath] how
51
+ # @param [String] what
52
+ # @return [Array<Element>]
53
+ #
54
+
55
+ def find_elements(*args)
56
+ how, what = extract_args(args)
57
+
58
+ unless by = FINDERS[how.to_sym]
59
+ raise ArgumentError, "cannot find elements by #{how.inspect}"
60
+ end
61
+
62
+ bridge.find_elements_by by, what.to_s, ref
63
+ end
64
+
65
+ private
66
+
67
+ def extract_args(args)
68
+ case args.size
69
+ when 2
70
+ args
71
+ when 1
72
+ arg = args.first
73
+
74
+ unless arg.respond_to?(:shift)
75
+ raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift"
76
+ end
77
+
78
+ # this will be a single-entry hash, so use #shift over #first or #[]
79
+ arr = arg.dup.shift
80
+ unless arr.size == 2
81
+ raise ArgumentError, "expected #{arr.inspect} to have 2 elements"
82
+ end
83
+
84
+ arr
85
+ else
86
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 2)"
87
+ end
88
+ end
89
+
90
+ end # SearchContext
91
+ end # WebDriver
92
+ end # Selenium
@@ -0,0 +1,105 @@
1
+ require 'selenium/webdriver/common/platform'
2
+ require 'socket'
3
+
4
+ module Selenium
5
+ module WebDriver
6
+ class SocketPoller
7
+
8
+ def initialize(host, port, timeout = 0, interval = 0.25)
9
+ @host = host
10
+ @port = Integer(port)
11
+ @timeout = Float(timeout)
12
+ @interval = interval
13
+ end
14
+
15
+ #
16
+ # Returns true if the server is listening within the given timeout,
17
+ # false otherwise.
18
+ #
19
+ # @return [Boolean]
20
+ #
21
+
22
+ def connected?
23
+ with_timeout { listening? }
24
+ end
25
+
26
+ #
27
+ # Returns true if the server has stopped listening within the given timeout,
28
+ # false otherwise.
29
+ #
30
+ # @return [Boolean]
31
+ #
32
+
33
+ def closed?
34
+ with_timeout { not listening? }
35
+ end
36
+
37
+ private
38
+
39
+ CONNECT_TIMEOUT = 5
40
+
41
+ NOT_CONNECTED_ERRORS = [Errno::ECONNREFUSED, Errno::ENOTCONN, SocketError]
42
+ NOT_CONNECTED_ERRORS << Errno::EPERM if Platform.cygwin?
43
+
44
+ CONNECTED_ERRORS = [Errno::EISCONN]
45
+ CONNECTED_ERRORS << Errno::EINVAL if Platform.windows?
46
+
47
+ if Platform.jruby?
48
+ # we use a plain TCPSocket here since JRuby has issues select()ing on a connecting socket
49
+ # see http://jira.codehaus.org/browse/JRUBY-5165
50
+ def listening?
51
+ TCPSocket.new(@host, @port).close
52
+ true
53
+ rescue *NOT_CONNECTED_ERRORS
54
+ false
55
+ end
56
+ else
57
+ def listening?
58
+ addr = Socket.getaddrinfo(@host, @port, Socket::AF_INET, Socket::SOCK_STREAM)
59
+ sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
60
+ sockaddr = Socket.pack_sockaddr_in(@port, addr[0][3])
61
+
62
+ begin
63
+ sock.connect_nonblock sockaddr
64
+ rescue Errno::EINPROGRESS
65
+ if IO.select(nil, [sock], nil, CONNECT_TIMEOUT)
66
+ retry
67
+ else
68
+ raise Errno::ECONNREFUSED
69
+ end
70
+ rescue *CONNECTED_ERRORS
71
+ # yay!
72
+ end
73
+
74
+ sock.close
75
+ true
76
+ rescue *NOT_CONNECTED_ERRORS
77
+ sock.close if sock
78
+ $stderr.puts [@host, @port].inspect if $DEBUG
79
+ false
80
+ end
81
+ end
82
+
83
+ def with_timeout(&blk)
84
+ max_time = time_now + @timeout
85
+
86
+ (
87
+ return true if yield
88
+ wait
89
+ ) until time_now > max_time
90
+
91
+ false
92
+ end
93
+
94
+ def wait
95
+ sleep @interval
96
+ end
97
+
98
+ # for testability
99
+ def time_now
100
+ Time.now
101
+ end
102
+
103
+ end # SocketPoller
104
+ end # WebDriver
105
+ end # Selenium