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.