capibara afferma gli attributi di un elemento


87

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:


91

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!


Grazie @idlefingers, voglio affermare usando anche xpath. Come posso farlo?
kriysna

Ho aggiornato la mia risposta. Se i selettori xpath sono sbagliati, dovrai cercare su Google o aprire una nuova domanda.
idlefingers

Nota che questo non funzionerà per i test di visualizzazione, poiché capybara non è fatto per funzionare con le visualizzazioni. (Webrat è.)
Peter Ehrlich

145

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 Capybaratenterà 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:


4
Soluzione utile Vrey. Grazie!
Alexander Kuznetsov

Ho una stringa con la posizione css, ad es. find('a#my_element[href]'), sarebbe possibile recuperare il valore di questo attributo? Provare con espressioni come find('a#my_element[href]').valuema non sembra funzionare :(
mickael

@mickael Prova find('a#my_element[href]').texto find('a#my_element[href]').native. Fammi sapere se uno di questi dà i risultati che ti aspetti.
bowsersenior

1
Mi rendo conto che questi commenti sono molto vecchi, ma l'ho usato in questo modo: page.find ('# my_element') ['href = "<href_value>"'] e ha funzionato a meraviglia
Dono

Questo non aspetterà che la query diventi vera se vuoi fare un'asserzione su una modifica asincrona.
sj26

4

È 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.


4

Consiglio di utilizzare have_linke 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.


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


6
Non ha mai funzionato e non funziona con Capybara. Non so perché 9 persone hanno votato positivamente.
Andrei Botalov

Questo non funziona più in Capybara 2. Le persone che usano Capybara <2 possono usare quanto sopra
Tian

@Tian non ha funzionato in Capybara <2. Ti suggerisco di votare questa risposta.
Andrei Botalov

class:non è valido
Amir Raminfar

1

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 .


0

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

0

Usando la sintassi di Rspec3 l'ho fatto in questo modo:

expect(page).not_to have_selector(:link_or_button, 'Click here')

0

Semplicemente puoi usare il page.has_css?metodo

page.has_css?('.class_name') 

questo tornerà truese l'elemento esiste.

Esegui alcune azioni in base alla convalida.

page.has_css?('.class_name') do
  #some code
end

0

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.