capybara затверджує атрибути елемента


87

Я використовую RSpec2 та Capybara для приймального тестування.

Я хотів би стверджувати, що в Capybara посилання вимкнено чи ні. Як я можу це зробити?

Відповіді:


91

Як ви відключаєте посилання? Це клас, який ви додаєте? Атрибут?

# 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

Фактичні селектори xpath можуть бути неправильними. Я не часто використовую xpath!


Дякую @idlefingers, я теж хочу стверджувати, використовуючи xpath. Як я можу це зробити?
kriysna 02.03.11

Я оновив свою відповідь. Якщо селектори xpath помиляються, вам доведеться погугліти або відкрити нове запитання.
idlefingers 02.03.11

Зверніть увагу, що це не буде працювати для тестування подань, оскільки capybara не створена для роботи з поданнями. (Вебрат.)
Пітер Ерліх,

145

Ще одне просте рішення - отримати доступ до атрибута HTML, який ви шукаєте []:

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']
# => ""

Зверніть увагу, що Capybaraавтоматично буде намагатися дочекатися закінчення асинхронних запитів, але в деяких випадках це може не спрацювати:

Ось одне рішення, якщо у вас виникають проблеми із твердженнями щодо елементів, які оновлюються асинхронно:


4
Корисний розчин Vrey. Дякую!
Олександр Кузнєцов

У мене є рядок із розташуванням css, наприклад. find('a#my_element[href]'), чи можна було б отримати значення цього атрибута? Спроба з виразами типу, find('a#my_element[href]').valueале, здається, не працює :(
Майкл

@mickael Спробуйте find('a#my_element[href]').textабоfind('a#my_element[href]').native . Повідомте мене, якщо хтось із них дасть результати, яких ви очікуєте.
bowsersenior

1
Я усвідомлюю, що ці коментарі справді давні, але використовував їх таким чином: page.find ('# my_element') ['href = "<href_value>"'], і це вдало
Доно

Це не буде чекати, поки запит стане істинним, якщо ви хочете зробити твердження про асинхронні зміни.
sj26

4

Було трохи брудно з’ясувати правильний xpath, ось правильний,
використовуючи 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")

Якщо у вас є лише посилання без класу, використовуйте

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')

Щось на зразок цього, на жаль, не вийде:

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")

Параметр класу буде проігноровано.


4

Я рекомендую використовувати have_linkі find_link(name)[:disabled]в двох окремих твердженнях. Хоча виконувати друге твердження простіше, це робить повідомлення про помилки щодо відсутніх посилань приємнішими, що полегшує читання результатів тесту.

expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false

Зверніть увагу, що "Example"їх можна змінити на ім’я чи ідентифікатор посилання.


1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

have_link очікує хеш параметрів, який порожній, якщо ви не вказали жодного. Ви можете вказати будь-які атрибути, які має мати посилання - просто переконайтеся, що всі параметри передані в ОДИН хеш.

Сподіваюся, це допомагає

PS: Для таких атрибутів, як метод даних, потрібно передавати ім’я атрибута як рядок, оскільки дефіс розбиває символ.


6
Це ніколи не працювало і не працює з Capybara. Не знаю, чому 9 людей проголосували за це.
Андрій Боталов 17.03.13

Це більше не працює в Capybara 2. Люди, які використовують Capybara <2, можуть скористатися наведеним вище
Tian

@Tian, ​​це не спрацювало в Capybara <2. Я пропоную вам відхилити цю відповідь.
Андрій Боталов

class:недійсний
Амір Рамінфар

1

По можливості, спробуйте використовувати обгортки, що надаються компанією Capybara, які будуть працювати більш послідовно у всіх драйверах.

Для приватного випадку disabled, обгортка була введена в 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

Якщо використовувати його, ви отримаєте розумні результати як на RackTest, так і на 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>

Тести:

!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

Зверніть увагу, що, використовуючи це замість селекторів CSS, тести Javascript працюватимуть без будь-яких змін, якщо ви почнете використовувати драйвер із підтримкою Js.

Runnable тестовий файл тут .


0

bowsersenior , дякую за підказку

Іншим простим рішенням є доступ до атрибута HTML, який ви шукаєте за допомогою []

Ось приклад:

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

Використовуючи синтаксис Rspec3, я зробив це таким чином:

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

0

Просто ви можете використовувати page.has_css?метод

page.has_css?('.class_name') 

це повернеться, trueякщо елемент існує.

Виконайте певні дії на основі перевірки.

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

0

Згідно з документами ви можете використовувати синтаксис доступу [attribute]:

find('#selector')['class'] => "form-control text optional disabled"

Для інвалідів ви також можете зробити наступне:

expect(find('#selector').disabled?).to be(true)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.