web-dev-qa-db-ja.com

ボタンまたはリンクの存在のためのカピバラマッチャー

Webページのユーザーは、「ボタン」と「ボタンとしてスタイル設定されたリンク」を区別しません。 「ボタンまたはリンク」がページに存在するかどうかのチェックを追加する方法はありますか?

たとえば、カピバラにはステップがあります:

page.should have_button('Click me')

ボタンとしてスタイル設定されたリンクが見つかりません。

29
mirelon

私はすでにより良い答えを見つけました:

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#L14

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

expect構文の使用

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

これは、カスタムマッチャーを定義する必要なく機能します。

5
ardochhigh

個人的に私はあなたのボタンを与えるか、IDをリンクし、それを使ってそれを探します

page.should have_css('#foo')

このようにして、実装を気にすることなくリンクまたはボタンを参照できます。

私はいつもこれが便利だと思います: https://Gist.github.com/428105

1
Dave Oh

カスタムマッチャーを使用することもできます

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

それから

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

ボタンのインスタンス検索メソッドを使用できると思います。

(Capybara::Element) find_button(locator)

ID、名前、値を使用します。

または、リンクが必要な場合

(Capybara::Element) find_link(locator)

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

0
simonmorley

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')
0
Denis repon

ログイン送信ボタンの実行にわずかなバリエーションがあるさまざまな顧客中心のログインページにいくつかの煙テストが行​​進するという奇妙なケースがありました...ユーザー、組織などのCucumberテーブルによって駆動されます。

# 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
0
Jon Kern