Slide 1

Slide 1 text

capybara

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

overview automated user interaction automatically waits for asynchronous tasks driver agnostic high level access to ui elements

Slide 4

Slide 4 text

test frameworks cucumber rspec test::unit minitest::spec

Slide 5

Slide 5 text

drivers

Slide 6

Slide 6 text

rack_test default fast, no server no js mechanize rack_test with remote server

Slide 7

Slide 7 text

selenium 2.0 aka webdriver firefox, chrome, ie, ...

Slide 8

Slide 8 text

webkit headless QtWebKitk logging / messages screenshots cookies resizing the window

Slide 9

Slide 9 text

poltergeist headless phantomjs screenshots resizing the window remote debugging (web inspector) no X (CI integration)

Slide 10

Slide 10 text

dsl

Slide 11

Slide 11 text

navigating visit('/projects') visit(post_comments_path(post))

Slide 12

Slide 12 text

clicking links and buttons click_link('id-of-link') click_link('Link Text') click_button('Save') click_on('Link Text') # links or buttons

Slide 13

Slide 13 text

interacting with forms fill_in('Username', :with => 'user') choose('A Radio Button') check('A Checkbox') attach_file('Image', '/path/to/image.jpg') select('Option', :from => 'Select Box')

Slide 14

Slide 14 text

querying (rspec matchers) page.should have_selector('table tr') page.should have_selector( :xpath, '//table/tr') page.should have_xpath('//table/tr') page.should have_css('table tr.foo') page.should have_content('foo')

Slide 15

Slide 15 text

finding find_field('First Name').value find_link('Hello').visible? find_button('Send').click find("#overlay").find("h1").click all('a').each { |a| a[:href] }

Slide 16

Slide 16 text

scoping within("li#employee") do fill_in 'Name', :with => 'Jimmy' end

Slide 17

Slide 17 text

scripting page.execute_script("$('body').empty()") result = page.evaluate_script('4 + 4');

Slide 18

Slide 18 text

debugging save_and_open_page # snapshot print page.html

Slide 19

Slide 19 text

setup

Slide 20

Slide 20 text

Capybara.default_driver = :selenium # sinatra Capybara.app = App # remote app Capybara.app_host = 'http://www.google.com'

Slide 21

Slide 21 text

per spec Capybara.javascript_driver = :selenium # ... describe 'requires js', :js => true do it 'will use the default js driver' it 'will switch to one specific driver', :driver => :webkit end

Slide 22

Slide 22 text

set browser Capybara.register_driver :selenium do |app| Capybara::Selenium::Driver.new( app, :browser => :chrome ) end

Slide 23

Slide 23 text

in the wild

Slide 24

Slide 24 text

metaflop web based platform for metafonts and related type projects modulator experimental font generation export as otf, webfont

Slide 25

Slide 25 text

spec sample 1 context 'when i change the unit width' do it 'should show the loading indicator' do fill_in 'param-unit-width', :with => 2 page.should have_selector( '.preview-loading-text') end end

Slide 26

Slide 26 text

spec sample 2 context 'when i enable anatomy' do it 'shows the anatomy image' do within '#menu' do click_link 'on' end page.should have_selector '#info-panel' end end

Slide 27

Slide 27 text

spec sample 3 context 'when i click the "webfont" link' do it 'should call the font generator url' do click_link('webfont') current_url.should include 'modulator/export/font/web' end end

Slide 28

Slide 28 text

problems

Slide 29

Slide 29 text

general dialogs (downloads) new openend windows driver specialties

Slide 30

Slide 30 text

selenium slow, startup slow, random errors no http response no .trigger() (e.g. mouse over) installation

Slide 31

Slide 31 text

solution avoid selenium use headless test visual concerns manually

Slide 32

Slide 32 text

links capybara homepage webkit poltergeist selenium chrome driver metaflop

Slide 33

Slide 33 text

@alexisreigel koffeinfrei koffeinfrei.org