Огурец, как имитировать множественный выпадающий выбор? - PullRequest
0 голосов
/ 14 марта 2012

Привет, я новичок в Cucumber и Ruby on Rails, и я не могу понять, как имитировать выбор нескольких выпадающих меню.Я могу сделать это для одного выпадающего меню (в моем случае «Рейтинг»).

Given /the following movies exist:$/ do |movies_table|
  movies_table.hashes.each do |movie|
    # each returned element will be a hash whose key is the table header.
    # you should arrange to add that movie to the database here.
  Given %Q{I am on the Create New Movie page}
  When  %Q{I fill in "Title" with "#{movie[:title]}"}
  And   %Q{I select "#{movie[:rating]}" from "Rating"}
  And   %Q{I select "#{movie[:release_date]}" from "Released On"}
  And   %Q{I press "Save Changes"}
  end
  assert false, "Unimplmemented"
end

Ошибка, которая, на мой взгляд, имеет отношение к моей проблеме:

cannot select option, no select box with id, name, or label 'Released On' found (Capybara::ElementNotFound)
      (eval):2:in `select'
      ./step_definitions/web_steps.rb:86:in `/^(?:|I )select "([^"]*)" from "([^"]*)"$/'
      filter_movie_list.feature:9:in `Given the following movies exist:'

Я считаю, что соответствующий исходный код из моего веб-приложения:

    <label for="movie_title">Title</label>
    <input id="movie_title" name="movie[title]" size="30" type="text" />
    <label for="movie_rating">Rating</label>
    <select id="movie_rating" name="movie[rating]"><option value="G">G</option>
    <option value="PG">PG</option>
    <option value="PG-13">PG-13</option>

    <option value="R">R</option>
    <option value="NC-17">NC-17</option></select>
    <label for="movie_release_date">Released On</label>
    <select id="movie_release_date_1i" name="movie[release_date(1i)]">
    <option value="2007">2007</option>
    <option value="2008">2008</option>

    < And so on ...>

    </select>
    <select id="movie_release_date_3i" name="movie[release_date(3i)]">
    <option value="1">1</option>

    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>

    < And so on ...>

    </select>
    <input name="commit" type="submit" value="Save Changes" />

Так что меня ссылаются на ярлык «Разрешено», но в моем сообщении об ошибке говорится, что у него нет поля выбора, но он работаетРейтинг.Также из моего .feature файл имеет вид

25-Nov-1992

Если он вообще играет роль.Но я предположил, что нет, поскольку, как мне кажется, ruby ​​понимает, как обращаться с датами.Спасибо за ваше время.

1 Ответ

1 голос
/ 15 марта 2012

Проблема в том, что метка Released On имеет for="movie_release_date", а в поле выбора - id="movie_release_date_1i". Значения for и id должны совпадать, чтобы Капибара могла найти поле на основе текста его метки.

Возможные решения:

1) Исправьте HTML, если у вас есть контроль над ним.

Вы хотите иметь:

<label for="movie_release_date">Released On</label>
<select id="movie_release_date" name="movie[release_date(1i)]">

или

<label for="movie_release_date_1i">Released On</label>
<select id="movie_release_date_1i" name="movie[release_date(1i)]">

2) Доступ к полю выбора по идентификатору или имени.

And   %Q{I select "#{movie[:release_date]}" from "movie_release_date_1i"}

или

And   %Q{I select "#{movie[:release_date]}" from "movie[release_date(1i)]"}

Этот параметр будет работать только в том случае, если идентификатор или имя являются статическими (т. Е. Это число в конце всегда одинаково, а не генерируется случайным образом при каждой загрузке страницы).

3) Используйте Капибару напрямую, а не web_steps.rb

Если вы используете Capybara напрямую, а не web_steps.rb (который, как я полагаю, взяты из ваших шагов), вы получите гораздо больше опций для поиска поля выбора (ex xpath).

...