2012-07-04 19 views
19

Antecedentes: Estoy usando Capybara con Rspec para probar una aplicación Rails 3. controlador utiliza: SelenioNo se puede encontrar el elemento para hacer clic en el uso de Capybara + Rails3

Problema: no puedo encontrar el botón "Iniciar sesión" con el fin de hacer clic en desde el interior de mi prueba.

código HTML:

<form accept-charset="UTF-8" action="/" class="filter_form" id="login" method="post"> 
     <fieldset> 
      <div class="modal-body"> 
      <div class="clearfix login-fields"> 
       <label for="user_email">Email</label> 
       <div class="input login-inputs"> 
       <input class="input-text" id="user_email" name="user[email]" placeholder="email" size="30" type="email" value=""> 
       </div> 
      </div> 
      <div class="clearfix login-fields"> 
       <label for="user_password">Password</label> 
       <div class="input login-inputs"> 
       <input class="input-text" id="user_password" name="user[password]" placeholder="password" size="30" type="password"> 
       </div> 
      </div> 
      </div> 
      <div class="modal-footer"> 
      <input class="btn btn-primary login_btn" id="btn_login" name="commit" type="submit" value="Sign in"> 
      <a href="/lms/forgot_password" class="btn">Forgot password...</a> 
      <a href="#" class="btn close cancel" data-dismiss="modal">Cancel</a> 
      </div> 
     </fieldset> 
</form> 

A falta de pruebas

it "should login correctly if the right credentials are given", :js => true do 

    Capybara.default_wait_time = 5 
    Capybara.reset_sessions! 
    visit '/' 
    click_link('login_link') #this will bring a modal window with the code posted above using js 
    within("#login") do 
     fill_in 'user_email', :with => "[email protected]" 
     fill_in 'user_password', :with => "mypwd" 
    end 

    response.should have_selector('input#btn_login') #This passes 
    click_on("input#btn_login") #Here it fails, saying it can't find an element with that selector 
    response.should have_selector(:xpath, '//div[@class="alert-message block-message info"]') 
    end 

Mi archivo de prueba está dentro spec/requests.

¿Alguna idea? Gracias!

Respuesta

1

trate de añadir un save_and_open_page antes de la línea en cuestión. Esto debería permitirle ver la página y cualquier error que pueda evitar la acción de hacer clic.

+0

Oye, lo hice, y el HTML guardado tiene el botón allí ... pero aún así, no lo encontrará – Deleteman

4

Parece que está intentando hacer clic en un botón de enviar dentro de algún CSS modal. Tendrá que invocar primero lo que muestra ese elemento modal.

+0

Compruebe la prueba: '' 'click_link ('login_link') # Esto traerá una ventana modal con el código publicado arriba usando js''' Cuando hago clic en ese enlace, eso es lo que se supone que debe ser. – Deleteman

+0

¿Y confirmó que el elemento modal está visible después? ¿Qué pasa si modificas el CSS para que nunca esté oculto? – sirvine

3

No creo que el click_on tome un localizador como ese, creo que solo quiere una identificación, nombre o valor. Como un experimento, intente reemplazar click_on ("Entrada # btn_login") con:.

page.find ('# btn_login'), haga clic en

+0

Gracias por la sugerencia, pero no hubo suerte. Cuando lo intento, recibo el siguiente error: "No se puede encontrar css" #btn_login "" También traté de usar XPath y no tuve suerte allí. – Deleteman

+0

Ok, un par de pruebas de realidad que probaría. ¿Puedes poner response.should have_selector ('# btn_login') para que sea la línea después de la visita '/'? ¿Solo para descartar que eso no sea cierto antes de hacer clic en el enlace? Además, dado que los ID deben ser únicos, no debe necesitar/usar la entrada en frente de su identificación. – ebeland

+0

Esa prueba será verdadera, porque el html para el modal ya está en el sitio, solo está oculto. Al hacer clic en el enlace, obtendrá el código html, y lo moverá a otro lugar dentro del dom y lo mostrará. – Deleteman

10

Este: https://stackoverflow.com/a/11348065/1504796

es la respuesta correcta.

click_on no toma un selector de CSS, sino el texto o la identificación de un enlace. Quiere click_on("btn_login"). Sin signo de hash ni nada.

+1

Lo siento, pero eso fue lo primero que probé y obtuve el mismo resultado "no encontrado". – Deleteman

+1

jnicklas - gracias. Creo que Deleteman también puede necesitar esperar hasta que JS se ejecute y el contenido esté en la página. ¿Hay una nueva sintaxis para wait_until? Estoy en una versión anterior en este momento. FYI Deleteman, jnicklas escribió Capybara. :-) – ebeland

35

Por favor, intente esto:

page.find("#btn_login").click 
+0

Sigue quejándose de no encontrar css aunque se usa # para un identificador. – nathanengineer

+0

Puede ser motivo de haber usado el mismo nombre para el ID dos veces –

5

tratar

find('#id',:visible => true).click 
3
  • click_button ("Inscripción")
  • find (: XPath, "// * [@ id = 'btn_login '] "). Haga clic en (o .trigger (' clic '))

En caso de que falle, vaya a través throug h la consola y vea si puede verificar la presencia del botón: document.getElementById ("btn_login")

+0

find (: xpath, "//*[@id='btn_login']").click funcionó para mí – qwebek

2

Si conoce el texto del enlace, puede usar page.find_link(text).click.(source)

Cuestiones relacionadas