Как щелкнуть первую ссылку в списке элементов после обновления до Capybara 2.0?
Как щелкнуть первую ссылку в этом случае:
<div class="item">
<a href="/agree/">Agree</a>
</div>
<div class="item">
<a href="/agree/">Agree</a>
</div>
within ".item" do
first(:link, "Agree").click
end
и я получаю эту ошибку:
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching css ".item"
И без within
я получаю эту ошибку:
Failure/Error: first(:link, "Agree").click
NoMethodError:
undefined method `click' for nil:NilClass
Ответы
Ответ 1
Вы можете просто использовать:
first('.item').click_link('Agree')
или
first('.item > a').click
(если ваш селектор по умолчанию: css)
Код в вашем вопросе не работает:
within ".item" do
first(:link, "Agree").click
end
эквивалентно:
find('.item').first(:link, "Agree").click
Capybara находит несколько .item
, поэтому он вызывает исключение. Я считаю это поведение Capybara 2 очень хорошим.
Ответ 2
Попробуйте следующее:
within ".item" do
click_link("Agree", :match => :first)
end
Источники:
Ответ 3
Эта фразировка также работает:
within first(".item") do
click_link "Agree"
end
Ответ 4
Xpath может обращаться к элементу. Я еще не очень хорош, но что-то вроде //div[@class='active'][1]/a
Это может работать или не работать, но дело в том, что xpath может обращаться к массиву совпадений и вытаскивать определенный. Вы должны быть в состоянии соответствовать этому.
Пример рабочего примера из одного из моих проектов:
within page.find("div.panel", text: /Proposals/) do
within page.find('tr', text: /Foo/) do
page.should have_xpath('td[3]', text: @today)
end
end
Ответ 5
Так как first() не всегда ждет, возможно, это полезно:
expect(page).to have_css("selector")
first("selector").click
Ответ 6
большинство из этих решений не будут использовать блестящие функции ожидания Capybara
лучше сделать так, как предлагает эта ссылка:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element
Плохой:
first (". active"). click Если на странице еще нет элемента .active, first вернет nil и щелчок не удастся.
Хорошо:
Если вы хотите убедиться, что именно там
find(".active").click
Если вы просто хотите первый элемент
find (". active", match:: first).click Капибара будет ждать появления элемента, прежде чем пытаться щелкнуть. Обратите внимание, что match:: first более хрупкий, потому что он будет тихо нажимать на другой элемент, если вы вводите новые элементы, которые соответствуют.
Ответ 7
Просто вы можете использовать:
$('.item').find('a').first().click();