2011-01-27 11 views
23

Estoy usando Cucumber/Capybara with Rails 3 y estoy tratando de validar la existencia de una imagen después de la carga. No estoy seguro de cómo verificar la URL de la imagen para validarla.¿Cómo puedo encontrar una imagen en una página con Cucumber/Capybara en Rails 3

que tienen el siguiente escenario:

Scenario: Create new listing 
    Given I am on the new listing page 
    When I fill in "listing_name" with "Amy Johnson Photography" 
    And I attach the file "features/support/test_image.jpg" to "listing_images_attributes_0_photo" 

    And I press "Create" 
    Then I should see "Amy Johnson Photography" 
    And I should see the image "test_image.jpg" 

Todo pasa, excepto el último paso.

He intentado esto para mi definición de paso, que funciona muy bien si se trata de texto en la página, pero no lo hace para una URL de la imagen:

Then /^I should see the image "(.+)"$/ do |image| 
    if page.respond_to? :should 
     page.should have_content(image) 
    else 
     assert page.has_content?(image) 
    end 
end 

Luego También he intentado algo parecido a este paso definición lugar:

Then /^I should see the image "(.+)"$/ do |image| 
    html = Nokogiri::HTML(response.body) 
    tags = html.xpath('//img[@src="/public/images/foo.png"]') 
    # tags.length.should eql(num_of_images) 
end 

que provoca el error siguiente:

And I should see the image "test_image.jpg"             # features/step_definitions/listing_steps.rb:41 
     undefined method `body' for nil:NilClass (NoMethodError) 
     ./features/step_definitions/listing_steps.rb:42:in `/^I should see the image "(.+)"$/' 
     features/manage_listings.feature:24:in `And I should see the image "test_image.jpg"' 

Asumo necesitas un paso de nokogiri para encontrar esto correctamente. O si hay una mejor manera, estoy abierto a sugerencias. ¿Cómo puedo validar que la imagen que acabo de subir está en la página? Gracias.

+1

En su definición de paso que está recibiendo un error de capibara común. Intenta usar 'page.body' en lugar de 'response.body' si no recuerdo mal. – Mauricio

+0

No sé si puede usar una expresión regular en xpath, pero si tiene acceso a su instancia de Listing, puede usar una interpolación de cadena "// img [@src = '/ public/images/# {@ listing_id } /foo.png '] " – monocle

+0

Esta página contiene una buena referencia de selector CSS3 que lo ayudará a: http://reference.sitepoint.com/css/css3attributeselectors – sivabudh

Respuesta

39

La solución con Nokogiri debería funcionar bien. El único problema es que la API de Cabybara es diferente a Webrat, por lo que en lugar de response.body, debe usar page.body.

Pero theres una manera aún mejor para la prueba de la imagen con Cabybara:

Then /^I should see the image "(.+)"$/ do |image| 
    page.should have_xpath("//img[@src=\"/public/images/#{image}\"]") 
end 
+0

Gracias. Eso funciona genial Una cosa más. Los nombres de mi carpeta son variables en función del listing_id. ¿Cómo puedo usar una expresión regular aquí que busca solo el nombre de la imagen (no toda la URL)? –

+1

XPath admite comodines, así que, imagino que podrías escribir algo como esto: 'page.should have_xpath (" // img [@src = \ "/ */*/# {image} \"] ")' – ndbroadbent

+0

Parece que no sé cómo hacer que esto funcione con las URL generadas por Dragonfly. Se ven así: '/media/BAh_some_long_string_AwIw/12_11_52_810_5x5.jpg? S = 7e360000', donde' 5x5.jpg' es mi nombre de archivo. He intentado algo como: '// img [@src ="/media/*/* # {image}? S = * "]' pero no funciona. ¿Tienes algún consejo? –

3

hace este trabajo?

page.should have_xpath('//img[@src="/public/images/foo.png"]') 
+0

Gracias. Eso funciona genial Una cosa más. Los nombres de mi carpeta son variables en función del listing_id. ¿Cómo puedo usar una expresión regular aquí que busca solo el nombre de la imagen (no toda la URL)? –

13

Hola no soy bueno con XPATH pero con CSS que puede probar:

 
    if page.respond_to? :should 
    page.should have_selector("img[src$='#{imagename}']") 
    else 
    assert page.has_selector?("img[src$='#{imagename}']") 
    end 

deseo ayuda! jramby

+3

Esto también funciona: 'page.should have_css (" img [src $ = '# {imagename}'] ")' – sivabudh

0

Sí, pero estas pruebas XPath no lidiar con el hecho de que ...

/public/images/foo.jpg 
public/images/foo.jpg 
http://mydomain.com/public/images/foo.jpg 

... son todos iguales enlace válido a la imagen.

6

Puede probar de esta manera, y tampoco en función de la ruta:

Then /^I should see the image "(.+)"$/ do |image| 
    page.should have_xpath("//img[contains(@src, \"#{image}\")]") 
end 
+0

Esto es lo que se usa para las imágenes que se guardan en rutas dinámicas como archivos adjuntos de Paperclip. –

-1

esta sintaxis trabajó para yo y es más legible

page.should have_css("img", :src => "/public/images/foo.png")

+1

No funciona para 'capybara 2.3.0'. – freemanoid

5

page.should

ahora es obsoleto.Utilizar en lugar

expect(page).to

ejemplo completo:

Then /^I should see the image "(.+)"$/ do |image| 
    expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]") 
end 
Cuestiones relacionadas