2010-11-19 3 views
1

Я знаю, что /Interface \d/ встречается три раза на странице. Но я не знаю, как проверить это с Capybara в Cucumber. Здесь была моя первая попытка:Как проверить наличие нескольких вхождений слова с помощью Capybara (или Webrat, я думаю) и Cucumber?

Then /^(?:|I)should see \/([^\/]*)\/ (\d+)(?:x|X| times?)?$/ do |regexp, count| 
    regexp = Regexp.new(regexp) 
    count = count.to_i 
    if page.respond_to? :should 
    page.should have_xpath('//*', { :text => regexp, :count => count }) 
    else 
    assert page.has_xpath?('//*', { :text => regexp, :count => count }) 
    end 
end 

Однако это возвращает ложь для моего Then I should see /Interface \d+/ 3 times.

Я понял, что это потому, что has_xpath использует all. Подставляя это в моем тесте:

puts all(:xpath, '//*', { :text => regexp}).map {|e| pp e} 

результаты в

#<Capybara::Element tag="html" path="/html"> 
#<Capybara::Element tag="body" path="/html/body"> 
#<Capybara::Element tag="div" path="/html/body/div"> 
#<Capybara::Element tag="div" path="/html/body/div/div[2]"> 
#<Capybara::Element tag="table" path="/html/body/div/div[2]/table"> 
#<Capybara::Element tag="tbody" path="/html/body/div/div[2]/table/tbody"> 
#<Capybara::Element tag="tr" path="/html/body/div/div[2]/table/tbody/tr[1]"> 
#<Capybara::Element tag="td" path="/html/body/div/div[2]/table/tbody/tr[1]/td[3]"> 
#<Capybara::Element tag="tr" path="/html/body/div/div[2]/table/tbody/tr[2]"> 
#<Capybara::Element tag="td" path="/html/body/div/div[2]/table/tbody/tr[2]/td[3]"> 
#<Capybara::Element tag="tr" path="/html/body/div/div[2]/table/tbody/tr[3]"> 
#<Capybara::Element tag="td" path="/html/body/div/div[2]/table/tbody/tr[3]/td[3]"> 

Так я получаю количество каждого шага по пути к элементам, которые содержат мой текст. : - \

Я подумал, что, возможно, has_content спасет меня, но он не принимает счет.

Помощь!

ответ

2

Что-то, как это должно работать:

Then /^(?:|I)should see \/([^\/]*)\/ (\d+)(?:x|X| times?)?$/ do |regexp, count| 
    regexp = Regexp.new(regexp) 
    count = count.to_i 
    page.find(:xpath, '//body').text.split(regexp).length.should == count+1 
end 
+0

Две причины мне не нравится использовать «в бла»: 1) Это ломкими. Прямо сейчас они находятся в с, но это скоро изменится. Я не хочу менять тест. 2) На самом деле это не с точки зрения пользователя, и мне нравится стараться максимально использовать возможности огурца. – chadoh

+0

Достаточно справедливо ... Я удалил предложение селектора css. – Zubin