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,123 @@
1
+ require 'rack'
2
+ require 'socket'
3
+
4
+ module Selenium
5
+ module WebDriver
6
+ module SpecSupport
7
+ class RackServer
8
+
9
+ START_TIMEOUT = 30
10
+
11
+ def initialize(path, port = nil)
12
+ @path = path
13
+ @app = TestApp.new(path)
14
+
15
+ @host = ENV['localhost'] || 'localhost'
16
+ @port = Integer(port || PortProber.above(8180))
17
+ end
18
+
19
+ def start
20
+ if Platform.jruby?
21
+ start_threaded
22
+ elsif Platform.windows?
23
+ start_windows
24
+ else
25
+ start_forked
26
+ end
27
+
28
+ unless SocketPoller.new(@host, @port, START_TIMEOUT).connected?
29
+ raise "rack server not launched in #{START_TIMEOUT} seconds"
30
+ end
31
+ end
32
+
33
+ def run
34
+ handler.run @app, :Host => @host, :Port => @port
35
+ end
36
+
37
+ def where_is(file)
38
+ "http://#{@host}:#{@port}/#{file}"
39
+ end
40
+
41
+ def stop
42
+ if defined?(@thread) && @thread
43
+ @thread.kill
44
+ elsif defined?(@pid) && @pid
45
+ Process.kill('KILL', @pid)
46
+ Process.waitpid(@pid)
47
+ elsif defined?(@process) && @process
48
+ @process.stop
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def handler
55
+ # can't use Platform here since it's being run as a file on Windows + IE.
56
+ if RUBY_PLATFORM =~ /mswin|msys|mingw32/
57
+ handlers = %w[mongrel webrick]
58
+ else
59
+ handlers = %w[thin mongrel webrick]
60
+ end
61
+
62
+ handler = handlers.find { |h| load_handler h }
63
+ constant = handler == 'webrick' ? "WEBrick" : handler.capitalize
64
+ Rack::Handler.const_get constant
65
+ end
66
+
67
+ def load_handler(handler)
68
+ require handler
69
+ true
70
+ rescue LoadError
71
+ false
72
+ end
73
+
74
+ def start_forked
75
+ @pid = fork { run }
76
+ end
77
+
78
+ def start_threaded
79
+ Thread.abort_on_exception = true
80
+ @thread = Thread.new { run }
81
+ sleep 0.5
82
+ end
83
+
84
+ def start_windows
85
+ if %w[ie internet_explorer].include? ENV['WD_SPEC_DRIVER']
86
+ # For IE, the combination of Windows + FFI + MRI seems to cause a
87
+ # deadlock with the get() call and the server thread.
88
+ # Workaround by running this file in a subprocess.
89
+ @process = ChildProcess.build("ruby", "-r", "rubygems", __FILE__, @path, @port).start
90
+ else
91
+ start_threaded
92
+ end
93
+ end
94
+
95
+ class TestApp
96
+ def initialize(file_root)
97
+ @static = Rack::File.new(file_root)
98
+ end
99
+
100
+ def call(env)
101
+ case env['PATH_INFO']
102
+ when "/common/upload"
103
+ req = Rack::Request.new(env)
104
+
105
+ status = 200
106
+ header = {"Content-Type" => "text/html"}
107
+ body = req['upload'][:tempfile].read
108
+
109
+ [status, header, [body]]
110
+ else
111
+ @static.call env
112
+ end
113
+ end
114
+ end
115
+
116
+ end # RackServer
117
+ end # SpecSupport
118
+ end # WebDriver
119
+ end # Selenium
120
+
121
+ if __FILE__ == $0
122
+ Selenium::WebDriver::SpecSupport::RackServer.new(ARGV[0], ARGV[1]).run
123
+ end
@@ -0,0 +1,239 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module SpecSupport
4
+ class TestEnvironment
5
+
6
+ attr_accessor :unguarded
7
+ attr_reader :driver
8
+
9
+ def initialize
10
+ @create_driver_error = nil
11
+ @create_driver_error_count = 0
12
+
13
+ # TODO: get rid of ENV
14
+ @driver = (ENV['WD_SPEC_DRIVER'] || raise("must set WD_SPEC_DRIVER")).to_sym
15
+ end
16
+
17
+ def browser
18
+ if driver == :remote
19
+ # TODO: get rid of ENV
20
+ (ENV['WD_REMOTE_BROWSER'] || :firefox).to_sym
21
+ else
22
+ driver
23
+ end
24
+ end
25
+
26
+ def driver_instance
27
+ @driver_instance ||= new_driver_instance
28
+ end
29
+
30
+ def reset_driver!
31
+ quit_driver
32
+ @driver_instance = new_driver_instance
33
+ end
34
+
35
+ def quit_driver
36
+ @driver_instance.quit if @driver_instance
37
+ end
38
+
39
+ def new_driver_instance
40
+ check_for_previous_error
41
+ create_driver
42
+ end
43
+
44
+ def app_server
45
+ @app_server ||= (
46
+ path = File.join(root_folder, "common/src/web")
47
+ s = RackServer.new(path)
48
+ s.start
49
+
50
+ s
51
+ )
52
+ end
53
+
54
+ def remote_server
55
+ @remote_server ||= (
56
+ Selenium::Server.new(remote_server_jar,
57
+ :port => PortProber.above(4444),
58
+ :log => !!$DEBUG,
59
+ :background => true,
60
+ :timeout => 60
61
+ )
62
+ )
63
+ end
64
+
65
+ def remote_server_jar
66
+ @remote_server_jar ||= File.join(root_folder, "build/java/server/test/org/openqa/selenium/server-with-tests-standalone.jar")
67
+ end
68
+
69
+ def quit
70
+ app_server.stop
71
+
72
+ if defined?(@remote_server)
73
+ @remote_server.stop
74
+ end
75
+
76
+ @driver_instance = @app_server = @remote_server = nil
77
+ ensure
78
+ Guards.report
79
+ end
80
+
81
+ def unguarded?
82
+ @unguarded ||= false
83
+ end
84
+
85
+ def native_events?
86
+ @native_events ||= !!ENV['native']
87
+ end
88
+
89
+ def url_for(filename)
90
+ url = app_server.where_is filename
91
+ url.sub!("127.0.0.1", "10.0.2.2") if browser == :android
92
+
93
+ url
94
+ end
95
+
96
+ private
97
+
98
+ def root_folder
99
+ @root_folder ||= File.expand_path("../../../../../../../", __FILE__)
100
+ end
101
+
102
+ def create_driver
103
+ instance = case driver
104
+ when :remote
105
+ create_remote_driver
106
+ when :opera
107
+ create_opera_driver
108
+ when :firefox
109
+ create_firefox_driver
110
+ when :chrome
111
+ create_chrome_driver
112
+ when :iphone
113
+ create_iphone_driver
114
+ when :safari
115
+ create_safari_driver
116
+ when :phantomjs
117
+ create_phantomjs_driver
118
+ else
119
+ WebDriver::Driver.for driver
120
+ end
121
+
122
+ @create_driver_error_count -= 1 unless @create_driver_error_count == 0
123
+ instance
124
+ rescue => ex
125
+ @create_driver_error = ex
126
+ @create_driver_error_count += 1
127
+ raise ex
128
+ end
129
+
130
+ def remote_capabilities
131
+ caps = WebDriver::Remote::Capabilities.send(ENV['WD_REMOTE_BROWSER'] || 'firefox')
132
+
133
+ caps.javascript_enabled = true
134
+ caps.css_selectors_enabled = true
135
+
136
+ caps
137
+ end
138
+
139
+ MAX_ERRORS = 4
140
+
141
+ class DriverInstantiationError < StandardError
142
+ end
143
+
144
+ def check_for_previous_error
145
+ return unless @create_driver_error && @create_driver_error_count >= MAX_ERRORS
146
+
147
+ msg = "previous #{@create_driver_error_count} instantiations of driver #{driver.inspect} failed, not trying again"
148
+ msg << " (#{@create_driver_error.message})"
149
+
150
+ raise DriverInstantiationError, msg, @create_driver_error.backtrace
151
+ end
152
+
153
+ def create_remote_driver
154
+ WebDriver::Driver.for(:remote,
155
+ :desired_capabilities => remote_capabilities,
156
+ :url => ENV['WD_REMOTE_URL'] || remote_server.webdriver_url,
157
+ :http_client => keep_alive_client || http_client
158
+ )
159
+ end
160
+
161
+ def create_opera_driver
162
+ ENV['SELENIUM_SERVER_JAR'] = remote_server_jar
163
+ WebDriver::Driver.for :opera, :logging_level => ENV['log'] ? :config : :severe
164
+ end
165
+
166
+ def create_firefox_driver
167
+ if native_events?
168
+ profile = WebDriver::Firefox::Profile.new
169
+ profile.native_events = true
170
+
171
+ WebDriver::Driver.for :firefox, :profile => profile
172
+ else
173
+ WebDriver::Driver.for :firefox
174
+ end
175
+ end
176
+
177
+ def create_chrome_driver
178
+ binary = ENV['chrome_binary']
179
+ if binary
180
+ WebDriver::Chrome.path = binary
181
+ end
182
+
183
+ server = ENV['chromedriver'] || ENV['chrome_server']
184
+ if server
185
+ WebDriver::Chrome.driver_path = server
186
+ end
187
+
188
+ args = []
189
+ args << "--no-sandbox" if ENV['TRAVIS']
190
+
191
+ WebDriver::Driver.for :chrome,
192
+ :native_events => native_events?,
193
+ :args => args
194
+ # :http_client => keep_alive_client || http_client
195
+ end
196
+
197
+ def create_phantomjs_driver
198
+ binary = ENV['phantomjs_binary']
199
+ if binary
200
+ WebDriver::PhantomJS.path = binary
201
+ end
202
+
203
+ WebDriver::Driver.for :phantomjs
204
+ end
205
+
206
+ def create_iphone_driver
207
+ url = ENV['iphone_url']
208
+ if url
209
+ WebDriver::Driver.for :iphone, :url => url
210
+ else
211
+ WebDriver::Driver.for :iphone
212
+ end
213
+ end
214
+
215
+ def create_safari_driver
216
+ if ENV['timeout']
217
+ WebDriver::Driver.for :safari, :timeout => Integer(ENV['timeout'])
218
+ else
219
+ WebDriver::Driver.for :safari
220
+ end
221
+ end
222
+
223
+ def keep_alive_client
224
+ require 'selenium/webdriver/remote/http/persistent'
225
+ STDERR.puts "INFO: using net-http-persistent"
226
+
227
+ Selenium::WebDriver::Remote::Http::Persistent.new
228
+ rescue LoadError
229
+ # net-http-persistent not available
230
+ end
231
+
232
+ def http_client
233
+ Selenium::WebDriver::Remote::Http::Default.new
234
+ end
235
+
236
+ end # TestEnvironment
237
+ end # SpecSupport
238
+ end # WebDriver
239
+ end # Selenium
@@ -0,0 +1,59 @@
1
+ require File.expand_path("../spec_helper", __FILE__)
2
+
3
+ describe "Driver" do
4
+ context "sql database" do
5
+ let(:select) { "SELECT * FROM docs" }
6
+ let(:insert) { "INSERT INTO docs(docname) VALUES (?)" }
7
+ let(:delete) { "DELETE from docs" }
8
+ let(:update) { "UPDATE docs SET docname='DocBar' WHERE docname='DocFooBar'" }
9
+
10
+ before do
11
+ driver.get url_for("html5Page.html")
12
+ wait.until { driver.find_element(:id => "db_completed") }
13
+ end
14
+
15
+ compliant_on :browser => nil do
16
+ it "includes inserted rows in the result set" do
17
+ driver.execute_sql insert, "DocFoo"
18
+ driver.execute_sql insert, "DocFooBar"
19
+
20
+ result = driver.execute_sql select
21
+ result.rows.size.should == 2
22
+
23
+ result.rows[0]['docname'].should == 'DocFoo'
24
+ result.rows[1]['docname'].should == 'DocFooBar'
25
+
26
+ driver.execute_sql delete
27
+ result = driver.execute_sql select
28
+ result.rows.size.should == 0
29
+ end
30
+
31
+ it "knows the number of rows affected" do
32
+ result = driver.execute_sql insert, "DocFooBar"
33
+ result.rows_affected.should == 1
34
+
35
+ result = driver.execute_sql select
36
+ result.rows_affected.should == 0
37
+
38
+ driver.execute_sql update
39
+ result.rows.affected.should == 1
40
+ end
41
+
42
+ it "returns last inserted row id" do
43
+ result = driver.execute_sql select
44
+ result.last_inserted_row_id.should == -1
45
+
46
+ driver.execute_sql insert, "DocFoo"
47
+ result.last_inserted_row_id.should_not == -1
48
+
49
+ result = driver.execute_sql select
50
+ result.last_inserted_row_id.should == -1
51
+
52
+ result = driver.execute_sql delete
53
+ result.last_inserted_row_id.should == -1
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+
@@ -0,0 +1,96 @@
1
+ require File.expand_path("../spec_helper", __FILE__)
2
+
3
+ module Selenium::WebDriver::DriverExtensions
4
+ describe HasWebStorage do
5
+
6
+ compliant_on :browser => [:android] do
7
+ shared_examples_for 'web storage' do
8
+ before {
9
+ driver.navigate.to url_for("clicks.html")
10
+ storage.clear
11
+ }
12
+
13
+ it "can get and set items" do
14
+ storage.should be_empty
15
+ storage['foo'] = 'bar'
16
+ storage['foo'].should == 'bar'
17
+
18
+ storage['foo1'] = 'bar1'
19
+ storage['foo1'].should == 'bar1'
20
+
21
+ storage.size.should == 2
22
+ end
23
+
24
+ it "can get all keys" do
25
+ storage['foo1'] = 'bar1'
26
+ storage['foo2'] = 'bar2'
27
+ storage['foo3'] = 'bar3'
28
+
29
+ storage.size.should == 3
30
+ storage.keys.should == %w[foo1 foo2 foo3]
31
+ end
32
+
33
+ it "can clear all items" do
34
+ storage['foo1'] = 'bar1'
35
+ storage['foo2'] = 'bar2'
36
+ storage['foo3'] = 'bar3'
37
+
38
+ storage.size.should == 3
39
+ storage.clear
40
+ storage.size.should == 0
41
+ storage.keys.should be_empty
42
+ end
43
+
44
+ it "can delete an item" do
45
+ storage['foo1'] = 'bar1'
46
+ storage['foo2'] = 'bar2'
47
+ storage['foo3'] = 'bar3'
48
+
49
+ storage.size.should == 3
50
+ storage.delete('foo1').should == 'bar1'
51
+ storage.size.should == 2
52
+ end
53
+
54
+ it "knows if a key is set" do
55
+ storage.should_not have_key('foo1')
56
+ storage['foo1'] = 'bar1'
57
+ storage.should have_key('foo1')
58
+ end
59
+
60
+ it "is Enumerable" do
61
+ storage['foo1'] = 'bar1'
62
+ storage['foo2'] = 'bar2'
63
+ storage['foo3'] = 'bar3'
64
+
65
+ storage.to_a.should == [
66
+ ['foo1', 'bar1'],
67
+ ['foo2', 'bar2'],
68
+ ['foo3', 'bar3']
69
+ ]
70
+ end
71
+
72
+ it "can fetch an item" do
73
+ storage['foo1'] = 'bar1'
74
+ storage.fetch('foo1').should == 'bar1'
75
+ end
76
+
77
+ it "raises IndexError on missing key" do
78
+ lambda do
79
+ storage.fetch('no-such-key')
80
+ end.should raise_error(IndexError, /missing key/)
81
+ end
82
+ end
83
+
84
+ context "local storage" do
85
+ let(:storage) { driver.local_storage }
86
+ it_behaves_like 'web storage'
87
+ end
88
+
89
+ context "session storage" do
90
+ let(:storage) { driver.session_storage }
91
+ it_behaves_like 'web storage'
92
+ end
93
+ end
94
+
95
+ end
96
+ end