Sto usando RSpec2 e Capybara per i test di accettazione.
Vorrei affermare che il collegamento è disabilitato o meno in Capybara. Come posso fare questo?
Risposte:
Come stai disabilitando il collegamento? È una classe che stai aggiungendo? Un attributo?
# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")
# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")
# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible
I selettori xpath effettivi potrebbero non essere corretti. Non uso spesso xpath!
Un'altra semplice soluzione è accedere all'attributo HTML che stai cercando con []
:
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']
# => ""
Tieni presente che Capybara
tenterà automaticamente di attendere il completamento delle richieste asincrone, ma in alcuni casi potrebbe non funzionare:
Ecco una soluzione alternativa se hai problemi con le asserzioni sugli elementi che vengono aggiornati in modo asincrono:
find('a#my_element[href]')
, sarebbe possibile recuperare il valore di questo attributo? Provare con espressioni come find('a#my_element[href]').value
ma non sembra funzionare :(
find('a#my_element[href]').text
o find('a#my_element[href]').native
. Fammi sapere se uno di questi dà i risultati che ti aspetti.
È stato un po 'complicato trovare l'xpath corretto, ecco quello corretto,
usando capybara 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")
Se hai solo un link senza una classe, usa
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
Qualcosa del genere purtroppo non funzionerà:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
L'opzione di classe verrà ignorata.
Consiglio di utilizzare have_link
e find_link(name)[:disabled]
in due affermazioni separate. Sebbene eseguire solo la seconda asserzione sia più semplice, questo rende i messaggi di errore sui collegamenti mancanti più belli, rendendo i risultati del test più facili da leggere.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
Nota che "Example"
può essere modificato con il nome o l'ID del collegamento.
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link si aspetta un hash di opzioni che è vuoto se non ne fornisci nessuna. Puoi specificare qualsiasi attributo che il collegamento dovrebbe avere, assicurati solo di passare tutte le opzioni in UN hash.
Spero che sia di aiuto
PS: per attributi come data-method devi passare il nome dell'attributo come una stringa poiché il trattino rompe il simbolo.
class:
non è valido
Quando possibile, dovresti provare a utilizzare i wrapper forniti da Capybara che funzioneranno in modo più coerente tra i driver.
Per il caso particolare di disabled
, un wrapper è stato introdotto in 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210
Se lo usi, otterrai risultati sensati sia su RackTest che su 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>
Test:
!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
Nota come usando questo invece dei selettori CSS, i test Javascript funzioneranno senza modifiche se inizi a utilizzare un driver compatibile con Js.
File di prova eseguibile qui .
bowsersenior , grazie per un suggerimento
Un'altra semplice soluzione è accedere all'attributo HTML che stai cercando con []
Ecco un esempio:
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
Usando la sintassi di Rspec3 l'ho fatto in questo modo:
expect(page).not_to have_selector(:link_or_button, 'Click here')
Secondo i documenti è possibile utilizzare la sintassi della funzione di accesso [attributo]:
find('#selector')['class'] => "form-control text optional disabled"
Per i disabili, potresti anche fare questo:
expect(find('#selector').disabled?).to be(true)