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!

marknisin-tg commented Jan 17, 2016

amazing list , thank you!

@jorgevbo

This comment has been minimized.

Show comment
Hide comment
@jorgevbo

jorgevbo commented Apr 8, 2016

Cool!

@ruslanshakirov

This comment has been minimized.

Show comment
Hide comment
@ruslanshakirov

ruslanshakirov Jun 16, 2016

wow, very useful

ruslanshakirov commented Jun 16, 2016

wow, very useful

@ehteshamshareef

This comment has been minimized.

Show comment
Hide comment
@ehteshamshareef

ehteshamshareef commented Feb 9, 2017

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?

samkay123 commented 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?

@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

pardhiva16 commented Nov 18, 2017

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']")

mockdeep commented 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']")
@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 👍

Circuit8 commented Jan 26, 2018

Thanks very nice 👍

@SofiaSousa

This comment has been minimized.

Show comment
Hide comment
@SofiaSousa

SofiaSousa Feb 14, 2018

Thanks for your share!

SofiaSousa commented Feb 14, 2018

Thanks for your share!

@minghz

This comment has been minimized.

Show comment
Hide comment
@rafael-acerqueira

This comment has been minimized.

Show comment
Hide comment
@rafael-acerqueira

rafael-acerqueira May 13, 2018

Thanks for sharing !

rafael-acerqueira commented May 13, 2018

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.

hirokihokari commented 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.

@Kharouk

This comment has been minimized.

Show comment
Hide comment
@Kharouk

Kharouk Sep 24, 2018

Thanks for this!

Kharouk commented Sep 24, 2018

Thanks for this!

@FarooqSyed0

This comment has been minimized.

Show comment
Hide comment
@FarooqSyed0

FarooqSyed0 Oct 17, 2018

Thank you! :)

FarooqSyed0 commented Oct 17, 2018

Thank you! :)

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