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,263 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Firefox
4
+ class Profile
5
+ include ProfileHelper
6
+
7
+ VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String]
8
+ WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
9
+ WEBDRIVER_PREFS = {
10
+ :native_events => 'webdriver_enable_native_events',
11
+ :untrusted_certs => 'webdriver_accept_untrusted_certs',
12
+ :untrusted_issuer => 'webdriver_assume_untrusted_issuer',
13
+ :port => 'webdriver_firefox_port',
14
+ :log_file => 'webdriver.log.file'
15
+ }
16
+
17
+ attr_reader :name, :log_file
18
+ attr_writer :secure_ssl, :native_events, :load_no_focus_lib
19
+
20
+ class << self
21
+ def ini
22
+ @ini ||= ProfilesIni.new
23
+ end
24
+
25
+ def from_name(name)
26
+ ini[name]
27
+ end
28
+
29
+ def default_preferences
30
+ @default_preferences ||= WebDriver.json_load(
31
+ File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
32
+ ).freeze
33
+ end
34
+ end
35
+
36
+ #
37
+ # Create a new Profile instance
38
+ #
39
+ # @example User configured profile
40
+ #
41
+ # profile = Selenium::WebDriver::Firefox::Profile.new
42
+ # profile['network.proxy.http'] = 'localhost'
43
+ # profile['network.proxy.http_port'] = 9090
44
+ #
45
+ # driver = Selenium::WebDriver.for :firefox, :profile => profile
46
+ #
47
+
48
+ def initialize(model = nil)
49
+ @model = verify_model(model)
50
+
51
+ model_prefs = read_model_prefs
52
+
53
+ if model_prefs.empty?
54
+ @native_events = DEFAULT_ENABLE_NATIVE_EVENTS
55
+ @secure_ssl = DEFAULT_SECURE_SSL
56
+ @untrusted_issuer = DEFAULT_ASSUME_UNTRUSTED_ISSUER
57
+ @load_no_focus_lib = DEFAULT_LOAD_NO_FOCUS_LIB
58
+
59
+ @additional_prefs = {}
60
+ else
61
+ # TODO: clean this up
62
+ @native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == "true"
63
+ @secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != "true"
64
+ @untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == "true"
65
+ @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == "true" # not stored in profile atm, so will always be false.
66
+ @additional_prefs = model_prefs
67
+ end
68
+
69
+ @extensions = {}
70
+ end
71
+
72
+ def layout_on_disk
73
+ profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir("webdriver-profile")
74
+ FileReaper << profile_dir
75
+
76
+ install_extensions(profile_dir)
77
+ delete_lock_files(profile_dir)
78
+ delete_extensions_cache(profile_dir)
79
+ update_user_prefs_in(profile_dir)
80
+
81
+ profile_dir
82
+ end
83
+
84
+
85
+ #
86
+ # Set a preference for this particular profile.
87
+ #
88
+ # @see http://kb.mozillazine.org/About:config_entries
89
+ # @see http://preferential.mozdev.org/preferences.html
90
+ #
91
+
92
+ def []=(key, value)
93
+ unless VALID_PREFERENCE_TYPES.any? { |e| value.kind_of? e }
94
+ raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
95
+ end
96
+
97
+ if value.kind_of?(String) && Util.stringified?(value)
98
+ raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
99
+ end
100
+
101
+ @additional_prefs[key.to_s] = value
102
+ end
103
+
104
+ def port=(port)
105
+ self[WEBDRIVER_PREFS[:port]] = port
106
+ end
107
+
108
+ def log_file=(file)
109
+ @log_file = file
110
+ self[WEBDRIVER_PREFS[:log_file]] = file
111
+ end
112
+
113
+ def add_webdriver_extension
114
+ unless @extensions.has_key?(:webdriver)
115
+ add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
116
+ end
117
+ end
118
+
119
+ #
120
+ # Add the extension (directory, .zip or .xpi) at the given path to the profile.
121
+ #
122
+
123
+ def add_extension(path, name = extension_name_for(path))
124
+ @extensions[name] = Extension.new(path)
125
+ end
126
+
127
+ def native_events?
128
+ @native_events == true
129
+ end
130
+
131
+ def load_no_focus_lib?
132
+ @load_no_focus_lib == true
133
+ end
134
+
135
+ def secure_ssl?
136
+ @secure_ssl == true
137
+ end
138
+
139
+ def assume_untrusted_certificate_issuer?
140
+ @untrusted_issuer == true
141
+ end
142
+
143
+ def assume_untrusted_certificate_issuer=(bool)
144
+ @untrusted_issuer = bool
145
+ end
146
+
147
+ def proxy=(proxy)
148
+ unless proxy.kind_of? Proxy
149
+ raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
150
+ end
151
+
152
+ case proxy.type
153
+ when :manual
154
+ self['network.proxy.type'] = 1
155
+
156
+ set_manual_proxy_preference "ftp", proxy.ftp
157
+ set_manual_proxy_preference "http", proxy.http
158
+ set_manual_proxy_preference "ssl", proxy.ssl
159
+ set_manual_proxy_preference "socks", proxy.socks
160
+
161
+ if proxy.no_proxy
162
+ self["network.proxy.no_proxies_on"] = proxy.no_proxy
163
+ else
164
+ self["network.proxy.no_proxies_on"] = ""
165
+ end
166
+ when :pac
167
+ self['network.proxy.type'] = 2
168
+ self['network.proxy.autoconfig_url'] = proxy.pac
169
+ when :auto_detect
170
+ self['network.proxy.type'] = 4
171
+ else
172
+ raise ArgumentError, "unsupported proxy type #{proxy.type}"
173
+ end
174
+
175
+ proxy
176
+ end
177
+
178
+ private
179
+
180
+ def set_manual_proxy_preference(key, value)
181
+ return unless value
182
+
183
+ host, port = value.to_s.split(":", 2)
184
+
185
+ self["network.proxy.#{key}"] = host
186
+ self["network.proxy.#{key}_port"] = Integer(port) if port
187
+ end
188
+
189
+ def install_extensions(directory)
190
+ destination = File.join(directory, "extensions")
191
+
192
+ @extensions.each do |name, extension|
193
+ p :extension => name if $DEBUG
194
+ extension.write_to(destination)
195
+ end
196
+ end
197
+
198
+ def read_model_prefs
199
+ return {} unless @model
200
+
201
+ read_user_prefs(File.join(@model, 'user.js'))
202
+ end
203
+
204
+ def delete_extensions_cache(directory)
205
+ FileUtils.rm_f File.join(directory, "extensions.cache")
206
+ end
207
+
208
+ def delete_lock_files(directory)
209
+ %w[.parentlock parent.lock].each do |name|
210
+ FileUtils.rm_f File.join(directory, name)
211
+ end
212
+ end
213
+
214
+ def extension_name_for(path)
215
+ File.basename(path, File.extname(path))
216
+ end
217
+
218
+ def update_user_prefs_in(directory)
219
+ path = File.join(directory, 'user.js')
220
+ prefs = read_user_prefs(path)
221
+
222
+ prefs.merge! self.class.default_preferences.fetch 'mutable'
223
+ prefs.merge! @additional_prefs
224
+ prefs.merge! self.class.default_preferences.fetch 'frozen'
225
+
226
+ prefs[WEBDRIVER_PREFS[:untrusted_certs]] = !secure_ssl?
227
+ prefs[WEBDRIVER_PREFS[:native_events]] = native_events?
228
+ prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
229
+
230
+ # If the user sets the home page, we should also start up there
231
+ prefs["startup.homepage_welcome_url"] = prefs["browser.startup.homepage"]
232
+
233
+ write_prefs prefs, path
234
+ end
235
+
236
+ def read_user_prefs(path)
237
+ prefs = {}
238
+ return prefs unless File.exist?(path)
239
+
240
+ File.read(path).split("\n").each do |line|
241
+ if line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
242
+ key, value = $1.strip, $2.strip
243
+
244
+ # wrap the value in an array to make it a valid JSON string.
245
+ prefs[key] = WebDriver.json_load("[#{value}]").first
246
+ end
247
+ end
248
+
249
+ prefs
250
+ end
251
+
252
+ def write_prefs(prefs, path)
253
+ File.open(path, "w") { |file|
254
+ prefs.each do |key, value|
255
+ file.puts %{user_pref("#{key}", #{WebDriver.json_dump value});}
256
+ end
257
+ }
258
+ end
259
+
260
+ end # Profile
261
+ end # Firefox
262
+ end # WebDriver
263
+ end # Selenium
@@ -0,0 +1,62 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Firefox
4
+
5
+ # @api private
6
+ class ProfilesIni
7
+
8
+ def initialize
9
+ @ini_path = File.join(Util.app_data_path, "profiles.ini")
10
+ @profile_paths = {}
11
+
12
+ parse if File.exist?(@ini_path)
13
+ end
14
+
15
+ def [](name)
16
+ path = @profile_paths[name]
17
+ path && Profile.new(path)
18
+ end
19
+
20
+ def refresh
21
+ @profile_paths.clear
22
+ parse
23
+ end
24
+
25
+ private
26
+
27
+ def parse
28
+ string = File.read @ini_path
29
+ name = nil
30
+ is_relative = nil
31
+ path = nil
32
+
33
+ string.split("\n").each do |line|
34
+ case line
35
+ when /^\[Profile/
36
+ if p = path_for(name, is_relative, path)
37
+ @profile_paths[name] = p
38
+ name, path = nil
39
+ end
40
+ when /^Name=(.+)$/
41
+ name = $1.strip
42
+ when /^IsRelative=(.+)$/
43
+ is_relative = $1.strip == "1"
44
+ when /^Path=(.+)$/
45
+ path = $1.strip
46
+ end
47
+ end
48
+
49
+ if p = path_for(name, is_relative, path)
50
+ @profile_paths[name] = p
51
+ end
52
+ end
53
+
54
+ def path_for(name, is_relative, path)
55
+ return unless [name, path].any?
56
+ path = is_relative ? File.join(Util.app_data_path, path) : path
57
+ end
58
+
59
+ end # ProfilesIni
60
+ end # Firefox
61
+ end # WebDriver
62
+ end # Selenium
@@ -0,0 +1,61 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Firefox
4
+
5
+ #
6
+ # @api private
7
+ #
8
+
9
+ class SocketLock
10
+
11
+ def initialize(port, timeout)
12
+ @port = port
13
+ @timeout = timeout
14
+ end
15
+
16
+ def locked(&blk)
17
+ lock
18
+
19
+ begin
20
+ yield
21
+ ensure
22
+ release
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def lock
29
+ max_time = Time.now + @timeout
30
+
31
+ until can_lock? || Time.now >= max_time
32
+ sleep 0.1
33
+ end
34
+
35
+ unless did_lock?
36
+ raise Error::WebDriverError, "unable to bind to locking port #{@port} within #{@timeout} seconds"
37
+ end
38
+ end
39
+
40
+ def release
41
+ @server && @server.close
42
+ end
43
+
44
+ def can_lock?
45
+ @server = TCPServer.new(Platform.localhost, @port)
46
+ ChildProcess.close_on_exec @server
47
+
48
+ true
49
+ rescue SocketError, Errno::EADDRINUSE, Errno::EBADF => ex
50
+ $stderr.puts "#{self}: #{ex.message}" if $DEBUG
51
+ false
52
+ end
53
+
54
+ def did_lock?
55
+ !!@server
56
+ end
57
+
58
+ end # SocketLock
59
+ end # Firefox
60
+ end # WebDriver
61
+ end # Selenium
@@ -0,0 +1,29 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Firefox
4
+
5
+ # @api private
6
+ module Util
7
+ module_function
8
+
9
+ def app_data_path
10
+ case Platform.os
11
+ when :windows
12
+ "#{ENV['APPDATA']}\\Mozilla\\Firefox"
13
+ when :macosx
14
+ "#{Platform.home}/Library/Application Support/Firefox"
15
+ when :unix, :linux
16
+ "#{Platform.home}/.mozilla/firefox"
17
+ else
18
+ raise "Unknown os: #{Platform.os}"
19
+ end
20
+ end
21
+
22
+ def stringified?(str)
23
+ str =~ /^".*"$/
24
+ end
25
+
26
+ end # Util
27
+ end # Firefox
28
+ end # WebDriver
29
+ end # Selenium
@@ -0,0 +1,19 @@
1
+ module Selenium
2
+ module WebDriver
3
+
4
+ # @api private
5
+ module IE
6
+ def self.driver_path=(path)
7
+ Platform.assert_executable path
8
+ @driver_path = path
9
+ end
10
+
11
+ def self.driver_path
12
+ @driver_path ||= nil
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ require 'selenium/webdriver/ie/server'
19
+ require 'selenium/webdriver/ie/bridge'
@@ -0,0 +1,68 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module IE
4
+
5
+ #
6
+ # @api private
7
+ #
8
+
9
+ class Bridge < Remote::Bridge
10
+
11
+ HOST = Platform.localhost
12
+ DEFAULT_PORT = 5555
13
+ DEFAULT_TIMEOUT = 30
14
+
15
+ def initialize(opts = {})
16
+ caps = opts.delete(:desired_capabilities) { Remote::Capabilities.internet_explorer }
17
+ timeout = opts.delete(:timeout) { DEFAULT_TIMEOUT }
18
+ port = opts.delete(:port) { PortProber.above(DEFAULT_PORT) }
19
+ http_client = opts.delete(:http_client)
20
+ ignore_mode = opts.delete(:introduce_flakiness_by_ignoring_security_domains)
21
+ native_events = opts.delete(:native_events) != false
22
+
23
+ @server = Server.get
24
+
25
+ @server.log_level = opts.delete(:log_level) if opts[:log_level]
26
+ @server.log_file = opts.delete(:log_file) if opts[:log_file]
27
+
28
+ unless opts.empty?
29
+ raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
30
+ end
31
+
32
+ @port = @server.start Integer(port), timeout
33
+
34
+ if ignore_mode
35
+ caps['ignoreProtectedModeSettings'] = true
36
+ end
37
+
38
+ caps['nativeEvents'] = native_events
39
+
40
+ remote_opts = {
41
+ :url => @server.uri,
42
+ :desired_capabilities => caps
43
+ }
44
+
45
+ remote_opts[:http_client] = http_client if http_client
46
+
47
+ super(remote_opts)
48
+ end
49
+
50
+ def browser
51
+ :internet_explorer
52
+ end
53
+
54
+ def driver_extensions
55
+ [DriverExtensions::TakesScreenshot, DriverExtensions::HasInputDevices]
56
+ end
57
+
58
+ def quit
59
+ super
60
+ nil
61
+ ensure
62
+ @server.stop
63
+ end
64
+
65
+ end # Bridge
66
+ end # IE
67
+ end # WebDriver
68
+ end # Selenium