Подтвердить что ты не робот

Capybara для присутствия кнопки или ссылки

Пользователи на веб-странице не различают "button" и "link styleed as button". Есть ли способ добавить проверку, присутствует ли "кнопка или ссылка" на странице?

Например, Capybara имеет шаг:

page.should have_button('Click me')

который не находит ссылок в виде кнопок.

4b9b3361

Ответ 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')

Ответ 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')