Skip to content

Instantly share code, notes, and snippets.

@abotalov
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abotalov/9608318 to your computer and use it in GitHub Desktop.
Save abotalov/9608318 to your computer and use it in GitHub Desktop.
Check performance of first, match: :first
require 'capybara'
require 'benchmark'
html = DATA.read
$app = proc { |env| [200, { "Content-Type" => "text/html" }, [html] ] }
def benchmark_average
sum = 0
session = Capybara::Session.new(:selenium, $app)
session.visit("/")
100.times do
sum += Benchmark.realtime { yield(session) }
end
session.driver.quit
puts sum / 100
end
# Selenium methods that IMO Capybara invokes are in parentheses
puts '1. No filters (1 * find_elements):'
benchmark_average { |session| session.first('.row', visible: false) }
puts "\n2a. No filters + text for first (1 * find_elements + 1 * execute_script):"
benchmark_average { |session| session.first('.row', visible: false).text(:all) }
puts "\n2b. No filters + visible for first (1 * find_elements + 1 * displayed?):"
benchmark_average { |session| session.first('.row', visible: false).visible? }
puts "\n2c. No filters + visible and text for first (1 * find_elements + 1 * displayed? + 1 * text):"
benchmark_average { |session| el = session.first('.row', visible: false); el.visible?; el.text }
puts "\n3a. Text filter (1 * find_elements + 30 * execute_script):"
benchmark_average { |session| session.first('.row', text: 'some text 1', visible: false) }
puts "\n3b. Visible filter (1 * find_elements + 30 * displayed?):"
benchmark_average { |session| session.first('.row') }
puts "\n3c. Visible + text filter (1 * find_elements + 30 * text + 1 * displayed?):"
benchmark_average { |session| session.first('.row', text: 'some text 1') }
__END__
<!doctype html>
<html>
<body>
<div class="row">some text 1</div>
<div class="row">some text 2</div>
<div class="row">some text 3</div>
<div class="row">some text 4</div>
<div class="row">some text 5</div>
<div class="row">some text 7</div>
<div class="row">some text 8</div>
<div class="row">some text 9</div>
<div class="row">some text 10</div>
<div class="row">some text 11</div>
<div class="row">some text 12</div>
<div class="row">some text 13</div>
<div class="row">some text 14</div>
<div class="row">some text 15</div>
<div class="row">some text 16</div>
<div class="row">some text 17</div>
<div class="row">some text 18</div>
<div class="row">some text 19</div>
<div class="row">some text 20</div>
<div class="row">some text 21</div>
<div class="row">some text 22</div>
<div class="row">some text 23</div>
<div class="row">some text 24</div>
<div class="row">some text 25</div>
<div class="row">some text 26</div>
<div class="row">some text 27</div>
<div class="row">some text 28</div>
<div class="row">some text 29</div>
<div class="row">some text 30</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment