Class: Selenium::WebDriver::Firefox::Launcher
- Inherits:
-
Object
- Object
- Selenium::WebDriver::Firefox::Launcher
- Defined in:
- lib/selenium/webdriver/firefox/launcher.rb
Constant Summary collapse
- SOCKET_LOCK_TIMEOUT =
45
- STABLE_CONNECTION_TIMEOUT =
60
Instance Method Summary collapse
- #assert_profile ⇒ Object
- #can_connect? ⇒ Boolean
- #connect_until_stable ⇒ Object
- #create_profile ⇒ Object
- #fetch_profile ⇒ Object
- #find_free_port ⇒ Object
- #free_port?(port) ⇒ Boolean
-
#initialize(binary, port = DEFAULT_PORT, profile = DEFAULT_PROFILE_NAME) ⇒ Launcher
constructor
A new instance of Launcher.
- #launch ⇒ Object
- #start ⇒ Object
- #start_silent_and_wait ⇒ Object
- #url ⇒ Object
- #with_lock ⇒ Object
Constructor Details
#initialize(binary, port = DEFAULT_PORT, profile = DEFAULT_PROFILE_NAME) ⇒ Launcher
Returns a new instance of Launcher.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 13 def initialize(binary, port = DEFAULT_PORT, profile = DEFAULT_PROFILE_NAME) @binary = binary @port = port.to_i if profile.kind_of? Profile @profile = profile else @profile_name = profile @profile = nil end # need to be really specific about what host to use # # on os x, "localhost" will resolve to 3 different addresses (see /etc/hosts) # Ruby will loop over these and happily bind to the same port on each one, # making it completely unusable for our purposes. # @host = "127.0.0.1" end |
Instance Method Details
#assert_profile ⇒ Object
146 147 148 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 146 def assert_profile raise Error::WebDriverError, "must create_profile first" unless @profile end |
#can_connect? ⇒ Boolean
117 118 119 120 121 122 123 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 117 def can_connect? TCPSocket.new(@host, @port).close true rescue Errno::ECONNREFUSED, Errno::ENOTCONN, SocketError => e $stderr.puts "#{e.} for #{@host}:#{@port}" if $DEBUG false end |
#connect_until_stable ⇒ Object
106 107 108 109 110 111 112 113 114 115 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 106 def connect_until_stable max_time = Time.now + STABLE_CONNECTION_TIMEOUT until Time.now >= max_time return if can_connect? sleep 0.25 end raise Error::WebDriverError, "unable to obtain stable firefox connection in #{STABLE_CONNECTION_TIMEOUT} seconds" end |
#create_profile ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 81 def create_profile unless @profile fetch_profile if @profile.nil? raise Error, WebDriverError, "could not find or create profile: #{profile.inspect}" end end @profile.delete_extensions_cache @profile.port = @port @profile.add_webdriver_extension(true) @profile.update_user_prefs end |
#fetch_profile ⇒ Object
133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 133 def fetch_profile existing = Profile.from_name @profile_name unless existing @binary.create_base_profile @profile_name Profile.ini.refresh existing = Profile.from_name @profile_name raise Error::WebDriverError, "unable to find or create new profile" unless existing end @profile = existing end |
#find_free_port ⇒ Object
71 72 73 74 75 76 77 78 79 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 71 def find_free_port port = @port until free_port?(port) port += 1 end @port = port end |
#free_port?(port) ⇒ Boolean
125 126 127 128 129 130 131 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 125 def free_port?(port) s = TCPServer.new(@host, port) s.close true rescue SocketError, Errno::EADDRINUSE false end |
#launch ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 37 def launch with_lock do find_free_port create_profile start_silent_and_wait start connect_until_stable end self end |
#start ⇒ Object
95 96 97 98 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 95 def start assert_profile @binary.start_with @profile end |
#start_silent_and_wait ⇒ Object
100 101 102 103 104 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 100 def start_silent_and_wait assert_profile @binary.start_with @profile, "--silent" @binary.wait end |
#url ⇒ Object
33 34 35 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 33 def url "http://#{@host}:#{@port}/hub" end |
#with_lock ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/selenium/webdriver/firefox/launcher.rb', line 49 def with_lock max_time = Time.now + SOCKET_LOCK_TIMEOUT locking_port = @port - 1 until Time.now > max_time begin socket_lock = TCPServer.new(@host, locking_port) # make sure the fd is not inherited by firefox socket_lock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC yield return rescue SocketError, Errno::EADDRINUSE sleep 0.1 end end raise Error::WebDriverError, "unable to bind to locking port #{locking_port} within #{SOCKET_LOCK_TIMEOUT} seconds" ensure socket_lock.close if socket_lock end |