2012-12-13 17 views
26

Web sayfasındaki kullanıcılar, "button" ve "button styled button" arasında ayrım yapmazlar. Sayfada "düğme veya bağlantı" olup olmadığını kontrol etmenin bir yolu var mı? düğmeler olarak tarz bağlantıları bulamazsaDüğme veya bağlantı için Capybara eşleştirici

page.should have_button('Click me') 

:

Örneğin Capybara adımını sahiptir.

(Capybara::Element) find_button(locator) 

id, isim, değerini kullanarak:

+0

Bunu Javascript linkleri yüzünden yapacaktım, ama sonra şu şekilde karar vermedim: bu durumda en azından, * ayırt etmek mümkün. Örn., Ortadaki yeni bir sekme açılır ve vurgunun üzerine bağlantı hedefi sadece bağlantı için gösterilir. En iyi uygulama şudur: Bu durumda bağlantıları kullanmayın ve testlere izin vermeyin. –

+1

Ancak buna değer bir durum var: olumsuzlama. Aksi takdirde, linkleri butonlara değiştirirseniz, testler sessizce her zaman geçmektedir. –

cevap

49

iyi bir cevap:

page.should have_selector(:link_or_button, 'Click me') 

click_link_or_button dan takip buraya tanımlanır: Bu bir seçici çağırır 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 . Bu yöntemini çağıran 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 

: Bu selektör burada tanımlanır

# File 'lib/xpath/html.rb', line 33 

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

http://rdoc.info/github/jnicklas/xpath/XPath/HTML#link_or_button-instance_method Yani ben seçicinin varlığını kontrol etmeye çalıştı ve işe yaradı:

page.should have_selector(:link_or_button, 'Click me') 
0

Sana bulmak düğmesi örneği yöntemini kullanabilirsiniz düşünüyorum.

Yoksa itibaren bir bağlantı

(Capybara::Element) find_link(locator) 

istiyorsanız: Şahsen ben senin düğmesine vermek veya id bağlamak ve

page.should have_css('#foo')

Bu şekilde kullanarak o arardım http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders#find_button-instance_method

+0

Bunun yerine 2 – mirelon

+0

yerine bir arama ile bulmak istedim Daha iyi bir yol var gibi görünüyor :) – simonmorley

1

Uygulaması hakkında endişelenmeden bağlantıya veya düğmeye başvurabilirsiniz.

Hep bu yararlı bulmak

: Zaten öğrendim https://gist.github.com/428105

1

yapabilirsiniz ayrıca özel bir eşleştirici kullanın

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 

Sonra bazı duman testleri giriş yapmaya küçük farklılıklar vardı çeşitli müşteri merkezli giriş sayfalarına gönderme düğmesi ... kullanıcının bir salatalık tablo tarafından Driven genelinde yürüdü garip bir durum vardı

expect(page).to have_link_or_button('Login') 
0

yapmak, org , vb.

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

Bu, özel bir eşleyici tanımlamak gerek kalmadan çalışır bekliyoruz sözdizimi

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

kullanma.

+0

^This. Should /: shouldtax kullanımdan kaldırılmalı –

İlgili konular