rails rack_test example ruby-on-rails capybara

ruby on rails - rack_test - Combinador de capibara para presencia de botón o enlace.



rspec (6)

Creo que puedes usar el método de instancia de encontrar botón:

(Capybara::Element) find_button(locator)

Utilizando id, nombre, valor.

O si quieres un enlace

(Capybara::Element) find_link(locator)

De: http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders#find_button-instance_method

Los usuarios en la página web no distinguen entre "botón" y "enlace con el estilo de botón". ¿Hay alguna forma de agregar verificación si hay un "botón o enlace" en la página?

Por ejemplo Capibara tiene paso:

page.should have_button(''Click me'')

que no encuentra enlaces con el estilo de botones.


Personalmente, le daría a su botón o enlace una identificación y buscaría eso usando

page.should have_css(''#foo'')

De esta manera puede consultar el enlace o el botón sin preocuparse por su implementación.

Siempre me parece útil: https://gist.github.com/428105


También puedes usar un emparejador personalizado.

RSpec::Matchers::define :have_link_or_button do |text| match do |page| Capybara.string(page.body).has_selector?(:link_or_button, text: text) end end

Entonces hazlo

expect(page).to have_link_or_button(''Login'')


Tuve un caso extraño en el que algunas pruebas de humo desfilaron en varias páginas de inicio de sesión centradas en el cliente que tenían ligeras variaciones al hacer el botón de envío de inicio de sesión ... Impulsado por una tabla de pepinos de usuarios, org, etc.

# A bit of a hack, org_name is normally a subdomain, but sometimes it is the complete domain def login(user, org_name) # Use the below to automatically hit each user''s org''s server if org_name.include? ''.com'' Capybara.app_host = "http://#{org_name}" else Capybara.app_host = "http://#{org_name}.mydomain.com" end visit ''/'' fill_in ''username'', :with => user fill_in ''userpwd'', :with => ''***'' begin page.find(:link_or_button, ''submit'') click_on ''submit'' rescue Capybara::ElementNotFound page.find(:link_or_button, ''Log In'') click_on ''Log In'' rescue Capybara::ElementNotFound pending "Need to determine how to invoke the Login button for #{org_name} near Line ##{__LINE__} of #{__method__} in #{__FILE__} " end # ----------------------- # Work-around for modal popup saying SSL is mismatched if you are using actual production URLs # The rescue is for cases that do not exhibit the modal pop-up page.driver.browser.switch_to.alert.accept rescue Selenium::WebDriver::Error::NoAlertPresentError # Ensure that login was successful page.should_not have_content ''Login failed'' end


Usando la sintaxis de expectativa

expect(page).to have_selector(:link_or_button, ''Click me'')

Esto funciona sin necesidad de definir un emparejador personalizado.


Ya encontré una mejor respuesta:

page.should have_selector(:link_or_button, ''Click me'')

Seguido de click_link_or_button que se define aquí: https://github.com/jnicklas/capybara/blob/master/lib/capybara/node/actions.rb#L12

def click_link_or_button(locator) find(:link_or_button, locator).click end alias_method :click_on, :click_link_or_button

Llama a un selector :link_or_button . Este selector se define aquí: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selector.rb#L143

Capybara.add_selector(:link_or_button) do label "link or button" xpath { |locator| XPath::HTML.link_or_button(locator) } end

Llama a este método: http://rdoc.info/github/jnicklas/xpath/XPath/HTML#link_or_button-instance_method

# File ''lib/xpath/html.rb'', line 33 def link_or_button(locator) link(locator) + button(locator) end

Así que traté de verificar la presencia del selector y funcionó:

page.should have_selector(:link_or_button, ''Click me'')