Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Capybara cheatsheet

Capybara Actions

# Anchor
click_link 'Save'

# Button
click_button 'awesome'

# Both above
click_link_or_button 'Save'

# Text (area) field
fill_in 'Name', with: 'Content'

# Checkbox
check 'Content'
uncheck 'Content'

# Radio button
choose 'Content'

# Select option from select tag
select 'Option', from: 'Label'

# File input
attach_file Rails.root.join('spec/fixture/some_file.png')

Capybara Finders

page.all(:xpath, '//a')

page.first(:xpath, '//a')

page.find('//textarea[@id="additional_newline"]')

page.find(:xpath, "//input[@id='form_pets_dog']")['checked']
# => true

page.find(:css, '#with_focus_event').trigger(:focus)

page.find(:css,'.wrapper').hover

page.find_field("test_field").value
# => 'blah'

page.find_by_id('red').tag_name
# => 'a'

# finds invisible elements when false
page.find_by_id("hidden_via_ancestor", visible: false)

page.find_button('What an Awesome')[:value]
# => 'awesome'

page.find_link('abo').text
# => 'labore'

page.find_link('other')[:href]
# => '/some_uri'

Note: find will wait for an element to appear on the page, as explained in the Ajax section. If the element does not appear it will raise an error.

Note: In XPath the expression // means something very specific, and it might not be what you think. Contrary to common belief, // means "anywhere in the document" not "anywhere in the current context".

Capybara Scoped Finder within

within(search_form) do
  fill_in 'Name', with: 'iOS 7'
  click_button 'Search'
end

def search_form
  '.search_form'
end

within_fieldset("villain_fieldset") do
  # ...
end

within_table("some_table") do
  # ...
end

# Execute the given block within the given iframe using given frame name or index.
#
within_frame('some_frame') do
end

save_page

# You need to install launchy gem.
save_and_open_page

Capybara Common

visit("http://google.com")

page.current_url

# Execute the given script, not returning a result. This is useful for scripts that return
# complex objects, such as jQuery statements. +execute_script+ should be used over
# +evaluate_script+ whenever possible.
#
page.execute_script("$('#change').text('Funky Doodle')")

# Evaluate the given JavaScript and return the result. Be careful when using this with
# scripts that return complex objects, such as jQuery statements. +execute_script+ might
# be a better alternative.
#
page.evaluate_script("1+3")
# => 4

using_wait_time 6 do
  # ... Changed Capybara.default_wait_time in this block scope.
end

Capybara Matchers

expect(page).to have_content("Some Content")
expect(page).to have_no_content("Some Content")

# True if there is a anchor tag with text matching regex
expect(page).to have_xpath("//a")
expect(page).to have_xpath("//a",:href => "google.com")
expect(page).to have_xpath("//a[@href => 'google.com']")
expect(page).to have_xpath("//a[contains(.,'some string')]")
expect(page).to have_xpath("//p//a", :text => /re[dab]i/i, :count => 1)

 # can take both xpath and css as input and can take arguments similar to both have_css and have_xpath
 expect(page).to have_selector(:xpath, "//p/h1")
 expect(page).to have_selector(:css, "p a#post_edit_path")

 expect(page).to have_css("input#post_title")
 expect(page).to have_css("input#post_title", :value => "Capybara cheatsheet")

 # True if there are 3 input tags in response
 expect(page).to have_css("input", :count => 3)

 # True if there or fewer or equal to 3 input tags
 expect(page).to have_css("input", :maximum => 3)

 # True if there are minimum of 3 input tags
 expect(page).to have_css("input", :minimum => 3)

 # True if there 1 to 3 input tags
 expect(page).to have_css("input", :between => 1..3)

 # True if there is a anchor tag with text hello
 expect(page).to have_css("p a", :text => "hello")
 expect(page).to have_css("p a", :text => /[hH]ello(.+)/i)

# For making capybara to take css as default selector
Capybara.default_selector = :css

# checks for the presence of the input tag
expect(page).to have_selector("input")

# checks for input tag with value
expect(page).to have_selector("input", :value =>"Post Title")

expect(page).to have_no_selector("input")

# For making capybara to take css as default selector
Capybara.default_selector = :xpath
# checks for the presence of the input tag
expect(page).to have_selector("//input")

# checks for input tag with value
expect(page).to have_selector("//input", :value =>"Post Title")

# checks for presence of a input field named FirstName in a form
expect(page).to have_field("FirstName")

expect(page).to have_field("FirstName", :value => "Rambo")
expect(page).to have_field("FirstName", :with => "Rambo")

expect(page).to have_link("Foo")
expect(page).to have_link("Foo", :href=>"googl.com")
expect(page).to have_no_link("Foo", :href=>"google.com")
@tomas-stefano

This comment has been minimized.

Show comment
Hide comment
@tomas-stefano

tomas-stefano Sep 22, 2013

Valeu @brennovich pela contribuição!! :)

Owner

tomas-stefano commented Sep 22, 2013

Valeu @brennovich pela contribuição!! :)

@marknisin-tg

This comment has been minimized.

Show comment
Hide comment
@marknisin-tg

marknisin-tg Jan 17, 2016

amazing list , thank you!

amazing list , thank you!

@jorgevbo

This comment has been minimized.

Show comment
Hide comment

jorgevbo commented Apr 8, 2016

Cool!

@ruslanshakirov

This comment has been minimized.

Show comment
Hide comment
@ruslanshakirov

ruslanshakirov Jun 16, 2016

wow, very useful

wow, very useful

@ehteshamshareef

This comment has been minimized.

Show comment
Hide comment

Nice

@samkay123

This comment has been minimized.

Show comment
Hide comment
@samkay123

samkay123 Apr 27, 2017

expect(min_warning).to eq(min_warning) the various warnings are passed in the scenario outline is this best practice of anyone know of any other way to check warnings using scenario outline?

expect(min_warning).to eq(min_warning) the various warnings are passed in the scenario outline is this best practice of anyone know of any other way to check warnings using scenario outline?

@pardhiva16

This comment has been minimized.

Show comment
Hide comment
@pardhiva16

pardhiva16 Nov 18, 2017

Thank you for providing this commands for Capybara Ruby Cucumber Automation Framework

Thank you for providing this commands for Capybara Ruby Cucumber Automation Framework

@mockdeep

This comment has been minimized.

Show comment
Hide comment
@mockdeep

mockdeep Dec 26, 2017

I don't think the value: key is valid here. I get the error:

ArgumentError:
        invalid keys :value, should be one of :count, :minimum, :maximum, :between, :text, :id, :class, :visible, :exact, :exact_text, :match, :wait, :filter_set

Instead I need to use:

expect(page).to have_selector("input[value='Post Title']")

I don't think the value: key is valid here. I get the error:

ArgumentError:
        invalid keys :value, should be one of :count, :minimum, :maximum, :between, :text, :id, :class, :visible, :exact, :exact_text, :match, :wait, :filter_set

Instead I need to use:

expect(page).to have_selector("input[value='Post Title']")
@mveer99

This comment has been minimized.

Show comment
Hide comment
@mveer99

mveer99 Dec 29, 2017

@mockdeep you can use it like
expect(page).to have_selector('input', text: 'Post Title')

mveer99 commented Dec 29, 2017

@mockdeep you can use it like
expect(page).to have_selector('input', text: 'Post Title')

@Circuit8

This comment has been minimized.

Show comment
Hide comment
@Circuit8

Circuit8 Jan 26, 2018

Thanks very nice 👍

Thanks very nice 👍

@SofiaSousa

This comment has been minimized.

Show comment
Hide comment
@SofiaSousa

SofiaSousa Feb 14, 2018

Thanks for your share!

Thanks for your share!

@rafael-acerqueira

This comment has been minimized.

Show comment
Hide comment
@rafael-acerqueira

rafael-acerqueira May 13, 2018

Thanks for sharing !

Thanks for sharing !

@hirokihokari

This comment has been minimized.

Show comment
Hide comment
@hirokihokari

hirokihokari Jun 7, 2018

why do you guys think have_css matcher is named the way it is? I mean, it sure deals with css identifiers, but have_css gives(at least to me) the impression that the page has certain stylesheet loading.

why do you guys think have_css matcher is named the way it is? I mean, it sure deals with css identifiers, but have_css gives(at least to me) the impression that the page has certain stylesheet loading.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment