2016-03-28 8 views
1

На веб-сайте, который я тестирую, есть куча выбранных фильтров (picture for context). Я пробегаем по всем из них, и закрывая их так:Capybara/Cucumber In Ruby: прекратите поиск, когда не существует больше элементов

When /^each (.+) is clicked$/ do |element| 
    page.all("#{element}").each do |element| 
    element.click 
    end 
end 

Этот код нажимает на кнопку закрытия и закрывает все открытые фильтры. Проблема у меня в том, что, когда я добираюсь до конца фильтров, он продолжает искать и поднимает эту ошибку:

stale element reference: element is not attached to the page document 
     (Session info: chrome=49.0.2623.87) 
     (Driver info: chromedriver=2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b),platform=Mac OS X 10.10.5 x86_64) (Selenium::WebDriver::Error::StaleElementReferenceError) 
     ./features/step_definitions/ux_steps.rb:22:in `block (2 levels) in <top (required)>' 
     ./features/step_definitions/ux_steps.rb:21:in `/^each (.+) is clicked$/' 
     features/ux.feature:16:in `When each span is clicked' 

HTML:

<div class="sort-block order" id="selectedFilters"> 
    <a id="Anti-Inflammatory_selectedfilter" href="javascript:void(0)" class="current">Anti-Inflammatory<span class="selectedFilterCross" onclick="selectedFilterFun('selectedFilterText1','Anti-Inflammatory',-1); $(this).parent('a').remove();">X</span></a> 
    <a id="Cardiac_selectedfilter" href="javascript:void(0)" class="current">Cardiac<span class="selectedFilterCross" onclick="selectedFilterFun('selectedFilterText1','Cardiac',-1); $(this).parent('a').remove();">X</span></a> 
    <a id="Diabetic_selectedfilter" href="javascript:void(0)" class="current">Diabetic<span class="selectedFilterCross" onclick="selectedFilterFun('selectedFilterText1','Diabetic',-1); $(this).parent('a').remove();">X</span></a> 
</div> 

Любые идеи о том, как остановить поиск как только список элементов пуст? Вся помощь приветствуется!

ответ

1

Я думаю, что это происходит потому, что элементы, которые находятся на странице при запуске цикла, удаляются со страницы нажатием. Если да, то вы должны быть в состоянии установить его повторно в поисках интерактивных элементов, нажав на первый вы найдете, и снова поиск, пока вы не найдете больше:

When /^each (.+) is clicked$/ do |selector| 
    while true 
    element = page.first(selector) 
    if element 
     element.click 
    else 
     break 
    end 
    end 
end 

Обратите внимание, что "#{string}" такое же, как string.

+0

Это устраняет ошибку, но теперь она застревает в бесконечном цикле. – user5854440

+0

Ой, опечатка. Исправлена. –

+0

Он все еще застрял в бесконечном цикле. Он закрывает все фильтры, но затем продолжает искать больше. Я добавил html к моему вопросу ради ясности. – user5854440