Все еще изучаю Капибару, но вы пробовали have_link
вместо have_selector
? Также я не думаю, что вам нужно |ref|
. Например:
lock = false
within('tr', :text => 'Team 3 Name') do # omit |ref|
page.should have_link('Deactivate')
page.should_not have_link('Deactivate')
lock = true
end
lock.should be_true
Обновление от 13 октября 2012 г.
Пройдя немного дальше с Капибарой, я вижу здесь несколько потенциальных проблем:
within
может игнорировать поле text
. Вы заметите, что примеры показывают только искатели CSS или XPath без дополнительных аргументов.
- Если
within
использует text
, он может здесь не работать, потому что вы просите его взглянуть на <tr>
, но текст находится в <td>
.
- Вполне возможно, что субъект
page
по-прежнему нацелен на всю страницу, даже если вы находитесь в блоке within
. Примеры within
в основном касаются использования fill_in
или click
. Исключением является пример под Остерегайтесь XPath // trap .
Что касается создания блока within
, вы можете либо присвоить своим строкам таблицы уникальные идентификаторы и искать их с помощью CSS, либо вы можете написать конкретный XPath, нацеливающийся на первую подходящую строку.
Проблема с последним заключается в том, что вы хотите использовать within
на <tr>
, но текст, который вы используете для таргетинга, находится внутри подэлемента <td>
. Так, например, этот XPath должен найти ячейку таблицы, содержащую текст Team 3 Name
, но тогда вы работаете только с within
в этой первой ячейке, а не со всей строкой.
within(:xpath, "//tr/td[normalize-space(text())='Team 3 Name'") do
Существуют способы «резервного копирования» на родительский элемент с использованием XPath, но я не знаю, как это сделать, и я прочитал, что это не очень хорошая практика. Я думаю, что вам лучше всего сгенерировать идентификаторы, чтобы ваши строки начинались так:
<tr id="team_3">
затем наведите на них простое
within("tr#team_3")