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,71 @@
1
+ require 'childprocess'
2
+ require 'tmpdir'
3
+ require 'fileutils'
4
+ require 'date'
5
+
6
+ require 'multi_json'
7
+ require 'selenium/webdriver/common'
8
+
9
+ module Selenium
10
+ module WebDriver
11
+ extend JsonHelper
12
+
13
+ Point = Struct.new(:x, :y)
14
+ Dimension = Struct.new(:width, :height)
15
+ Location = Struct.new(:latitude, :longitude, :altitude)
16
+
17
+ autoload :Android, 'selenium/webdriver/android'
18
+ autoload :Chrome, 'selenium/webdriver/chrome'
19
+ autoload :Firefox, 'selenium/webdriver/firefox'
20
+ autoload :IE, 'selenium/webdriver/ie'
21
+ autoload :IPhone, 'selenium/webdriver/iphone'
22
+ autoload :Opera, 'selenium/webdriver/opera'
23
+ autoload :PhantomJS, 'selenium/webdriver/phantomjs'
24
+ autoload :Remote, 'selenium/webdriver/remote'
25
+ autoload :Safari, 'selenium/webdriver/safari'
26
+ autoload :Support, 'selenium/webdriver/support'
27
+
28
+ # @api private
29
+
30
+ def self.root
31
+ @root ||= File.expand_path("../..", __FILE__)
32
+ end
33
+
34
+ #
35
+ # Create a new Driver instance with the correct bridge for the given browser
36
+ #
37
+ # @param browser [:ie, :internet_explorer, :remote, :chrome, :firefox, :ff, :android, :iphone, :opera, :phantomjs, :safari]
38
+ # the driver type to use
39
+ # @param *rest
40
+ # arguments passed to Bridge.new
41
+ #
42
+ # @return [Driver]
43
+ #
44
+ # @see Selenium::WebDriver::Remote::Bridge
45
+ # @see Selenium::WebDriver::Firefox::Bridge
46
+ # @see Selenium::WebDriver::IE::Bridge
47
+ # @see Selenium::WebDriver::Chrome::Bridge
48
+ # @see Selenium::WebDriver::Android::Bridge
49
+ # @see Selenium::WebDriver::IPhone::Bridge
50
+ # @see Selenium::WebDriver::Opera::Bridge
51
+ # @see Selenium::WebDriver::PhantomJS::Bridge
52
+ # @see Selenium::WebDriver::Safari::Bridge
53
+ #
54
+ # @example
55
+ #
56
+ # WebDriver.for :firefox, :profile => "some-profile"
57
+ # WebDriver.for :firefox, :profile => Profile.new
58
+ # WebDriver.for :remote, :url => "http://localhost:4444/wd/hub", :desired_capabilities => caps
59
+ #
60
+ # One special argument is not passed on to the bridges, :listener. You can pass a listener for this option
61
+ # to get notified of WebDriver events. The passed object must respond to #call or implement the methods from AbstractEventListener.
62
+ #
63
+ # @see Selenium::WebDriver::Support::AbstractEventListener
64
+ #
65
+
66
+ def self.for(*args)
67
+ WebDriver::Driver.for(*args)
68
+ end
69
+
70
+ end # WebDriver
71
+ end # Selenium
@@ -0,0 +1,9 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Android
4
+
5
+ end # Android
6
+ end # WebDriver
7
+ end # Selenium
8
+
9
+ require 'selenium/webdriver/android/bridge'
@@ -0,0 +1,47 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Android
4
+
5
+ #
6
+ # @api private
7
+ #
8
+
9
+ class Bridge < Remote::Bridge
10
+
11
+ DEFAULT_URL = "http://#{Platform.localhost}:8080/wd/hub/"
12
+
13
+ def initialize(opts = {})
14
+ remote_opts = {
15
+ :url => opts.fetch(:url, DEFAULT_URL),
16
+ :desired_capabilities => opts.fetch(:desired_capabilities, capabilities),
17
+ }
18
+
19
+ remote_opts[:http_client] = opts[:http_client] if opts.has_key?(:http_client)
20
+
21
+ super remote_opts
22
+ end
23
+
24
+ def browser
25
+ :android
26
+ end
27
+
28
+ def driver_extensions
29
+ [
30
+ DriverExtensions::TakesScreenshot,
31
+ DriverExtensions::Rotatable,
32
+ DriverExtensions::HasInputDevices,
33
+ DriverExtensions::HasWebStorage,
34
+ DriverExtensions::HasLocation,
35
+ DriverExtensions::HasBrowserConnection,
36
+ DriverExtensions::HasTouchScreen
37
+ ]
38
+ end
39
+
40
+ def capabilities
41
+ @capabilities ||= Remote::Capabilities.android
42
+ end
43
+
44
+ end # Bridge
45
+ end # Android
46
+ end # WebDriver
47
+ end # Selenium
@@ -0,0 +1,26 @@
1
+ require 'net/http'
2
+
3
+ require 'selenium/webdriver/chrome/service'
4
+ require 'selenium/webdriver/chrome/bridge'
5
+ require 'selenium/webdriver/chrome/profile'
6
+
7
+ module Selenium
8
+ module WebDriver
9
+
10
+ module Chrome
11
+ def self.driver_path=(path)
12
+ Service.executable_path = path
13
+ end
14
+
15
+ def self.path=(path)
16
+ Platform.assert_executable path
17
+ @path = path
18
+ end
19
+
20
+ def self.path
21
+ @path ||= nil
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,120 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Chrome
4
+
5
+ # @api private
6
+ class Bridge < Remote::Bridge
7
+
8
+ def initialize(opts = {})
9
+ http_client = opts.delete(:http_client)
10
+
11
+ if opts.has_key?(:url)
12
+ url = opts.delete(:url)
13
+ else
14
+ @service = Service.default_service(*extract_service_args(opts))
15
+ @service.start
16
+
17
+ url = @service.uri
18
+ end
19
+
20
+ caps = create_capabilities(opts)
21
+
22
+ remote_opts = {
23
+ :url => url,
24
+ :desired_capabilities => caps
25
+ }
26
+
27
+ remote_opts.merge!(:http_client => http_client) if http_client
28
+
29
+ super(remote_opts)
30
+ end
31
+
32
+ def browser
33
+ :chrome
34
+ end
35
+
36
+ def driver_extensions
37
+ [
38
+ DriverExtensions::TakesScreenshot,
39
+ DriverExtensions::HasInputDevices
40
+ ]
41
+ end
42
+
43
+ def capabilities
44
+ @capabilities ||= Remote::Capabilities.chrome
45
+ end
46
+
47
+ def quit
48
+ super
49
+ ensure
50
+ @service.stop if @service
51
+ end
52
+
53
+ private
54
+
55
+ def create_capabilities(opts)
56
+ caps = opts.delete(:desired_capabilities) { Remote::Capabilities.chrome }
57
+ args = opts.delete(:args) || opts.delete(:switches)
58
+ native_events = opts.delete(:native_events)
59
+ verbose = opts.delete(:verbose)
60
+ profile = opts.delete(:profile)
61
+ detach = opts.delete(:detach)
62
+ proxy = opts.delete(:proxy)
63
+ no_website_testing_defaults = opts.delete(:no_website_testing_defaults)
64
+ prefs = opts.delete(:prefs)
65
+
66
+ unless opts.empty?
67
+ raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
68
+ end
69
+
70
+ chrome_options = caps['chromeOptions'] || {}
71
+
72
+ if args
73
+ unless args.kind_of? Array
74
+ raise ArgumentError, ":args must be an Array of Strings"
75
+ end
76
+
77
+ chrome_options['args'] = args.map { |e| e.to_s }
78
+ end
79
+
80
+ if profile
81
+ data = profile.as_json
82
+
83
+ chrome_options.merge! 'profile' => data['zip'],
84
+ 'extensions' => data['extensions']
85
+ end
86
+
87
+
88
+ chrome_options['binary'] = Chrome.path if Chrome.path
89
+ chrome_options['nativeEvents'] = true if native_events
90
+ chrome_options['verbose'] = true if verbose
91
+ chrome_options['detach'] = detach.nil? || !!detach
92
+ chrome_options['noWebsiteTestingDefaults'] = true if no_website_testing_defaults
93
+ chrome_options['prefs'] = prefs if prefs
94
+
95
+ caps['chromeOptions'] = chrome_options
96
+ caps['proxy'] = proxy if proxy
97
+
98
+ # legacy options - for chromedriver < 17.0.963.0
99
+ caps["chrome.switches"] = chrome_options['args'] if chrome_options.member?('args')
100
+ %w[binary detach extensions nativeEvents noWebsiteTestingDefaults prefs profile verbose].each do |key|
101
+ caps["chrome.#{key}"] = chrome_options[key] if chrome_options.member?(key)
102
+ end
103
+
104
+ caps
105
+ end
106
+
107
+ def extract_service_args(opts)
108
+ args = []
109
+
110
+ if opts.has_key?(:service_log_path)
111
+ args << "--log-path=#{opts.delete(:service_log_path)}"
112
+ end
113
+
114
+ args
115
+ end
116
+
117
+ end # Bridge
118
+ end # Chrome
119
+ end # WebDriver
120
+ end # Selenium
@@ -0,0 +1,90 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Chrome
4
+
5
+ #
6
+ # @private
7
+ #
8
+
9
+ class Profile
10
+ include ProfileHelper
11
+
12
+ def initialize(model = nil)
13
+ @model = verify_model(model)
14
+ @extensions = []
15
+ @encoded_extensions = []
16
+ end
17
+
18
+ def add_extension(path)
19
+ unless File.file?(path)
20
+ raise Error::WebDriverError, "could not find extension at #{path.inspect}"
21
+ end
22
+
23
+ @extensions << path
24
+ end
25
+
26
+ def add_encoded_extension(encoded)
27
+ @encoded_extensions << encoded
28
+ end
29
+
30
+ #
31
+ # Set a preference in the profile.
32
+ #
33
+ # See http://codesearch.google.com/codesearch#OAMlx_jo-ck/src/chrome/common/pref_names.cc&exact_package=chromium
34
+ #
35
+
36
+ def []=(key, value)
37
+ parts = key.split(".")
38
+ parts[0..-2].inject(prefs) { |pr, k| pr[k] ||= {} }[parts.last] = value
39
+ end
40
+
41
+ def [](key)
42
+ parts = key.split(".")
43
+ parts.inject(prefs) { |pr, k| pr.fetch(k) }
44
+ end
45
+
46
+ def layout_on_disk
47
+ dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir("webdriver-chrome-profile")
48
+ FileReaper << dir
49
+
50
+ write_prefs_to dir
51
+
52
+ dir
53
+ end
54
+
55
+ def as_json(opts = nil)
56
+ extensions = @extensions.map do |crx_path|
57
+ File.open(crx_path, "rb") { |crx_file| Base64.strict_encode64 crx_file.read }
58
+ end
59
+
60
+ extensions.concat(@encoded_extensions)
61
+
62
+ super.merge('extensions' => extensions)
63
+ end
64
+
65
+ private
66
+
67
+ def write_prefs_to(dir)
68
+ prefs_file = prefs_file_for(dir)
69
+
70
+ FileUtils.mkdir_p File.dirname(prefs_file)
71
+ File.open(prefs_file, "w") { |file| file << WebDriver.json_dump(prefs) }
72
+ end
73
+
74
+ def prefs
75
+ @prefs ||= read_model_prefs
76
+ end
77
+
78
+ def read_model_prefs
79
+ return {} unless @model
80
+ WebDriver.json_load File.read(prefs_file_for(@model))
81
+ end
82
+
83
+ def prefs_file_for(dir)
84
+ File.join dir, 'Default', 'Preferences'
85
+ end
86
+ end # Profile
87
+
88
+ end # Chrome
89
+ end # WebDriver
90
+ end # Selenium
@@ -0,0 +1,75 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Chrome
4
+
5
+ #
6
+ # @api private
7
+ #
8
+
9
+ class Service
10
+ START_TIMEOUT = 20
11
+ STOP_TIMEOUT = 5
12
+ DEFAULT_PORT = 9515
13
+ MISSING_TEXT = "Unable to find the chromedriver executable. Please download the server from http://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH. More info at http://code.google.com/p/selenium/wiki/ChromeDriver."
14
+
15
+ attr_reader :uri
16
+
17
+ def self.executable_path
18
+ @executable_path ||= (
19
+ path = Platform.find_binary "chromedriver"
20
+ path or raise Error::WebDriverError, MISSING_TEXT
21
+ Platform.assert_executable path
22
+
23
+ path
24
+ )
25
+ end
26
+
27
+ def self.executable_path=(path)
28
+ Platform.assert_executable path
29
+ @executable_path = path
30
+ end
31
+
32
+ def self.default_service(*extra_args)
33
+ new executable_path, PortProber.above(DEFAULT_PORT), *extra_args
34
+ end
35
+
36
+ def initialize(executable_path, port, *extra_args)
37
+ @uri = URI.parse "http://#{Platform.localhost}:#{port}"
38
+ server_command = [executable_path, "--port=#{port}", *extra_args]
39
+
40
+ @process = ChildProcess.build(*server_command)
41
+ @socket_poller = SocketPoller.new Platform.localhost, port, START_TIMEOUT
42
+
43
+ @process.io.inherit! if $DEBUG == true
44
+ end
45
+
46
+ def start
47
+ @process.start
48
+
49
+ unless @socket_poller.connected?
50
+ raise Error::WebDriverError, "unable to connect to chromedriver #{@uri}"
51
+ end
52
+
53
+ Platform.exit_hook { stop } # make sure we don't leave the server running
54
+ end
55
+
56
+ def stop
57
+ return if @process.nil? || @process.exited?
58
+
59
+ Net::HTTP.start(uri.host, uri.port) do |http|
60
+ http.open_timeout = STOP_TIMEOUT / 2
61
+ http.read_timeout = STOP_TIMEOUT / 2
62
+
63
+ http.head("/shutdown")
64
+ end
65
+
66
+ @process.poll_for_exit STOP_TIMEOUT
67
+ rescue ChildProcess::TimeoutError
68
+ # ok, force quit
69
+ @process.stop STOP_TIMEOUT
70
+ end
71
+ end # Service
72
+
73
+ end # Chrome
74
+ end # WebDriver
75
+ end # Service