Capybara для присутствия кнопки или ссылки
Пользователи на веб-странице не различают "button" и "link styleed as button".
Есть ли способ добавить проверку, присутствует ли "кнопка или ссылка" на странице?
Например, Capybara имеет шаг:
page.should have_button('Click me')
который не находит ссылок в виде кнопок.
Ответы
Ответ 1
Я уже нашел лучший ответ:
page.should have_selector(:link_or_button, 'Click me')
Далее следует click_link_or_button
, который определен здесь: 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
Он вызывает селектор :link_or_button
. Этот селектор определен здесь: 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
Он вызывает этот метод: 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
Итак, я попытался проверить наличие селектора, и он сработал:
page.should have_selector(:link_or_button, 'Click me')
Ответ 2
Использование синтаксиса ожидать
expect(page).to have_selector(:link_or_button, 'Click me')
Это работает без необходимости определять пользовательский соединитель.
Ответ 3
Лично я бы дал вашу кнопку или связал идентификатор и посмотрел, используя
page.should have_css('#foo')
Таким образом вы можете ссылаться на ссылку или кнопку, не беспокоясь о ее реализации.
Я всегда считаю это полезным: https://gist.github.com/428105
Ответ 4
Вы также можете использовать пользовательский макет
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
Тогда do
expect(page).to have_link_or_button('Login')
Ответ 5
Я думаю, вы можете использовать метод экземпляра кнопки поиска:
(Capybara::Element) find_button(locator)
Использование id, name, value.
Или, если вы хотите ссылку
(Capybara::Element) find_link(locator)
От: http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders#find_button-instance_method
Ответ 6
У меня был нечетный случай, когда некоторые тесты на дым проходили по различным страницам входа в систему, ориентированным на клиента, которые имели небольшие отклонения от того, что вы делали кнопку отправки в систему... Управляемая таблицей окуни для пользователя, org и т.д.
# 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 org 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
Ответ 7
если HTML:
<a class="top-menu__item">text123
<span class="label">
<span class="label">86</span>
</span>
</a>
не работа:
assert page.has_selector?(:link_or_button, text: 'text123')
assert page.should have_selector(:link_or_button, text: 'text123')