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