Class: Selenium::WebDriver::ChildProcess Private

Inherits:
Object
  • Object
show all
Defined in:
lib/selenium/webdriver/common/child_process.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

API:

  • private

Defined Under Namespace

Classes: TimeoutError

Constant Summary collapse

SIGTERM =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

API:

  • private

'TERM'
SIGKILL =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

API:

  • private

'KILL'
POLL_INTERVAL =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

API:

  • private

0.1

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*command) ⇒ ChildProcess

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of ChildProcess.

API:

  • private



42
43
44
45
46
47
# File 'lib/selenium/webdriver/common/child_process.rb', line 42

def initialize(*command)
  @command = command
  @detach = false
  @pid = nil
  @status = nil
end

Instance Attribute Details

#detachObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



35
36
37
# File 'lib/selenium/webdriver/common/child_process.rb', line 35

def detach
  @detach
end

#ioObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



49
50
51
# File 'lib/selenium/webdriver/common/child_process.rb', line 49

def io
  @io ||= Platform.null_device
end

Class Method Details

.build(*command) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



38
39
40
# File 'lib/selenium/webdriver/common/child_process.rb', line 38

def self.build(*command)
  new(*command)
end

Instance Method Details

#alive?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

API:

  • private



74
75
76
# File 'lib/selenium/webdriver/common/child_process.rb', line 74

def alive?
  @pid && !exited?
end

#exited?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

API:

  • private



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/selenium/webdriver/common/child_process.rb', line 78

def exited?
  return false unless @pid

  WebDriver.logger.debug("Checking if #{@pid} is exited:", id: :process)
  _, @status = waitpid2(@pid, Process::WNOHANG | Process::WUNTRACED) if @status.nil?
  return false if @status.nil?

  exit_code = @status.exitstatus || @status.termsig
  WebDriver.logger.debug("  -> exit code is #{exit_code.inspect}", id: :process)

  !!exit_code
rescue Errno::ECHILD, Errno::ESRCH
  WebDriver.logger.debug("  -> process: #{@pid} already finished", id: :process)
  true
end

#poll_for_exit(timeout) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Raises:

API:

  • private



94
95
96
97
98
99
100
101
# File 'lib/selenium/webdriver/common/child_process.rb', line 94

def poll_for_exit(timeout)
  WebDriver.logger.debug("Polling #{timeout} seconds for exit of #{@pid}", id: :process)

  end_time = Time.now + timeout
  sleep POLL_INTERVAL until exited? || Time.now > end_time

  raise TimeoutError, "  ->  #{@pid} still alive after #{timeout} seconds" unless exited?
end

#startObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



53
54
55
56
57
58
59
60
61
62
# File 'lib/selenium/webdriver/common/child_process.rb', line 53

def start
  options = {i[out err] => io}
  options[:pgroup] = true unless Platform.windows? # NOTE: this is a bug only in Windows 7

  WebDriver.logger.debug("Starting process: #{@command} with #{options}", id: :process)
  @pid = Process.spawn(*@command, options)
  WebDriver.logger.debug("  -> pid: #{@pid}", id: :process)

  Process.detach(@pid) if detach
end

#stop(timeout = 3) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



64
65
66
67
68
69
70
71
72
# File 'lib/selenium/webdriver/common/child_process.rb', line 64

def stop(timeout = 3)
  return unless @pid
  return if exited?

  terminate_and_wait_else_kill(timeout)
rescue Errno::ECHILD, Errno::ESRCH => e
  # Process exited earlier than terminate/kill could catch
  WebDriver.logger.debug("    -> process: #{@pid} does not exist (#{e.class.name})", id: :process)
end

#waitObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



103
104
105
106
107
# File 'lib/selenium/webdriver/common/child_process.rb', line 103

def wait
  return if exited?

  _, @status = waitpid2(@pid)
end