Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capybara save_and_open_page doesn't reflect radio buttons tate

I am trying to select the radio button for the freelancer the code is as follows (when we inspect the element on browser)

<label for="registration_payer_type_business"><input checked="checked" id="registration_payer_type_business" name="registration[payer_type]" type="radio" value="business">
          Company
          </label>

<label for="registration_payer_type_freelancer"><input id="registration_payer_type_freelancer" name="registration[payer_type]" type="radio" value="freelancer">
          Freelancer
          </label>

I have tried

page.choose("registration_payer_type_freelancer")

This doesn't give any error but when and save and open page in capybara still the radio box is not selected against freelancer. I would appreciate if people can give example using xpath and choose.

like image 724
Kanwar Baweja Avatar asked Jun 29 '17 10:06

Kanwar Baweja


1 Answers

The real issue you're most likely having is that save_and_open_page saves the HTML with the current attribute values NOT the current property values . This means the fact that you've selected a radio button (which changes the checked property value, not attribute value, won't necessarily be shown). You're better off using save_and_open_screenshot if you want to see the current state of a page. That being said below is ways you can select radio buttons.

To select a specific radio button with Capybara you can use the id, name, label text, and value too if needed to make unique (with name for instance)

choose('registration_payer_type_freelancer') # id
choose('registration[payer_type]', option: 'freelancer') # name and value to make unique
choose('Freelancer') # label text
choose(option: 'freelancer') # just value if the only radio button with that value

In all those cases, if the actual radio button input element is non-visible (for styling purposes, etc) on the page and you want to instead click the visible label you can pass allow_label_click: true

choose('registration_payer_type_freelancer', allow_label_click: true) # find by id and select by clicking the label if input is non-visible

Other options you could use is to just find by CSS (the :css argument can be ignored if your default selector type is the default :css)

find(:css, '#registration_payer_type_freelancer').click

You could also use XPath queries to locate the element, but they're really not necessary 98% of the time (more people correctly understand CSS and with scoping of finders it can generally be used to get any element), and have issues to be aware of - https://github.com/teamcapybara/capybara/blob/master/README.md#beware-the-xpath--trap

find(:xpath, './/input[@value="freelancer"]').click
like image 109
Thomas Walpole Avatar answered Oct 20 '22 18:10

Thomas Walpole