Używam RSpec2 i Capybara do testów akceptacyjnych.
Chciałbym zapewnić, że link jest wyłączony lub nie w Kapibara. Jak mogę to zrobić?
ruby-on-rails
rspec
capybara
kriysna
źródło
źródło
Innym prostym rozwiązaniem jest uzyskanie dostępu do szukanego atrybutu HTML za pomocą
[]
:find('#my_element')['class'] # => "highlighted clearfix some_other_css_class" find('a#my_element')['href'] # => "http://example.com # or in general, find any attribute, even if it does not exist find('a#my_element')['no_such_attribute'] # => ""
Zauważ, że
Capybara
automatycznie spróbuje czekać na zakończenie asynchronicznych żądań, ale w niektórych przypadkach może to nie działać:Oto jedno obejście, jeśli masz problemy z asercjami dotyczącymi elementów, które są aktualizowane asynchronicznie:
źródło
find('a#my_element[href]')
, czy byłoby możliwe pobranie wartości tego atrybutu? Próbowanie z wyrażeniami takimi jak,find('a#my_element[href]').value
ale wydaje się nie działać :(find('a#my_element[href]').text
lubfind('a#my_element[href]').native
. Daj mi znać, jeśli którykolwiek z tych wyników przyniesie oczekiwane rezultaty.Znalezienie właściwej ścieżki xpath było trochę
kłopotliwe , tutaj jest poprawna, używając kapibary 0.4.1.1
# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a> page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")
Jeśli masz tylko link bez zajęć, użyj
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
Coś takiego niestety nie zadziała:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
Opcja klasy zostanie zignorowana.
źródło
Polecam użycie
have_link
ifind_link(name)[:disabled]
w dwóch oddzielnych asercjach. Chociaż samo wykonanie drugiego potwierdzenia jest prostsze, to sprawia, że komunikaty o błędach dotyczące brakujących linków wyglądają ładniej, dzięki czemu wyniki testów są łatwiejsze do odczytania.expect(page).to have_link "Example" expect(find_link("Example")[:disabled]).to be false
Pamiętaj, że
"Example"
można to zmienić na nazwę lub identyfikator łącza.źródło
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link oczekuje skrótu opcji, który jest pusty, jeśli żadnych nie podasz. Możesz określić dowolne atrybuty, które powinien mieć link - po prostu upewnij się, że przekazałeś wszystkie opcje w JEDNYM hashu.
Mam nadzieję że to pomoże
PS: W przypadku atrybutów, takich jak metoda danych, musisz przekazać nazwę atrybutu jako ciąg, ponieważ łącznik przerywa symbol.
źródło
class:
nie jest ważnyO ile to możliwe, należy spróbować użyć opakowań dostarczonych przez Kapibarę, które będą działać bardziej konsekwentnie we wszystkich sterownikach.
W tym konkretnym przypadku
disabled
opakowanie zostało wprowadzone w wersji 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210Jeśli go użyjesz, uzyskasz rozsądne wyniki zarówno w RackTest, jak i Poltergeist:
HTML:
<input type="text" id="disabled-false" ></div> <input type="text" id="disabled-true" disabled></div> <input type="text" id="disabled-js-true" ></div> <input type="text" id="disabled-js-false" disabled></div> <script> document.getElementById('disabled-js-true').disabled = true document.getElementById('disabled-js-false').disabled = false </script>
Testy:
!all(:field, 'disabled-false', disabled: false).empty? or raise all(:field, 'disabled-false', disabled: true ).empty? or raise all(:field, 'disabled-true', disabled: false).empty? or raise !all(:field, 'disabled-true', disabled: true ).empty? or raise all(:field, 'disabled-js-true', disabled: true ).empty? or raise all(:field, 'disabled-js-false', disabled: false).empty? or raise Capybara.current_driver = :poltergeist !all(:field, 'disabled-false', disabled: false).empty? or raise all(:field, 'disabled-false', disabled: true ).empty? or raise all(:field, 'disabled-true', disabled: false).empty? or raise !all(:field, 'disabled-true', disabled: true ).empty? or raise !all(:field, 'disabled-js-true', disabled: true ).empty? or raise !all(:field, 'disabled-js-false', disabled: false).empty? or raise
Zauważ, że używając tego zamiast selektorów CSS, testy Javascript będą działać bez żadnych zmian, jeśli zaczniesz używać sterownika obsługującego js.
Plik testowy do uruchomienia tutaj .
źródło
bowsersenior , dzięki za podpowiedź
Oto przykład:
let(:action_items) { page.find('div.action_items') } it "action items displayed as buttons" do action_items.all(:css, 'a').each do |ai| expect(ai[:class]).to match(/btn/) end end
źródło
Używając składni Rspec3 zrobiłem to w ten sposób:
expect(page).not_to have_selector(:link_or_button, 'Click here')
źródło
Po prostu możesz użyć
page.has_css?
metodypage.has_css?('.class_name')
to zwróci,
true
jeśli element istnieje.Wykonaj jakąś czynność w oparciu o walidację.
page.has_css?('.class_name') do #some code end
źródło
Zgodnie z dokumentacją możesz użyć składni akcesora [atrybut]:
find('#selector')['class'] => "form-control text optional disabled"
W przypadku osób niepełnosprawnych możesz również zrobić to:
expect(find('#selector').disabled?).to be(true)
źródło