rails rack_test feature example and ruby-on-rails cucumber paperclip

ruby-on-rails - rack_test - ruby on rails selenium



¿Cómo puedo encontrar una imagen en una página con Cucumber/Capybara en Rails 3? (8)

página.Debería

ahora está en desuso. Utilizar en su lugar

esperar (página) .a

Ejemplo completo:

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

Estoy usando Cucumber / Capybara con Rails 3 y estoy tratando de validar la existencia de una imagen después de subirla. No estoy seguro de cómo verificar la url de la imagen para validarla.

Tengo 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 es texto en la página, pero no para una url de 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

Entonces también he intentado algo como esta definición de paso en su 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

lo que provoca el siguiente error:

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"''

Supongo que 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 cargar está en la página? Gracias.


¿Esto funciona?

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


Esta sintaxis funcionó para mí y es más legible.

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


Hola, no soy bueno con XPATH pero con CSS puedes 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


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

Pero hay una manera aún mejor de probar la imagen con Cabybara:

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


Puedes probarlo de esta manera, y también no dependiendo de la ruta:

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


Sí, pero estas pruebas de xpath no tratarán el hecho de que ...

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

... son todos el mismo enlace válido a la imagen.


Si tiene muchas imágenes que le gustaría probar, ¿podría crear una has_image? Matcher para Capybara.

Es fácil y esta publicación lo explica paso a paso: ¿ Agregar una has_image? Matcher a Capybara