Class: Selenium::WebDriver::PhantomJS::Service Private

Inherits:
Object
  • Object
show all
Defined in:
lib/selenium/webdriver/phantomjs/service.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

Constant Summary collapse

START_TIMEOUT =

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

20
STOP_TIMEOUT =

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

5
DEFAULT_PORT =

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

8910
MISSING_TEXT =

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

"Unable to find phantomjs executable."

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(executable_path, port) ⇒ Service

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 Service.

API:

  • private



31
32
33
34
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 31

def initialize(executable_path, port)
  @uri        = URI.parse "http://#{Platform.localhost}:#{port}"
  @executable = executable_path
end

Instance Attribute Details

#uriObject (readonly)

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



15
16
17
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 15

def uri
  @uri
end

Class Method Details

.default_service(port = nil) ⇒ 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



27
28
29
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 27

def self.default_service(port = nil)
  new executable_path, port || PortProber.above(DEFAULT_PORT)
end

.executable_pathObject

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



17
18
19
20
21
22
23
24
25
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 17

def self.executable_path
  @executable_path ||= (
    path = PhantomJS.path
    path or raise Error::WebDriverError, MISSING_TEXT
    Platform.assert_executable path

    path
  )
end

Instance Method Details

#create_process(args) ⇒ 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



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 73

def create_process(args)
  server_command = [@executable, "--webdriver=#{@uri.port}", *args]
  process = ChildProcess.build(*server_command.compact)

  if $DEBUG == true
    process.io.inherit!
  elsif Platform.jruby?
    # apparently we need to read the output for phantomjs to work on jruby
    process.io.stdout = process.io.stderr = File.new(Platform.null_device, 'w')
  end

  process
end

#start(args = []) ⇒ 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



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 36

def start(args = [])
  if @process && @process.alive?
    raise "already started: #{@uri.inspect} #{@executable.inspect}"
  end

  @process = create_process(args)
  @process.start

  socket_poller = SocketPoller.new Platform.localhost, @uri.port, START_TIMEOUT

  unless socket_poller.connected?
    raise Error::WebDriverError, "unable to connect to phantomjs @ #{@uri} after #{START_TIMEOUT} seconds"
  end

  Platform.exit_hook { stop } # make sure we don't leave the server running
end

#stopObject

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
63
64
65
66
67
68
69
70
71
# File 'lib/selenium/webdriver/phantomjs/service.rb', line 53

def stop
  return if @process.nil? || @process.exited?

  Net::HTTP.start(uri.host, uri.port) do |http|
    http.open_timeout = STOP_TIMEOUT / 2
    http.read_timeout = STOP_TIMEOUT / 2

    http.get("/shutdown")
  end

  @process.poll_for_exit STOP_TIMEOUT
rescue ChildProcess::TimeoutError
  # ok, force quit
  @process.stop STOP_TIMEOUT

  if Platform.jruby? && !$DEBUG
    @process.io.close rescue nil
  end
end