2016-12-02 1 views
0

So, hier ist mein Test.Rails Gurke Capybara id/Klasse Auswahl

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 

Ich habe hinzugefügt, in meine new.html.erb eine Klasse ‚geschickte-Form‘ genannt, wie Sie unten sehen können.

<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> 

Aber aus irgendeinem Grund habe ich das Ergebnis:

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

ich die Quelle der wiedergegebenen Seite angesehen haben, und es ist die folgende:

<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> 

So sehen dies hat eine ID in der gerenderten Seite habe ich beschlossen, wie so einen Test mit dieser ID zu schreiben:

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

Aber noch einmal ich mit der gleichen Fehlermeldung von

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

Gibt es eine Möglichkeit zum Ausdrucken aller Div der Klasse ist das Capybara sehen bin übrig geblieben? Wie kann ich dieses Problem beheben? Habe ich recht, wenn ich annehme, dass Cappybara dem Link folgt, nachdem ein Button angeklickt wurde? und die Sitzung wird am Leben erhalten?

Antwort

0

Capybaras fill_in nimmt den Namen, id, Platzhalter oder Beschriftungstext des Eingangs Sie fill_in wollen. Es braucht keinen CSS-Selektor. In Ihrem Beispiel, das zu

fill_in('broadcast_content', with: userBroadcast) 

würde übersetzen, da die ID nicht ‚#broadcast_content‘

Wenn Sie CSS-Selektoren verwenden wollen, dann müssen Sie so etwas wie

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

In der neuesten Version von Capybara sind die Locator-Strings jetzt optional, und: id und: Klassenoptionen zur Verfügung stehen, so glaube ich, auch als

012 geschrieben worden war Ihr erster Versuch konnte

obwohl seit Klassen sind in der Regel nicht eindeutig auf einer Seite sind Sie wahrscheinlich besser dran mit der ID kleben

+0

Ich habe alle oben genannten Beispiele ausprobiert und ich immer noch ein Element nicht gefunden wird, habe ich mehr meiner geklebt erb.html Datei oben. – Definity

+0

@Definity es klingt wie die Textarea ist nicht wirklich auf der Seite sichtbar und wird durch ein JS-Widget ersetzt. Ist das der Fall? In diesem Fall müssen Sie mit den Elementen des Widgets und nicht mit dem Textarea interagieren. –

Verwandte Themen