2015-02-19 1 views
0

Во-первых, этот тест прошел уже много раз. Сегодня я разрабатываю новые функции, и по какой-то причине он теперь терпит неудачу.Почему RSpec 2.13.0/Capybara 2.1.0 не может заполнить поле в виде текста метки в этом тесте в Rails 4?

Вот уместна часть моей тестовой спецификации:

... 
    describe "when entering a valid prepay access code after signing in" do 
     before do 
      sign_in user, subdomain: 'bdsp' 
      visit public_root_url(subdomain: 'bdsp') 
      fill_in "code", with: job.code 
      click_button "Continue" 
     end 

     it { should have_selector('h1', text: "My #{job.subject_label}s for #{job.name}") } 

     describe "adding a sports prepay subject" do 
      let(:submit) { "Add #{job.subject_label}" } 
      before do 
       puts page.html 
       valid_create_player 
      end 

      it "should create a player" do 
       expect { click_button submit }.to change(PrepaySubject, :count).by(1) 
      end 
    ... 

Обратите внимание, как я звоню puts page.html прямо перед valid_create_player, так что я могу проверить наличие входного/ярлыка я ожидаю.

Соответствующая часть моего spec\support\utilities.rb файла:

def valid_create_player 
     fill_in 'First name', with: "Foo" 
     fill_in 'Last name', with: "Bar" 
     fill_in 'Team',  with: "The Foobars" 
     fill_in 'Coach',  with: "Bar Foo" 
    end 

И результаты моего теста (ограничено одним испытанием для should create a player):

Jims-Mac-mini:msc_rails4_staging jim$ rspec spec/requests/public_pages_spec.rb:103 
    No DRb server is running. Running in local process instead ... 
    Run options: include {:locations=>{"./spec/requests/public_pages_spec.rb"=>[103]}} 
    <!DOCTYPE html> 
    <html> 
    <head> 
     <title>MSC - Staging App | Studio 2&#39;s MySmileCentral - Subjects</title> 
      <link data-turbolinks-track="true" href="/assets/public.css" media="screen" rel="stylesheet" /> 
      <link data-turbolinks-track="true" href="/assets/jm30.css" media="screen" rel="stylesheet" /> 
      <link data-turbolinks-track="true" href="/assets/print.css" media="print" rel="stylesheet" /> 
      <script data-turbolinks-track="true" src="/assets/application.js"></script> 
      <script data-turbolinks-track="true" src="/assets/public.js"></script> 
     <script data-turbolinks-track="true" src="/assets/prepay_subjects.js"></script> 

     <!--[if lt IE 9]> 
     <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
    </head> 
    <body data-no-turbolink="true"> 
      <header class="navbar navbar-fixed-top navbar-inverse"> 
     <div class="navbar-inner"> 
      <div class="container"> 
       <nav> 
        <ul class="nav pull-right"> 
           <li><a href="/">Home</a></li> 
           <li><a href="/help">Help</a></li> 
           <li id="fat-menu" class="dropdown"> 
            <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 
             Account <b class="caret"></b> 
            </a> 
            <ul class="dropdown-menu"> 
             <li><a href="https://stackoverflow.com/users/1">Profile</a></li> 
             <li><a href="https://stackoverflow.com/users/1/edit">Settings</a></li> 
             <li class="divider"></li> 
             <li> 
              <a data-method="delete" href="/signout" rel="nofollow">Sign out</a> 
             </li> 
            </ul> 
           </li> 
        </ul> 
       </nav> 
      </div> 
     </div> 
    </header> 

      <div class="container"> 

    <h1>My Players for Job Number 1</h1> 

    <div class="medium center"> 
     <p><a id="order-instructions-show" data-toggle="collapse" href="#collapseExample" 
      aria-expanded="false" aria-controls="collapseExample">Toggle ordering instructions</a></p> 
     <div class="collapse" id="collapseExample"> 
      <h4 style="text-align: left">1. Create a player record for each child being photographed.<br />2. Click the 'Order Pictures' link (next to each player) to make your selection.<br />&nbsp &nbsp &nbsp <span style="font-size: 80%; line-height: 125%;">NOTE: You can pay for all pictures for all of your players in ONE transaction!<br />&nbsp &nbsp &nbsp Just click 'My Players' (above) to start ordering for another player.</span><br />3. After adding all the pictures you wish to order, proceed to viewing your cart (by clicking the 'Cart' link above) to complete your transaction.</h4> 
     </div> 
    </div> 

      <h3>You have not added any players yet</h3> 

     <div id="no-prepay-subjects-bkgd"> 
      <div class="well small center"> 
       <h1>Add a New Player</h1> 
       <form accept-charset="UTF-8" action="/prepay_subjects" class="form-horizontal" id="new_prepay_subject" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div> 

    <fieldset> 
     <input id="job_id" name="prepay_subject[job_id]" type="hidden" value="1" /> 
     <input id="public_user_id" name="prepay_subject[public_user_id]" type="hidden" value="1" /> 

     <div class="control-group">  
      <label class="control-label" for="prepay_subject_first_name">First name</label> 
      <div class="controls"> 
       <input id="prepay_subject_first_name" name="prepay_subject[first_name]" type="text" /> 
      </div> 
     </div> 

     <div class="control-group">  
      <label class="control-label" for="prepay_subject_last_name">Last name</label> 
      <div class="controls"> 
       <input id="prepay_subject_last_name" name="prepay_subject[last_name]" type="text" /> 
      </div> 
     </div> 

     <div class="control-group"> 
      <label class="control-label" for="prepay_subject_Team">Team</label> 
      <div class="controls"> 
       <input id="prepay_subject_team" name="prepay_subject[team]" type="text" /> 
      </div> 
     </div> 

     <div class="control-group"> 
      <label class="control-label" for="prepay_subject_Coach">Coach</label> 
      <div class="controls"> 
       <input id="prepay_subject_coach" name="prepay_subject[coach]" type="text" /> 
      </div> 
     </div> 

     <table style="width: 400; margin-left: 100px;"> 
       <tr> 
        <td style="text-align: left; width: 175px"> 
         <input checked="checked" id="prepay_subject_buddy_false" name="prepay_subject[buddy]" type="radio" value="false" /> Individual/Team 
        </td> 
        <td style="text-align: left; width: 225px"> 
         <input id="prepay_subject_buddy_true" name="prepay_subject[buddy]" type="radio" value="true" /> Buddy <br /> 
        </td> 
       </tr> 
       <tr> 
        <td style="text-align: left; width: 175px"></td> 
        <td style="text-align: left; width: 225px"> 
         <a href="http://assests0_bop_heroku_com.s3.amazonaws.com/images/jm30/whats_a_buddy_shot.png" onclick="window.open(this.href,&#39;create_company&#39;, &#39;height=580, width=630&#39;);return false;" title="Click here for more information about buddy photos">What&#39;s a buddy shot?</a> 
        </td> 
       </tr> 
       <br /> 
     </table> 
     <br />    
    </fieldset> 
        <input class="btn btn-large btn-primary pull-center" name="commit" type="submit" value="Add Player" /> 
    </form>  <div class="clearfix"></div><!-- keeps the submit button properly wrapped in 'well' div --> 
      </div> 
     </div> 


       <footer> 
     <nav> 
      <ul> 
       <li><a href="/about">About</a></li> | 
       <li><a href="/contact">Contact</a></li> | 
       <li><a href="http://news.railstutorial.org/">News</a></li> 
      </ul> 
     </nav> 
      <div class="left text-left"> 
        Studio 2<br /> 

        Phone: 123-456-7890<br /> 

      </div> 
      <div class="right text-right"> 
        Copyright &copy 2015 Studio 2,<br />All Rights Reserved <br /> 

         Sampletown, US 
      </div> 
    </footer> 

      </div> 
    </body> 
    </html> 
    F 

    Failures: 

     1) Public Pages public users home page when entering a valid prepay access code after signing in adding a sports prepay subject should create a player 
      Failure/Error: valid_create_player 
      Capybara::ElementNotFound: 
       Unable to find field "Team" 
      # ./spec/support/utilities.rb:135:in `valid_create_player' 
      # ./spec/requests/public_pages_spec.rb:100:in `block (5 levels) in <top (required)>' 

    Finished in 2.85 seconds 
    1 example, 1 failure 

    Failed examples: 

    rspec ./spec/requests/public_pages_spec.rb:103 

Я просто не понимаю, как Capybara не находит поле для «Команды», когда в ярлыке четко указано «Команда» в выведенном html. Тем более, что это работало до сегодняшнего дня - и работало много раз. Все остальные тесты, которые используют текст текста ярлыка fill_in, по-прежнему работают. Почему Capybara кажется слепым в моем поле «Команда»?

+0

Я также знаю, что я мог бы просто изменить 'fill_in', чтобы найти элемент по его идентификатору, а не по тексту метки, но меня не интересует обходной путь. Я хочу, чтобы Капибара работала так, как должна здесь. – digijim

ответ

2

Идентификаторы HTML чувствительны к регистру, и вы определили метку Team как применяемую к идентификатору prepay_subject_Team, который не отображается на вашей странице. Только идентификатор prepay_subject_team (например, нижний регистр t в Team).

Если капитализация в атрибуте for элемента метки не соответствует капитализации атрибута id соответствующего элемента ввода, Capybara не может найти элемент ввода.

+0

В соответствии с документами Капибары [здесь] (http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in), «Поле можно найти через его имя, идентификатор или текст ярлыка «. Я идентифицировал «Team» как текст ярлыка, который можно найти, что явно отображается на странице рендеринга. Мой 'utilities.rb' заполнен капитализированными именами полей, и каждая другая спецификация в моем пакете проходит. Даже поля «Имя» и «Фамилия» в тесте _this_ заполняются правильно, несмотря на наличие идентификаторов «prepay_subject_first_name' и' prepay_subject_last_name'. Очень странно, ИМО. – digijim

+0

Я просто попробовал 'fill_in 'team'', и Capybara вернул' Невозможно найти поле «команда» '. – digijim

+1

Нет ничего плохого в вашем заглавном тексте ярлыка. Проблема заключается в том, что капитализация в атрибуте 'for' вашего элемента label не соответствует капитализации атрибута' id' вашего элемента 'input', поэтому ярлык не привязан ни к чему (т. Е. Там нет поля ввода для поиска). –

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