browserstack-webdriver 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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