class Capybara::Driver::Base

Attributes

requests[W]
responses[W]
visited[RW]

Public Instance Methods

current_memory() click to toggle source
# File lib/kimurai/capybara_ext/driver/base.rb, line 15
def current_memory
  driver_pid = pid

  all = (get_descendant_processes(driver_pid) << driver_pid).uniq
  all.map { |pid| get_process_memory(pid) }.sum
end
requests() click to toggle source
# File lib/kimurai/capybara_ext/driver/base.rb, line 7
def requests
  @requests ||= 0
end
responses() click to toggle source
# File lib/kimurai/capybara_ext/driver/base.rb, line 11
def responses
  @responses ||= 0
end

Private Instance Methods

get_descendant_processes(base) click to toggle source
# File lib/kimurai/capybara_ext/driver/base.rb, line 24
def get_descendant_processes(base)
  descendants = Hash.new { |ht, k| ht[k] = [k] }
  Hash[*`ps -eo pid,ppid`.scan(/\d+/).map(&:to_i)].each do |pid, ppid|
    descendants[ppid] << descendants[pid]
  end

  descendants[base].flatten - [base]
end
get_process_memory(pid) click to toggle source

github.com/schneems/get_process_mem Note: for Linux takes PSS (not RSS) memory (I think PSS better fits in this case)

# File lib/kimurai/capybara_ext/driver/base.rb, line 35
def get_process_memory(pid)
  case @platform ||= Gem::Platform.local.os
  when "linux"
    begin
      file = Pathname.new "/proc/#{pid}/smaps"
      return 0 unless file.exist?

      lines = file.each_line.select { |line| line.match(/^Pss/) }
      return 0 if lines.empty?

      lines.reduce(0) do |sum, line|
        line.match(/(?<value>(\d*\.{0,1}\d+))\s+(?<unit>\w\w)/) do |m|
          sum += m[:value].to_i
        end

        sum
      end
    rescue Errno::EACCES
      0
    end
  when "darwin"
    mem = `ps -o rss= -p #{pid}`.strip
    mem.empty? ? 0 : mem.to_i
  else
    raise "Can't check process memory, wrong type of platform: #{@platform}"
  end
end