ruby on rails - Kuinka saada nykyinen polku kyselymerkkijonolla käyttämällä Capybara

original title: "ruby on rails - How to get current path with query string using Capybara"


The page url is something like /people?search=name while I used current_path method of capybara it returned /people only.

current_path.should == people_path(:search => 'name')

But it fails saying

expected: "/people?search=name"
got: "/people"

How we can make it pass? Is there is any way to do this?

Sivun URL-osoite on jotain / ihmiset? Search = nimi, kun käytin capybara-menetelmää current_path, se palautti / vain ihmiset. current_path.should == people_path (: search => 'name'), mutta se ei sano ...

Tämä on yhteenveto käännöksen jälkeen. Jos haluat tarkastella koko käännöstä, napsauta käännä-kuvaketta

Kaikki vastaukset
  • Translate

    I've updated this answer to reflect modern conventions in capybara. I think this is ideal since this is the accepted answer, and what many people are being referred to when looking for a solution. With that said, the correct way to check the current path is to use the has_current_path? matcher provided by Capybara, as documented here: Click Here

    Example usage:

    expect(page).to have_current_path(people_path(search: 'name'))

    As you can see in the documentation, other options are available. If the current page is /people?search=name but you only care that it's on the /people page regardless of the param, you can send the only_path option:

    expect(page).to have_current_path(people_path, only_path: true)

    Additionally, if you want to compare the entire URL:

    expect(page).to have_current_path(people_url, url: true)

    Credit to Tom Walpole for pointing out this method.

  • Translate

    I replaced the _path method with _url to achieve comparing the full urls with parameters.

    current_url.should == people_url(:search => 'name')

  • Translate

    Just updating this question for modern times. The current best practice for checking current_paths when using Capybara 2.5+ is to use the current_path matcher, which will use Capybaras waiting behavior to check the path. If wanting to check against the request_uri (path and query string)

    expect(page).to have_current_path(people_path(:search => 'name'))  

    If only wanting the path part (ignoring the query string)

    expect(page).to have_current_path(people_path, only_path: true) # Capybara < 2.16
    expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16

    If wanting to match the full url

    expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
    expect(page).to have_current_path(people_url) # Capybara >= 2.16

    the matcher will take a string which is compared with == or a regex to match against

    expect(page).to have_current_path(/search=name/)

  • Translate

    I know an answer has been selected, but I just wanted to give an alternative solution. So:

    To get the path and querystring, like request.fullpath in Rails, you can do:

    URI.parse(current_url).request_uri.should == people_path(:search => 'name')

    You can also do a helper method in your test class (like ActionDispatch::IntegrationTest) like this (which is what I did):

    def current_fullpath

    Hope this helps.

  • Translate

    EDIT: as Tinynumberes mentioned, this fails for URLs with port number. Keeping it here in case anyone else has the same brilliant idea.


    golfs exactly as well (35 chars) as URI.parse(current_url).request_uri, but is potentially faster because there is no explicit URI parsing involved.

    I have made a pull request to add this to Capybara at: