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