Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capybara: Unable to find css

I am using capybara to click a checkbox, however it can't seem to find it no matter what I do. I am able to correctly find both the span and the label inside the span, but not the input I actually need.

Here is the checkbox

<span class="checkbox tos">   <input id="agreement" name="agreement" onclick="agreeValidate();" type="checkbox" value="false">   <label for="agreement">I accept the <a href="http://www.dev.com:3000/terms" target="_blank">Terms of Use</a>, <a href="http://www.dev.com:3000/privacy" target="_blank">Privacy Policy</a>, and am at least 13 years old</label> </span> 

And here are some of the things I have tried

page.check('agreement') find(:css, '#agreement').set(true) find('#agreement').set(true) find('#agreement').click 

However, they all give me the same error

Unable to find css "#agreement" (Capybara::ElementNotFound) 

I am also wondering will any of these methods fire off the onclick method, when the checkbox is clicked? I feel like find(:css, '#agreement').set(true) will not trigger the onclick event. However, I am not sure about the rest.

Update

I have also tried selecting the element through xpath. Here are the various things I have found out

find(:xpath, '//*[@id="registration"]/span[2]') 

This is able to find the span element no problem

find(:xpath, '//*[@id="registration"]/span[2]/input') 

This can't find the element I need, but this xpath correctly selects the element in chrome's console

find(:xpath, '//*[@id="agreement"]') 

This can't find the element I need, but the xpath selects the element in chrome's console

find(:xpath, '//*[@id="registration"]/span[2]/label') 

This is able to find the label element in the span with no problem.

like image 768
user2158382 Avatar asked Jan 09 '14 23:01

user2158382


2 Answers

I had the exact issue yesterday. Capybara was automatically ignoring the input due to it being invisible. I solved it with the following:

find('#agreement', :visible => false).click 

You can also add the following to env.rb to enable Capybara to interact with all hidden elements:

Capybara.ignore_hidden_elements = false 
like image 190
parad1gm Avatar answered Oct 14 '22 13:10

parad1gm


Try to add :visible option set to false.

find('#agreement', visible: false).click 

By default Capybara finds only visible elements. It seems that underlying driver identified this input as invisible so it hasn't been found by Capybara.

:visible option is also supported by most of other Capybara methods (like check, has_css?, have_selector, etc.)

like image 25
Andrei Botalov Avatar answered Oct 14 '22 11:10

Andrei Botalov