2016-12-02 2 views
0

Alors voici mon test.Rails Concombre Capybara id/sélection de classe

When(/^the admin user broadcasts "([^"]*)" to the notification feed$/) do |userBroadcast| 
    visit('/broadcasts/new.html') 
    fill_in('.nifty_form', with: userBroadcast) 
    click_button('Broadcast') 
end 

J'ai ajouté dans mon new.html.erb une classe appelée « nifty-forme », comme vous pouvez le voir ci-dessous.

<h1>New broadcast</h1> 

<%= form_for(@broadcast) do |f| %> 
    <% if @broadcast.errors.any? %> 
     <div id="error_explanation"> 
      <h2><%= pluralize(@broadcast.errors.count, "error") %> prohibited this broadcast from being saved:</h2> 

      <ul> 
      <% @broadcast.errors.full_messages.each do |msg| %> 
       <li><%= msg %></li> 
      <% end %> 
      </ul> 
     </div> 
    <% end %> 

    <%= hidden_field_tag 'page', @current_page %> 

    <div id="broadcast-area" class="main-input-area"> 
     <p> 
     <%= f.text_area :content, cols: "100%", rows: "10", class: 'nifty-form', 
         title: "Broadcast text goes here", autofocus: 'autofocus'%> 
     </p> 

     <div id="url-part"> 
     <%= link_to("Shortens URL", 
        id: "split-arrow", 
        title: "Press this to shorten the URL") %> 
     <%= text_field_tag :shorten_url, nil, 
          title: "Enter URL that you wish to shorten", 
          size: "50%" %> 

     </div> 
     <br/> 

     <div id=""> 
     <%= f.submit 'Broadcast', confirm: 'Do you really want to broadcast?' %> | 
     <%= link_to 'Back', broadcasts_path(page: @current_page) %> 
     </div> 
</div> 

Mais pour une raison quelconque, je reçois le résultat:

Unable to find field "nifty_form" (Capybara::ElementNotFound) 

J'ai vu la source de la page rendu et il est le suivant:

<textarea cols="100%" rows="1o" class="nifty_form" title="Broadcast text goes here" autofocus="autofocus" name="broadcast[content]" id="broadcast_content" style="z-index: auto; position: relative; line-height: normal; font-size: 10.6667px; transition: none; background: transparent !important;" data-gramm="true" data-txt_gramm_id="b763ea7b-2eef-d3c8-b750-a085d2c9ce80" data-gramm_id="b763ea7b-2eef-d3c8-b750-a085d2c9ce80" spellcheck="false" data-gramm_editor="true"></textarea> 

donc voir ce qui a un ID dans la page rendue J'ai décidé d'écrire un test avec cet ID comme suit:

When(/^the admin user broadcasts "([^"]*)" to the notification feed$/) do |userBroadcast| 
    visit('/broadcasts/new.html') 
    fill_in('#broadcast_content', with: userBroadcast) 
end 

Mais encore une fois, je suis resté avec le même message d'erreur de

Unable to find field "broadcast_content" (Capybara::ElementNotFound) 

Est-il possible d'imprimer toutes les années de la Div classe que Capybara peut voir? Comment puis-je déboguer ce problème? Ai-je raison de supposer que Cappybara suit le lien après avoir cliqué sur un bouton? et la session est maintenue en vie?

Répondre

0

Capybaras fill_in prend le nom, l'identifiant, l'espace réservé ou le texte d'étiquette de l'entrée que vous voulez remplir. Il ne prend pas de sélecteur CSS. Dans votre exemple qui se traduirait par

fill_in('broadcast_content', with: userBroadcast) 

depuis l'id est « broadcast_content » non « #broadcast_content »

Si vous voulez utiliser des sélecteurs css alors vous aurez besoin de faire quelque chose comme

find(:css, '#broadcast_content').set(userBroadcast) # the :css is optional if your default selector type is set to :css 

Dans la dernière version de Capybara les chaînes de localisation sont maintenant en option, et: id et: options de classe sont disponibles, donc je crois pourrait aussi avoir été votre première tentative écrite comme

fill_in(class: 'nifty_form', with: userBroadcast) 

bien que depuis les classes ne sont généralement pas unique sur une page que vous êtes probablement mieux coller avec l'id

+0

J'ai essayé tous les exemples ci-dessus et je reçois toujours un élément non trouvé, je l'ai collé plus de mon Fichier erb.html ci-dessus. – Definity

+0

@Definity il semble que la zone de texte n'est pas réellement visible sur la page et est remplacé par un widget JS. Est-ce le cas? Si c'est le cas, vous devrez interagir avec les éléments du widget plutôt qu'avec la zone de texte. –