2016-02-29 2 views
0

Я пытаюсь написать тест для вызова AJAX. Функциональность работает в производстве, но у меня проблемы с Capybara. Кажется, что find(".selector").click не может быть вызван дважды в том же сценарии.Capybara не находит ту же ссылку дважды, используя find

Сценарий № 1 проходит, но сценарий # 2 дает эту ошибку на втором find(".article__expand").click:

Failure/Error: find(".article__expand").click 
    Capybara::ElementNotFound: 
    Unable to find css ".article__expand" 

Я использую селектор CSS, потому что тело по ссылке является диапазон glyphicon. Есть ли способ обойти это?


require "rails_helper" 

RSpec.feature "Users can toggle article descriptions" do 
    let(:article) { FactoryGirl.create(:article, description: "Article description") } 

    context "all users" do 
    before do 
     visit article_path(article) 
    end 

    scenario "description is hidden until clicked" do 
     expect(page).to_not have_content("Article description") 

     find(".article__expand").click 

     expect(page).to have_content("Article description") 
    end 

    scenario "description can be toggled" do 
     expect(page).to_not have_content("Article description") 

     find(".article__expand").click 

     expect(page).to have_content("Article description") 

     find(".article__expand").click 

     expect(page).to_not have_content("Article description") 
    end 
    end 
end 

Вот как делается вызов. Я использую таможню description получить член на resources :articles.

# views/articles/_article.html.erb 
<div class="article" id="article-<%= article.id %>"> 
    <%= link_to description_article_path(article), remote: true, class: "article__expand" do %> 
    <span class="glyphicon glyphicon-plus"></span> 
    <% end %> 
    <div class="article__info"> 
    </div> 
</div> 

# views/articles/description.js.erb 
$(function() { 
    if ($("#article-<%= @article.id %> .article__description").length) { 
    $("#article-<%= @article.id %> .article__description").toggle(); 
    } else { 
    $.getJSON('/articles/<%= @article.id %>.json', function(data) { 
     var description = ('<p class="article__description">' + data.description + '</p>') 
     $('#article-<%= @article.id %> .article__info').prepend(description); 
    }); 
    } 
}); 
+1

Я только гадать здесь, так как я не эксперт CSS , Но если щелкнуть '.article_expand', он будет расширен и класс должен измениться на нечто вроде' .article_minimize'. Вы реализовали какие-либо такие функции? – bork

+0

@bork Нет ничего подобного, я буду редактировать в представлениях. Они довольно простые, поэтому я думаю, что это проблема Capybara, но я могу ошибаться. – Jane

+0

Какой драйвер capybara вы используете? –

ответ

0

Для отладки этих родов вещей, которые я бы рекомендовал следующие шаги:

gem install launchy

Launch говорит: Launchy здесь, чтобы сделать общий подход к запуску внешнего приложения из программы рубина.

Использовать save_and_open_page в пределах вашей спецификации непосредственно перед ожиданием, которое терпит неудачу. Сопоставление следующим образом:

scenario "description can be toggled" do 
    expect(page).to_not have_content("Article description") 
    find(".article__expand").click 
    save_and_open_page 
    expect(page).to have_content("Article description") 
    find(".article__expand").click 
    .... 

Это облегчит отладку. Также рассмотреть вопрос о принятии другого подхода и использование методов Капибары, такие как:

=Clicking links and buttons= 
    click_link('id-of-link') 
    click_link('Link Text') 
    click_button('Save') 
    click('Link Text') # Click either a link or a button 
    click('Button Value') 

Они приходят из супер полезного Capybara Cheatsheet здесь - https://gist.github.com/zhengjia/428105

+0

Это вызвало больше вопросов, чем ответов, к сожалению. Я могу сделать обновление и попытаться получить отладку справки, но у меня возникла проблема из-за моего нетрадиционного пользовательского элемента 'description' get. – Jane

+0

А, ок. Возможно, вы также можете обновить более подробную информацию о своем драйвере Capybara? (Selenium, Capybara-Webkit или Poltergeist?) И эта настройка. Я бы сказал, что это вероятная область для проблемы, если вы все еще не знаете, почему она терпит неудачу. –

+0

Я использую Capybara-Webkit, но в основном с ': js => true' он не работает на уровне контроллера. Он не может найти идентификатор экземпляра, используя 'Model.find'. Это не имеет большого смысла, поскольку FactoryGirl делает экземпляр, и он ленивый загружен и т. Д. Смущает! – Jane

Смежные вопросы