selenium-webdriver 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,10 @@
1
+ 3.2.0 (2017-02-22)
2
+ ===================
3
+
4
+ Ruby:
5
+ * Implement new Logger class
6
+ * Fix issue with chromedriver process leader incompatibility on Win7 (issue 3512)
7
+
1
8
  3.1.0 (2017-02-14)
2
9
  ===================
3
10
 
@@ -50,15 +50,20 @@ module Selenium
50
50
  #
51
51
  # Create a new Driver instance with the correct bridge for the given browser
52
52
  #
53
- # @param browser [:ie, :internet_explorer, :edge, :remote, :chrome, :firefox, :ff, :phantomjs, :safari]
54
- # the driver type to use
55
- # @param *rest
56
- # arguments passed to Bridge.new
53
+ # @overload for(browser)
54
+ # @param [:ie, :internet_explorer, :edge, :remote, :chrome, :firefox, :ff, :phantomjs, :safari] browser The browser to
55
+ # create the driver for
56
+ # @overload for(browser, opts)
57
+ # @param [:ie, :internet_explorer, :edge, :remote, :chrome, :firefox, :ff, :phantomjs, :safari] browser The browser to
58
+ # create the driver for
59
+ # @param [Hash] opts Options passed to Bridge.new
57
60
  #
58
61
  # @return [Driver]
59
62
  #
60
63
  # @see Selenium::WebDriver::Remote::Bridge
64
+ # @see Selenium::WebDriver::Remote::W3CBridge
61
65
  # @see Selenium::WebDriver::Firefox::Bridge
66
+ # @see Selenium::WebDriver::Firefox::W3CBridge
62
67
  # @see Selenium::WebDriver::IE::Bridge
63
68
  # @see Selenium::WebDriver::Edge::Bridge
64
69
  # @see Selenium::WebDriver::Chrome::Bridge
@@ -67,9 +72,9 @@ module Selenium
67
72
  #
68
73
  # @example
69
74
  #
70
- # WebDriver.for :firefox, :profile => "some-profile"
71
- # WebDriver.for :firefox, :profile => Profile.new
72
- # WebDriver.for :remote, :url => "http://localhost:4444/wd/hub", :desired_capabilities => caps
75
+ # WebDriver.for :firefox, profile: 'some-profile'
76
+ # WebDriver.for :firefox, profile: Profile.new
77
+ # WebDriver.for :remote, url: "http://localhost:4444/wd/hub", desired_capabilities: caps
73
78
  #
74
79
  # One special argument is not passed on to the bridges, :listener.
75
80
  # You can pass a listener for this option to get notified of WebDriver events.
@@ -81,5 +86,15 @@ module Selenium
81
86
  def self.for(*args)
82
87
  WebDriver::Driver.for(*args)
83
88
  end
89
+
90
+ #
91
+ # Returns logger instance that can be used across the whole Selenium.
92
+ #
93
+ # @return [Logger]
94
+ #
95
+
96
+ def self.logger
97
+ @logger ||= WebDriver::Logger.new
98
+ end
84
99
  end # WebDriver
85
100
  end # Selenium
@@ -37,10 +37,9 @@ module Selenium
37
37
 
38
38
  def start_process
39
39
  server_command = [@executable_path, "--port=#{@port}", *@extra_args]
40
- @process = ChildProcess.build(*server_command)
41
-
42
- @process.io.inherit! if $DEBUG
43
- @process.leader = true
40
+ @process = ChildProcess.build(*server_command)
41
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
42
+ @process.leader = true unless Platform.windows?
44
43
  @process.start
45
44
  end
46
45
 
@@ -37,6 +37,7 @@ require 'selenium/webdriver/common/target_locator'
37
37
  require 'selenium/webdriver/common/navigation'
38
38
  require 'selenium/webdriver/common/timeouts'
39
39
  require 'selenium/webdriver/common/window'
40
+ require 'selenium/webdriver/common/logger'
40
41
  require 'selenium/webdriver/common/logs'
41
42
  require 'selenium/webdriver/common/options'
42
43
  require 'selenium/webdriver/common/w3c_options'
@@ -69,11 +69,13 @@ module Selenium
69
69
  # el = driver.find_element(id: "some_id")
70
70
  # driver.action.key_down(el, :shift).perform
71
71
  #
72
- # @param [:shift, :alt, :control, :command, :meta] The key to press.
73
- # @param [Selenium::WebDriver::Element] element An optional element
72
+ # @overload key_down(key)
73
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
74
+ # @overload key_down(element, key)
75
+ # @param [Element] element An optional element to move to first
76
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
74
77
  # @raise [ArgumentError] if the given key is not a modifier
75
- # @return [ActionBuilder] A self reference.
76
- #
78
+ # @return [ActionBuilder] A self reference
77
79
 
78
80
  def key_down(*args)
79
81
  @actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
@@ -95,10 +97,13 @@ module Selenium
95
97
  # el = driver.find_element(id: "some_id")
96
98
  # driver.action.key_up(el, :alt).perform
97
99
  #
98
- # @param [:shift, :alt, :control, :command, :meta] The modifier key to release.
99
- # @param [Selenium::WebDriver::Element] element An optional element
100
- # @raise [ArgumentError] if the given key is not a modifier key
101
- # @return [ActionBuilder] A self reference.
100
+ # @overload key_up(key)
101
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
102
+ # @overload key_up(element, key)
103
+ # @param [Element] element An optional element to move to first
104
+ # @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
105
+ # @raise [ArgumentError] if the given key is not a modifier
106
+ # @return [ActionBuilder] A self reference
102
107
  #
103
108
 
104
109
  def key_up(*args)
@@ -124,9 +129,12 @@ module Selenium
124
129
  #
125
130
  # driver.action.send_keys("help").perform
126
131
  #
127
- # @param [Selenium::WebDriver::Element] element An optional element
128
- # @param [String] keys The keys to be sent.
129
- # @return [ActionBuilder] A self reference.
132
+ # @overload send_keys(keys)
133
+ # @param [Array, Symbol, String] keys The key(s) to press and release
134
+ # @overload send_keys(element, keys)
135
+ # @param [Element] element An optional element to move to first
136
+ # @param [Array, Symbol, String] keys The key(s) to press and release
137
+ # @return [ActionBuilder] A self reference
130
138
  #
131
139
 
132
140
  def send_keys(*args)
@@ -147,7 +155,7 @@ module Selenium
147
155
  # el = driver.find_element(id: "some_id")
148
156
  # driver.action.click_and_hold(el).perform
149
157
  #
150
- # @param [Selenium::WebDriver::Element] element the element to move to and click.
158
+ # @param [Element] element the element to move to and click.
151
159
  # @return [ActionBuilder] A self reference.
152
160
  #
153
161
 
@@ -330,8 +338,6 @@ module Selenium
330
338
  # @param [Selenium::WebDriver::Element] source Element to emulate button down at.
331
339
  # @param [Integer] right_by horizontal move offset.
332
340
  # @param [Integer] down_by vertical move offset.
333
- # @param [Selenium::WebDriver::Element] target Element to move to and release the
334
- # mouse at.
335
341
  # @return [ActionBuilder] A self reference.
336
342
  #
337
343
 
@@ -221,7 +221,7 @@ module Selenium
221
221
  #
222
222
  # @param [String] script
223
223
  # JavaScript source to execute
224
- # @param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] *args
224
+ # @param [WebDriver::Element, Integer, Float, Boolean, NilClass, String, Array] args
225
225
  # Arguments will be available in the given script in the 'arguments' pseudo-array.
226
226
  #
227
227
  # @return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
@@ -241,7 +241,7 @@ module Selenium
241
241
  #
242
242
  # @param [String] script
243
243
  # JavaScript source to execute
244
- # @param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] *args
244
+ # @param [WebDriver::Element,Integer, Float, Boolean, NilClass, String, Array] args
245
245
  # Arguments to the script. May be empty.
246
246
  #
247
247
  # @return [WebDriver::Element,Integer,Float,Boolean,NilClass,String,Array]
@@ -274,7 +274,7 @@ module Selenium
274
274
  # Get the first element matching the given selector. If given a
275
275
  # String or Symbol, it will be used as the id of the element.
276
276
  #
277
- # @param [String,Hash] id or selector
277
+ # @param [String,Hash] sel id or selector
278
278
  # @return [WebDriver::Element]
279
279
  #
280
280
  # Examples:
@@ -30,7 +30,7 @@ module Selenium
30
30
  #
31
31
  # Change the screen orientation
32
32
  #
33
- # @param [:landscape, :portrait] Orientation
33
+ # @param [:landscape, :portrait] orientation
34
34
  #
35
35
  # @api public
36
36
  #
@@ -108,10 +108,8 @@ module Selenium
108
108
  #
109
109
  # class, readonly
110
110
  #
111
- # @param [String]
112
- # attribute name
113
- # @return [String,nil]
114
- # attribute value
111
+ # @param [String] name attribute name
112
+ # @return [String, nil] attribute value
115
113
  #
116
114
 
117
115
  def attribute(name)
@@ -122,10 +120,8 @@ module Selenium
122
120
  # Get the value of a the given property with the same name of the element. If the value is not
123
121
  # set, nil is returned.
124
122
  #
125
- # @param [String]
126
- # property name
127
- # @return [String,nil]
128
- # property value
123
+ # @param [String] name property name
124
+ # @return [String, nil] property value
129
125
  #
130
126
 
131
127
  def property(name)
@@ -145,7 +141,7 @@ module Selenium
145
141
  #
146
142
  # Send keystrokes to this element
147
143
  #
148
- # @param [String, Symbol, Array]
144
+ # @param [String, Symbol, Array] args keystrokes to send
149
145
  #
150
146
  # Examples:
151
147
  #
@@ -22,8 +22,8 @@ module Selenium
22
22
  module KeyActions
23
23
  #
24
24
  # Performs a key press. Does not release the key - subsequent interactions may assume it's kept pressed.
25
- # Note that the modifier key is never released implicitly - either #key_up(key) or #release_actions must be
26
- # called to release the key.
25
+ # Note that the key is never released implicitly - either W3CActionBuilder#key_up(key) or W3CActionBuilder#release_actions
26
+ # must be called to release the key.
27
27
  #
28
28
  # @example Press a key
29
29
  #
@@ -34,10 +34,14 @@ module Selenium
34
34
  # el = driver.find_element(id: "some_id")
35
35
  # driver.action.key_down(el, :shift).perform
36
36
  #
37
- # @param [Selenium::WebDriver::Element] element An optional element
38
- # @param [:shift, :alt, :control, :command, :meta, 'a'] key The key to press.
39
- # @param [Symbol || String] device optional name of the KeyInput device to press the key on
40
- # @return [W3CActionBuilder] A self reference.
37
+ # @overload key_down(key, device: nil)
38
+ # @param [Symbol, String] key The key to press
39
+ # @param [Symbol, String] device Optional name of the KeyInput device to press the key on
40
+ # @overload key_down(element, key, device: nil)
41
+ # @param [Element] element An optional element to move to first
42
+ # @param [Symbol, String] key The key to press
43
+ # @param [Symbol, String] device Optional name of the KeyInput device to press the key on
44
+ # @return [W3CActionBuilder] A self reference
41
45
  #
42
46
 
43
47
  def key_down(*args, device: nil)
@@ -45,8 +49,8 @@ module Selenium
45
49
  end
46
50
 
47
51
  #
48
- # Performs a modifier key release.
49
- # Releasing a non-depressed modifier key will yield undefined behaviour.
52
+ # Performs a key release.
53
+ # Releasing a non-depressed key will yield undefined behaviour.
50
54
  #
51
55
  # @example Release a key
52
56
  #
@@ -57,10 +61,14 @@ module Selenium
57
61
  # el = driver.find_element(id: "some_id")
58
62
  # driver.action.key_up(el, :alt).perform
59
63
  #
60
- # @param [Selenium::WebDriver::Element] element An optional element
61
- # @param [:shift, :alt, :control, :command, :meta, 'a'] key The modifier key to release.
62
- # @param [Symbol || String] device optional name of the KeyInput device to release the key on
63
- # @return [W3CActionBuilder] A self reference.
64
+ # @overload key_up(key, device: nil)
65
+ # @param [Symbol, String] key The key to press
66
+ # @param [Symbol, String] device Optional name of the KeyInput device to press the key on
67
+ # @overload key_up(element, key, device: nil)
68
+ # @param [Element] element An optional element to move to first
69
+ # @param [Symbol, String] key The key to release
70
+ # @param [Symbol, String] device Optional name of the KeyInput device to release the key on
71
+ # @return [W3CActionBuilder] A self reference
64
72
  #
65
73
 
66
74
  def key_up(*args, device: nil)
@@ -83,10 +91,14 @@ module Selenium
83
91
  #
84
92
  # driver.action.send_keys("help").perform
85
93
  #
86
- # @param [Selenium::WebDriver::Element] element An optional element
87
- # @param [String] keys The keys to be sent.
88
- # @param [Symbol || String] device optional name of the KeyInput device to send keys with
89
- # @return [W3CActionBuilder] A self reference.
94
+ # @overload send_keys(keys, device: nil)
95
+ # @param [Array, Symbol, String] keys The key(s) to press and release
96
+ # @param [Symbol, String] device Optional name of the KeyInput device to press and release the keys on
97
+ # @overload send_keys(element, keys, device: nil)
98
+ # @param [Element] element An optional element to move to first
99
+ # @param [Array, Symbol, String] keys The key(s) to press and release
100
+ # @param [Symbol, String] device Optional name of the KeyInput device to press and release the keys on
101
+ # @return [W3CActionBuilder] A self reference
90
102
  #
91
103
 
92
104
  def send_keys(*args, device: nil)
@@ -100,6 +112,27 @@ module Selenium
100
112
 
101
113
  private
102
114
 
115
+ #
116
+ # @api private
117
+ #
118
+ # @overload key_down(key, action: nil, device: nil)
119
+ # @param [Symbol, String] key The key to press
120
+ # @param [Symbol] action The name of the key action to perform
121
+ # @param [Symbol, String] device Optional name of the KeyInput device to press the key on
122
+ # @overload key_down(element, key, action: nil, device: nil)
123
+ # @param [Element] element An optional element to move to first
124
+ # @param [Symbol, String] key The key to press
125
+ # @param [Symbol] action The name of the key action to perform
126
+ # @param [Symbol, String] device Optional name of the KeyInput device to press the key on
127
+ #
128
+ # @param [Array] args
129
+ # @option args [Element] element An optional element to move to first
130
+ # @option args [Symbol, String] key The key to perform the action with
131
+ # @param [Symbol] action The name of the key action to perform
132
+ # @param [Symbol, String] device optional name of the KeyInput device to press the key on
133
+ # @return [W3CActionBuilder] A self reference
134
+ #
135
+
103
136
  def key_action(*args, action: nil, device: nil)
104
137
  key_input = get_device(device) || key_inputs.first
105
138
  click(args.shift) if args.first.is_a? Element
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Licensed to the Software Freedom Conservancy (SFC) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The SFC licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+
20
+ require 'forwardable'
21
+ require 'logger'
22
+
23
+ module Selenium
24
+ module WebDriver
25
+ #
26
+ # @example Enable full logging
27
+ # Selenium::WebDriver.logger.level = :debug
28
+ #
29
+ # @example Log to file
30
+ # Selenium::WebDriver.logger.output = 'selenium.log'
31
+ #
32
+ # @example Use logger manually
33
+ # Selenium::WebDriver.logger.info('This is info message')
34
+ # Selenium::WebDriver.logger.warn('This is warning message')
35
+ #
36
+ class Logger
37
+ extend Forwardable
38
+
39
+ def_delegators :@logger, :debug, :debug?,
40
+ :info, :info?,
41
+ :warn, :warn?,
42
+ :error, :error?,
43
+ :fatal, :fatal?,
44
+ :level, :level=
45
+
46
+ def initialize
47
+ @logger = ::Logger.new($stdout)
48
+ @logger.progname = 'Selenium'
49
+ @logger.level = ($DEBUG ? :debug : :warn)
50
+ @logger.formatter = proc do |severity, time, progname, msg|
51
+ "#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
52
+ end
53
+ end
54
+
55
+ def output=(io)
56
+ @logger.reopen(io)
57
+ end
58
+
59
+ #
60
+ # Returns IO object used by logger internally.
61
+ #
62
+ # Normally, we would have never needed it, but we want to
63
+ # use it as IO object for all child processes to ensure their
64
+ # output is redirected there.
65
+ #
66
+ # It is only used in debug level, in other cases output is suppressed.
67
+ #
68
+ # @api private
69
+ #
70
+ def io
71
+ if debug?
72
+ @logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
73
+ else
74
+ File.new(Platform.null_device, 'w')
75
+ end
76
+ end
77
+ end # Logger
78
+ end # WebDriver
79
+ end # Selenium
@@ -47,7 +47,7 @@ module Selenium
47
47
  begin
48
48
  TCPServer.new(host, port).close
49
49
  rescue *IGNORED_ERRORS => ex
50
- $stderr.puts "port prober could not bind to #{host}:#{port} (#{ex.message})" if $DEBUG
50
+ WebDriver.logger.info("port prober could not bind to #{host}:#{port} (#{ex.message})")
51
51
  # ignored - some machines appear unable to bind to some of their interfaces
52
52
  end
53
53
  end
@@ -35,20 +35,23 @@ module Selenium
35
35
  }.freeze
36
36
 
37
37
  #
38
- # Find the first element matching the given arguments.
38
+ # Find the first element matching the given arguments
39
39
  #
40
40
  # When using Element#find_element with :xpath, be aware that webdriver
41
41
  # follows standard conventions: a search prefixed with "//" will search
42
42
  # the entire document, not just the children of this current node. Use
43
43
  # ".//" to limit your search to the children of the receiving Element.
44
44
  #
45
- # @param [:class, :class_name, :css, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath] how
46
- # @param [String] what
45
+ # @overload find_element(how, what)
46
+ # @param [Symbol, String] how The method to find the element by
47
+ # @param [String] what The locator to use
48
+ # @overload find_element(opts)
49
+ # @param [Hash] opts Find options
50
+ # @option opts [Symbol] :how Key named after the method to find the element by, containing the locator
47
51
  # @return [Element]
48
52
  #
49
53
  # @raise [Error::NoSuchElementError] if the element doesn't exist
50
54
  #
51
- #
52
55
 
53
56
  def find_element(*args)
54
57
  how, what = extract_args(args)
@@ -67,10 +70,6 @@ module Selenium
67
70
  #
68
71
  # @see SearchContext#find_element
69
72
  #
70
- # @param [:class, :class_name, :css, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath] how
71
- # @param [String] what
72
- # @return [Array<Element>]
73
- #
74
73
 
75
74
  def find_elements(*args)
76
75
  how, what = extract_args(args)
@@ -65,7 +65,7 @@ module Selenium
65
65
 
66
66
  true
67
67
  rescue SocketError, Errno::EADDRINUSE, Errno::EBADF => ex
68
- $stderr.puts "#{self}: #{ex.message}" if $DEBUG
68
+ WebDriver.logger.info("#{self}: #{ex.message}")
69
69
  false
70
70
  end
71
71
 
@@ -90,7 +90,7 @@ module Selenium
90
90
  true
91
91
  rescue *NOT_CONNECTED_ERRORS
92
92
  sock.close if sock
93
- $stderr.puts [@host, @port].inspect if $DEBUG
93
+ WebDriver.logger.info("polling for socket on #{[@host, @port].inspect}")
94
94
  false
95
95
  end
96
96
  end
@@ -37,9 +37,8 @@ module Selenium
37
37
 
38
38
  def start_process
39
39
  server_command = [@executable_path, "--port=#{@port}", *@extra_args]
40
- @process = ChildProcess.build(*server_command)
41
-
42
- @process.io.inherit! if $DEBUG
40
+ @process = ChildProcess.build(*server_command)
41
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
43
42
  @process.start
44
43
  end
45
44
 
@@ -77,7 +77,7 @@ module Selenium
77
77
  def execute(*extra_args)
78
78
  args = [self.class.path, '-no-remote'] + extra_args
79
79
  @process = ChildProcess.build(*args)
80
- @process.io.inherit! if $DEBUG
80
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
81
81
  @process.start
82
82
  end
83
83
 
@@ -214,7 +214,7 @@ module Selenium
214
214
  destination = File.join(directory, 'extensions')
215
215
 
216
216
  @extensions.each do |name, extension|
217
- p extension: name if $DEBUG
217
+ WebDriver.logger.info({extenstion: name}.inspect)
218
218
  extension.write_to(destination)
219
219
  end
220
220
  end
@@ -41,29 +41,11 @@ module Selenium
41
41
 
42
42
  def start_process
43
43
  server_command = [@executable_path, "--binary=#{Firefox::Binary.path}", "--port=#{@port}", *@extra_args]
44
- @process = ChildProcess.build(*server_command)
45
-
46
- if $DEBUG
47
- @process.io.inherit!
48
- elsif Platform.windows?
49
- # workaround stdio inheritance issue
50
- # https://github.com/mozilla/geckodriver/issues/48
51
- @process.io.stdout = @process.io.stderr = File.new(Platform.null_device, 'w')
52
- end
53
-
44
+ @process = ChildProcess.build(*server_command)
45
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
54
46
  @process.start
55
47
  end
56
48
 
57
- def stop_process
58
- super
59
- return unless Platform.windows? && !$DEBUG
60
- begin
61
- @process.io.close
62
- rescue
63
- nil
64
- end
65
- end
66
-
67
49
  def cannot_connect_error_text
68
50
  "unable to connect to Mozilla geckodriver #{@host}:#{@port}"
69
51
  end
@@ -37,9 +37,8 @@ module Selenium
37
37
 
38
38
  def start_process
39
39
  server_command = [@executable_path, "--port=#{@port}", *@extra_args]
40
- @process = ChildProcess.new(*server_command)
41
-
42
- @process.io.inherit! if $DEBUG
40
+ @process = ChildProcess.new(*server_command)
41
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
43
42
  @process.start
44
43
  end
45
44
 
@@ -34,27 +34,10 @@ module Selenium
34
34
  def start_process
35
35
  server_command = [@executable_path, "--webdriver=#{@port}", *@extra_args]
36
36
  @process = ChildProcess.build(*server_command.compact)
37
-
38
- if $DEBUG
39
- @process.io.inherit!
40
- elsif Platform.jruby?
41
- # apparently we need to read the output for phantomjs to work on jruby
42
- @process.io.stdout = @process.io.stderr = File.new(Platform.null_device, 'w')
43
- end
44
-
37
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
45
38
  @process.start
46
39
  end
47
40
 
48
- def stop_process
49
- super
50
- return unless Platform.jruby? && !$DEBUG
51
- begin
52
- @process.io.close
53
- rescue
54
- nil
55
- end
56
- end
57
-
58
41
  def cannot_connect_error_text
59
42
  "unable to connect to phantomjs @ #{uri} after #{START_TIMEOUT} seconds"
60
43
  end
@@ -33,11 +33,7 @@ module Selenium
33
33
  attr_reader :capabilities
34
34
 
35
35
  #
36
- # Initializes the bridge with the given server URL.
37
- #
38
- # @param url [String] url for the remote server
39
- # @param http_client [Object] an HTTP client instance that implements the same protocol as Http::Default
40
- # @param desired_capabilities [Capabilities] an instance of Remote::Capabilities describing the capabilities you want
36
+ # @see W3CBridge#Initialize
41
37
  #
42
38
 
43
39
  def initialize(opts = {})
@@ -665,7 +661,7 @@ module Selenium
665
661
  raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}"
666
662
  end
667
663
 
668
- puts "-> #{verb.to_s.upcase} #{path}" if $DEBUG
664
+ WebDriver.logger.info("-> #{verb.to_s.upcase} #{path}")
669
665
  http.call verb, path, command_hash
670
666
  end
671
667
 
@@ -51,10 +51,8 @@ module Selenium
51
51
  headers['Content-Type'] = "#{CONTENT_TYPE}; charset=utf-8"
52
52
  headers['Content-Length'] = payload.bytesize.to_s if [:post, :put].include?(verb)
53
53
 
54
- if $DEBUG
55
- puts " >>> #{url} | #{payload}"
56
- puts " > #{headers.inspect}"
57
- end
54
+ WebDriver.logger.info(" >>> #{url} | #{payload}")
55
+ WebDriver.logger.info(" > #{headers.inspect}")
58
56
  elsif verb == :post
59
57
  payload = '{}'
60
58
  headers['Content-Length'] = '2'
@@ -78,7 +76,7 @@ module Selenium
78
76
  code = code.to_i
79
77
  body = body.to_s.strip
80
78
  content_type = content_type.to_s
81
- puts "<- #{body}\n" if $DEBUG
79
+ WebDriver.logger.info("<- #{body}")
82
80
 
83
81
  if content_type.include? CONTENT_TYPE
84
82
  raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
@@ -85,7 +85,7 @@ module Selenium
85
85
  c.max_redirects = MAX_REDIRECTS
86
86
  c.follow_location = true
87
87
  c.timeout = @timeout if @timeout
88
- c.verbose = $DEBUG
88
+ c.verbose = WebDriver.logger.info?
89
89
 
90
90
  c
91
91
  )
@@ -36,11 +36,12 @@ module Selenium
36
36
  attr_reader :capabilities
37
37
 
38
38
  #
39
- # Initializes the bridge with the given server URL.
40
- #
41
- # @param url [String] url for the remote server
42
- # @param http_client [Object] an HTTP client instance that implements the same protocol as Http::Default
43
- # @param desired_capabilities [Capabilities] an instance of Remote::Capabilities describing the capabilities you want
39
+ # Initializes the bridge with the given server URL
40
+ # @param [Hash] opts options for the driver
41
+ # @option opts [String] :url url for the remote server
42
+ # @option opts [Integer] :port port number for the remote server
43
+ # @option opts [Object] :http_client an HTTP client instance that implements the same protocol as Http::Default
44
+ # @option opts [Capabilities] :desired_capabilities an instance of Remote::Capabilities describing the capabilities you want
44
45
  #
45
46
 
46
47
  def initialize(opts = {})
@@ -621,7 +622,7 @@ module Selenium
621
622
  raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}"
622
623
  end
623
624
 
624
- puts "-> #{verb.to_s.upcase} #{path}" if $DEBUG
625
+ WebDriver.logger.info("-> #{verb.to_s.upcase} #{path}")
625
626
  http.call verb, path, command_hash
626
627
  end
627
628
 
@@ -47,9 +47,8 @@ module Selenium
47
47
 
48
48
  def start_process
49
49
  server_command = [@executable_path, "--port=#{@port}", *@extra_args]
50
- @process = ChildProcess.build(*server_command)
51
-
52
- @process.io.inherit! if $DEBUG
50
+ @process = ChildProcess.build(*server_command)
51
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io
53
52
  @process.start
54
53
  end
55
54
 
@@ -5,7 +5,7 @@ raise "cwd must be #{root} when reading gemspec" if root != Dir.pwd
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = 'selenium-webdriver'
8
- s.version = '3.1.0'
8
+ s.version = '3.2.0'
9
9
 
10
10
  s.authors = ['Alex Rodionov', 'Titus Fortner']
11
11
  s.email = ['p0deje@gmail.com', 'titusfortner@gmail.com']
@@ -26,7 +26,7 @@ HTML of the application.'
26
26
  s.add_runtime_dependency 'childprocess', ['~> 0.5']
27
27
  s.add_runtime_dependency 'websocket', ['~> 1.0']
28
28
 
29
- s.add_development_dependency 'rspec', ['< 3.5']
29
+ s.add_development_dependency 'rspec', ['~> 3.0']
30
30
  s.add_development_dependency 'rack', ['~> 1.0']
31
31
  s.add_development_dependency 'ci_reporter', ['~> 1.6', '>= 1.6.2']
32
32
  s.add_development_dependency 'webmock', ['~> 2.0']
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 3.1.0
5
+ version: 3.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alex Rodionov
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2017-02-14 00:00:00 -06:00
14
+ date: 2017-02-23 00:00:00 -06:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -53,9 +53,9 @@ dependencies:
53
53
  requirement: &id004 !ruby/object:Gem::Requirement
54
54
  none: false
55
55
  requirements:
56
- - - <
56
+ - - ~>
57
57
  - !ruby/object:Gem::Version
58
- version: "3.5"
58
+ version: "3.0"
59
59
  type: :development
60
60
  version_requirements: *id004
61
61
  - !ruby/object:Gem::Dependency
@@ -151,6 +151,7 @@ files:
151
151
  - lib/selenium/webdriver/common/keyboard.rb
152
152
  - lib/selenium/webdriver/common/keys.rb
153
153
  - lib/selenium/webdriver/common/log_entry.rb
154
+ - lib/selenium/webdriver/common/logger.rb
154
155
  - lib/selenium/webdriver/common/logs.rb
155
156
  - lib/selenium/webdriver/common/mouse.rb
156
157
  - lib/selenium/webdriver/common/navigation.rb