selenium-webdriver 2.40.0.rc1 → 2.40.0.rc2

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.
data/CHANGES CHANGED
@@ -1,3 +1,12 @@
1
+ 2.40.0 (???)
2
+ ============
3
+
4
+ * Fix bug where FileReaper would not reap files added in a child process
5
+ * Document AbstractEventListener (#5994)
6
+ * Safari:
7
+ * Add Safari::Options + clean up Safari extension handling (#6382)
8
+ * Add support for user extensions (#6815)
9
+
1
10
  2.39.0 (2013-12-17)
2
11
  ===================
3
12
 
@@ -41,6 +41,7 @@ end
41
41
 
42
42
  require 'selenium/webdriver/safari/browser'
43
43
  require 'selenium/webdriver/safari/server'
44
- require 'selenium/webdriver/safari/extension'
44
+ require 'selenium/webdriver/safari/extensions'
45
+ require 'selenium/webdriver/safari/options'
45
46
  require 'selenium/webdriver/safari/bridge'
46
47
 
@@ -6,19 +6,17 @@ module Selenium
6
6
  COMMAND_TIMEOUT = 60
7
7
 
8
8
  def initialize(opts = {})
9
- port = Integer(opts[:port] || PortProber.random)
10
- timeout = Integer(opts[:timeout] || COMMAND_TIMEOUT)
11
- custom_data_dir = opts[:custom_data_dir]
12
- install_extension = opts.fetch(:install_extension) { true }
9
+ command_timeout = Integer(opts[:timeout] || COMMAND_TIMEOUT)
10
+ safari_options = opts.delete(:options) || Safari::Options.new(opts)
11
+ capabilities = merge_capabilities(opts, safari_options)
13
12
 
14
13
  @command_id ||= 0
15
14
 
16
- if install_extension
17
- @extension = Extension.new(:custom_data_dir => custom_data_dir)
18
- @extension.install
19
- end
15
+ @extensions = Extensions.new(safari_options)
16
+ @extensions.install
20
17
 
21
- @server = Server.new(port, timeout)
18
+ # TODO: handle safari_opts['cleanSession']
19
+ @server = Server.new(safari_options.port, command_timeout)
22
20
  @server.start
23
21
 
24
22
  @safari = Browser.new
@@ -26,7 +24,7 @@ module Selenium
26
24
 
27
25
  @server.wait_for_connection
28
26
 
29
- super(:desired_capabilities => :safari)
27
+ super(desired_capabilities: capabilities)
30
28
  end
31
29
 
32
30
  def quit
@@ -34,7 +32,7 @@ module Selenium
34
32
 
35
33
  @server.stop
36
34
  @safari.stop
37
- @extension && @extension.uninstall
35
+ @extensions && @extensions.uninstall
38
36
  end
39
37
 
40
38
  def driver_extensions
@@ -75,8 +73,8 @@ module Selenium
75
73
  raise Error.for_code(status_code), response['value']['message']
76
74
  end
77
75
 
78
- if raw['id'] != @command_id.to_s
79
- raise Error::WebDriverError, "response id does not match command id"
76
+ if raw['id'].to_s != @command_id.to_s
77
+ raise Error::WebDriverError, "response id does not match command id: #{raw['id']} != #{@command_id}"
80
78
  end
81
79
 
82
80
  response
@@ -103,6 +101,18 @@ module Selenium
103
101
  path
104
102
  end
105
103
 
104
+ def merge_capabilities(opts, safari_options)
105
+ caps = safari_options.to_capabilities
106
+ other = opts[:desired_capabilities]
107
+
108
+ if other
109
+ other = opts[:desired_capabilities].as_json
110
+ caps['safari.options'].merge!(other.delete('safari.options') || {})
111
+ caps.merge!(other)
112
+ end
113
+
114
+ caps
115
+ end
106
116
  end
107
117
 
108
118
  end
@@ -0,0 +1,168 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Safari
4
+ #
5
+ # @api private
6
+ #
7
+
8
+ class Extensions
9
+
10
+ PLIST = <<-XML
11
+ <?xml version="1.0" encoding="UTF-8"?>
12
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
13
+ <plist version="1.0">
14
+ <dict>
15
+ <key>Available Updates</key>
16
+ <dict>
17
+ <key>Last Update Check Time</key>
18
+ <real>370125644.75941497</real>
19
+ <key>Updates List</key>
20
+ <array/>
21
+ </dict>
22
+ <key>Installed Extensions</key>
23
+ <array>
24
+ %s
25
+ </array>
26
+ <key>Version</key>
27
+ <integer>1</integer>
28
+ </dict>
29
+ </plist>
30
+ XML
31
+
32
+ PLIST_EXTENSION_LINE = <<-XML
33
+ <dict>
34
+ <key>Added Non-Default Toolbar Items</key>
35
+ <array/>
36
+ <key>Archive File Name</key>
37
+ <string>%s.safariextz</string>
38
+ <key>Bundle Directory Name</key>
39
+ <string>%s.safariextension</string>
40
+ <key>Enabled</key>
41
+ <true/>
42
+ <key>Hidden Bars</key>
43
+ <array/>
44
+ <key>Removed Default Toolbar Items</key>
45
+ <array/>
46
+ </dict>
47
+ XML
48
+
49
+ def initialize(opts = {})
50
+ @data_dir = opts.data_dir || safari_data_dir
51
+ @skip = opts.skip_extension_installation?
52
+ @extensions = opts.extensions
53
+ @backup = Backup.new
54
+ @installed = false
55
+ end
56
+
57
+ def install
58
+ return if @installed
59
+ installed_extensions = []
60
+
61
+ if install_directory.exist?
62
+ @backup.backup install_directory
63
+ end
64
+
65
+ install_directory.mkpath
66
+
67
+ unless @skip
68
+ extension_destination.rmtree if extension_destination.exist?
69
+ FileUtils.cp extension_source.to_s, extension_destination.to_s
70
+
71
+ installed_extensions << extension_destination
72
+ end
73
+
74
+ @extensions.each do |extension|
75
+ target = install_directory.join(extension.basename)
76
+
77
+ if extension.expand_path == target.expand_path
78
+ @backup.backup(target)
79
+ else
80
+ FileUtils.cp extension, target
81
+ end
82
+
83
+ installed_extensions << target
84
+ end
85
+
86
+ plist_destination.open('w') do |io|
87
+ extension_lines = installed_extensions.map do |ext|
88
+ name = ext.basename('.safariextz').to_s
89
+ PLIST_EXTENSION_LINE % [name, name]
90
+ end
91
+ io << PLIST % extension_lines.join("\n")
92
+ end
93
+
94
+ Platform.exit_hook { uninstall }
95
+ @installed = true
96
+ end
97
+
98
+ def uninstall
99
+ return unless @installed
100
+
101
+ install_directory.rmtree if install_directory.exist?
102
+ @backup.restore_all
103
+ ensure
104
+ @installed = false
105
+ end
106
+
107
+ def extension_source
108
+ Safari.resource_path.join('SafariDriver.safariextz')
109
+ end
110
+
111
+ def extension_destination
112
+ install_directory.join('WebDriver.safariextz')
113
+ end
114
+
115
+ def plist_destination
116
+ install_directory.join('Extensions.plist')
117
+ end
118
+
119
+ def install_directory
120
+ @install_directory ||= (
121
+ data_dir = Pathname.new(@data_dir || safari_data_dir)
122
+
123
+ unless data_dir.exist? && data_dir.directory?
124
+ raise Errno::ENOENT, "Safari data directory not found at #{data_dir.to_s}"
125
+ end
126
+
127
+ data_dir.join('Extensions')
128
+ )
129
+ end
130
+
131
+ def safari_data_dir
132
+ current = Platform.os
133
+
134
+ case current
135
+ when :macosx
136
+ Pathname.new(Platform.home).join('Library/Safari')
137
+ when :windows
138
+ Pathname.new(ENV['APPDATA']).join('Apple Computer/Safari')
139
+ else
140
+ raise Error::WebDriverError, "unsupported platform: #{current}"
141
+ end
142
+ end
143
+
144
+ class Backup
145
+ def initialize
146
+ @dir = Pathname.new(Dir.mktmpdir('webdriver-safari-backups'))
147
+ @backups = {}
148
+
149
+ FileReaper << @dir.to_s
150
+ end
151
+
152
+ def backup(file)
153
+ src = file
154
+ dst = @dir.join(file.basename).to_s
155
+
156
+ FileUtils.cp_r src.to_s, dst.to_s
157
+ @backups[src] = dst
158
+ end
159
+
160
+ def restore_all
161
+ @backups.each {|src, dst| FileUtils.cp_r dst.to_s, src.to_s }
162
+ end
163
+ end
164
+
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,79 @@
1
+ module Selenium
2
+ module WebDriver
3
+ module Safari
4
+ class Options
5
+ attr_accessor :port, :data_dir, :skip_extension_installation
6
+ attr_reader :extensions
7
+
8
+ def initialize(opts = {})
9
+ @extensions = []
10
+ extract_options(opts)
11
+ end
12
+
13
+ def add_extension(ext)
14
+ @extensions << verify_safari_extension(ext)
15
+ end
16
+
17
+ def clean_session?
18
+ !!@clean_session
19
+ end
20
+
21
+ def skip_extension_installation?
22
+ !!@skip_extension_installation
23
+ end
24
+
25
+ def to_capabilities
26
+ caps = Remote::Capabilities.safari
27
+ caps.merge!('safari.options' => as_json)
28
+
29
+ caps
30
+ end
31
+
32
+ def as_json
33
+ {
34
+ 'port' => port,
35
+ 'dataDir' => data_dir,
36
+ 'cleanSession' => clean_session?,
37
+ 'extensions' => extensions_as_json,
38
+ 'skipExtensionInstallation' => skip_extension_installation?
39
+ }
40
+ end
41
+
42
+ private
43
+
44
+ def extensions_as_json
45
+ @extensions.map do |path|
46
+ {'filename' => path.basename, 'contents' => Base64.strict_encode64(path.read) }
47
+ end
48
+ end
49
+
50
+ def extract_options(opts)
51
+ @port = Integer(opts[:port] || PortProber.random)
52
+ @data_dir = opts[:custom_data_dir] || opts[:data_dir]
53
+ @clean_session = opts[:clean_session]
54
+
55
+ Array(opts[:extensions]).each { |ext| add_extension(ext) }
56
+
57
+ if opts.key?(:install_extension)
58
+ @skip_extension_installation = !opts[:install_extension]
59
+ elsif opts.key?(:skip_extension_installation)
60
+ @skip_extension_installation = opts[:skip_extension_installation]
61
+ else
62
+ @skip_extension_installation = false
63
+ end
64
+ end
65
+
66
+ def verify_safari_extension(path)
67
+ pn = Pathname.new(path)
68
+
69
+ unless pn.file? && pn.extname == '.safariextz'
70
+ raise ArgumentError, "invalid Safari extension path: #{path}"
71
+ end
72
+
73
+ pn
74
+ end
75
+
76
+ end
77
+ end
78
+ end
79
+ end
@@ -2,6 +2,31 @@ module Selenium
2
2
  module WebDriver
3
3
  module Support
4
4
 
5
+ #
6
+ # Subclass and override methods from this class
7
+ # to implement your own event listener.
8
+ #
9
+ # @example
10
+ #
11
+ # class NavigationListener < Selenium::WebDriver::Support::AbstractEventListener
12
+ # def initialize(log)
13
+ # @log = log
14
+ # end
15
+ #
16
+ # def before_navigate_to(url, driver)
17
+ # @log.info "navigating to #{url}"
18
+ # end
19
+ #
20
+ # def after_navigate_to(url, driver)
21
+ # @log.info "done navigating to #{url}"
22
+ # end
23
+ # end
24
+ #
25
+ # listener = NavigationListener.new(logger)
26
+ # driver = Selenium::WebDriver.for :firefox, :listener => listener
27
+ #
28
+ #
29
+
5
30
  class AbstractEventListener
6
31
  def before_navigate_to(url, driver) end
7
32
  def after_navigate_to(url, driver) end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 7
5
- version: 2.40.0.rc1
5
+ version: 2.40.0.rc2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jari Bakken
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2014-01-27 00:00:00 +01:00
13
+ date: 2014-02-17 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -217,7 +217,8 @@ files:
217
217
  - lib/selenium/webdriver/remote/http/persistent.rb
218
218
  - lib/selenium/webdriver/safari/bridge.rb
219
219
  - lib/selenium/webdriver/safari/browser.rb
220
- - lib/selenium/webdriver/safari/extension.rb
220
+ - lib/selenium/webdriver/safari/extensions.rb
221
+ - lib/selenium/webdriver/safari/options.rb
221
222
  - lib/selenium/webdriver/safari/server.rb
222
223
  - lib/selenium/webdriver/safari/resources/client.js
223
224
  - lib/selenium/webdriver/safari/resources/SafariDriver.safariextz
@@ -1,121 +0,0 @@
1
- module Selenium
2
- module WebDriver
3
- module Safari
4
- class Extension
5
-
6
- PLIST = <<-XML
7
- <?xml version="1.0" encoding="UTF-8"?>
8
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
9
- <plist version="1.0">
10
- <dict>
11
- <key>Available Updates</key>
12
- <dict>
13
- <key>Last Update Check Time</key>
14
- <real>370125644.75941497</real>
15
- <key>Updates List</key>
16
- <array/>
17
- </dict>
18
- <key>Installed Extensions</key>
19
- <array>
20
- <dict>
21
- <key>Added Non-Default Toolbar Items</key>
22
- <array/>
23
- <key>Archive File Name</key>
24
- <string>WebDriver.safariextz</string>
25
- <key>Bundle Directory Name</key>
26
- <string>WebDriver.safariextension</string>
27
- <key>Enabled</key>
28
- <true/>
29
- <key>Hidden Bars</key>
30
- <array/>
31
- <key>Removed Default Toolbar Items</key>
32
- <array/>
33
- </dict>
34
- </array>
35
- <key>Version</key>
36
- <integer>1</integer>
37
- </dict>
38
- </plist>
39
- XML
40
-
41
- def initialize(opts = {})
42
- @custom_data_dir = opts[:custom_data_dir]
43
- @installed = false
44
- end
45
-
46
- def install
47
- return if @installed
48
-
49
- if install_directory.exist?
50
- backup_directory.rmtree if backup_directory.exist?
51
- FileUtils.mv install_directory.to_s, backup_directory.to_s
52
- end
53
-
54
- install_directory.mkpath
55
-
56
- extension_destination.rmtree if extension_destination.exist?
57
- FileUtils.cp extension_source.to_s, extension_destination.to_s
58
-
59
- plist_destination.open('w') { |io| io << PLIST }
60
-
61
- at_exit { uninstall }
62
- @installed = true
63
- end
64
-
65
- def uninstall
66
- return unless @installed
67
-
68
- install_directory.rmtree if install_directory.exist?
69
-
70
- if backup_directory.exist?
71
- FileUtils.mv backup_directory.to_s, install_directory.to_s
72
- end
73
- ensure
74
- @installed = false
75
- end
76
-
77
- def extension_source
78
- Safari.resource_path.join('SafariDriver.safariextz')
79
- end
80
-
81
- def extension_destination
82
- install_directory.join('WebDriver.safariextz')
83
- end
84
-
85
- def backup_directory
86
- Pathname.new("#{install_directory.to_s}.bak")
87
- end
88
-
89
- def plist_destination
90
- install_directory.join('Extensions.plist')
91
- end
92
-
93
- def install_directory
94
- @install_directory ||= (
95
- data_dir = Pathname.new(@custom_data_dir || safari_data_dir)
96
-
97
- unless data_dir.exist? && data_dir.directory?
98
- raise Errno::ENOENT, "Safari data directory not found at #{data_dir.to_s}"
99
- end
100
-
101
- data_dir.join('Extensions')
102
- )
103
- end
104
-
105
- def safari_data_dir
106
- current = Platform.os
107
-
108
- case current
109
- when :macosx
110
- Pathname.new(Platform.home).join('Library/Safari')
111
- when :windows
112
- Pathname.new(ENV['APPDATA']).join('Apple Computer/Safari')
113
- else
114
- raise Error::WebDriverError, "unsupported platform: #{current}"
115
- end
116
- end
117
-
118
- end
119
- end
120
- end
121
- end