2

リクエストスペックを書いていて、poltergeist-1.0.2 と capybara-1.1.2 を使っています。次のコードがあります。

    login_as @user, 'Test1234!'
    click_on 「仮想端末」

ログインには、ユーザーが正常にログインしたことを示すフラッシュメッセージがあります.click_linkを使用している場合、カピバラが要素「仮想端末」を見つけることができないため、スペックは失敗しますが、click_onを使用している場合はすべて合格します. 「仮想端末」はボタンではなく、リンクです。

click_on と click_link の違いは何ですか。

4

1 に答える 1

8

リンクをクリックすると、指定したロケーターを使用してリンクを探していることを指定するファインダーが使用され、そのようにクリックされます。

def click_link(locator, options={})
  find(:link, locator, options).click
end

Click on は代わりに、次のようにリンクまたはボタンであることを指定するファインダーを使用します。

def click_link_or_button(locator, options={})
  find(:link_or_button, locator, options).click
end
alias_method :click_on, :click_link_or_button

出典:カピバラのアクション

これにより、次のように定義されたセレクター :link および :link_or_button につながります。

Capybara.add_selector(:link_or_button) do
  label "link or button"
  xpath { |locator| XPath::HTML.link_or_button(locator) }
  filter(:disabled, :default => false) { |node, value| node.tag_name == "a" or not(value ^ node.disabled?) }
end

Capybara.add_selector(:link) do
  xpath { |locator| XPath::HTML.link(locator) }
  filter(:href) do |node, href|
    node.first(:xpath, XPath.axis(:self)[XPath.attr(:href).equals(href.to_s)])
  end
end

出典: Capubara セレクター

Xpath ロケーターは、次のソースコードに示すように、リンクまたはリンクとボタンの検索のみが異なります。

def link_or_button(locator)
  link(locator) + button(locator)
end

def link(locator)
  link = descendant(:a)[attr(:href)]
  link[attr(:id).equals(locator) | string.n.contains(locator) |  attr(:title).contains(locator) | descendant(:img)[attr(:alt).contains(locator)]]
end

def button(locator)
  button = descendant(:input)[attr(:type).one_of('submit', 'reset', 'image', 'button')][attr(:id).equals(locator) | attr(:value).contains(locator) | attr(:title).contains(locator)]
  button += descendant(:button)[attr(:id).equals(locator) | attr(:value).contains(locator) | string.n.contains(locator) | attr(:title).contains(locator)]
  button += descendant(:input)[attr(:type).equals('image')][attr(:alt).contains(locator)]
end

ソース: Xpath html

ご覧のとおり、ボタン ロケーターは実際に、リンクが該当する可能性のある多くの異なるタイプを検出します。HTML ソース コードがあれば、該当するかどうかを判断できます。

于 2013-07-10T07:26:53.337 に答える