Подтвердить что ты не робот

Capybara: выберите вариант по значению, а не текст

Для HTML

<select id="date">
  <option value="20120904">Tue 4 Sep 2012</option>
  <option value="20120905">Wed 5 Sep 2012</option>
  <option value="20120906">Thu 6 Sep 2012</option>
</select>

У меня есть следующий код Capybara Ruby:

select "20120905", :from => "date"

Но эти ошибки с:

cannot select option, no option with text '20120905' in select box 'date' (Capybara::ElementNotFound)

Однако, если я делаю

select "Wed 5 Sep 2012", :from => "date"

Это нормально.

Можно ли выбрать опцию в Capybara по значению не текста?

Спасибо

4b9b3361

Ответ 1

Это будет работать, чтобы выбрать параметр по значению:

find("option[value='20120905']").click

Чтобы сохранить область действия селектора, вы можете обернуть ее внутри внутри блока следующим образом:

within '#date' do
  find("option[value='20120905']").click
end

Ответ 2

С помощью Poltergeist в качестве драйвера я не могу нажимать на такой вариант, как предлагается в некоторых других вариантах выше, вместо этого вы можете сделать следующее:

page.find_by_id('date').find("option[value='20120905']").select_option

Ответ 3

Я написал вспомогательный метод:

def select_by_value(id, value)
  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"
  option = find(:xpath, option_xpath).text
  select(option, :from => id)
end

Сохранить в файле .rb в spec/support/

Пример использования:

before do
  select_by_value 'some_field_id', 'value'
  click_button 'Submit'
end

Ответ 4

Вы также можете добиться этого, выполнив следующие действия:

find_by_id('date').find("option[value='20120905']").click

Ответ 5

Этот вспомогательный метод довольно умен. Я бы немного изменил это:

def select_by_value(id, value)

  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"

  find(:xpath, option_xpath).click

end

или просто:

find(:xpath, "//select[@id='date']/option[@value='20120904']").click

Ответ 6

В моем случае у меня есть несколько вариантов с одним и тем же текстом, поэтому мне нужно выбрать по значению. Объединив несколько ответов, я нашел лучшее решение для меня:

def select_by_value(id, value)
  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"
  find(:xpath, option_xpath).select_option
end

Ответ 7

Щелчок с помощью функции find_field отлично работает:

find_field("date").find("option[value='20120905']").click

Ответ 8

Вы также можете использовать capybara-ui, который будет выглядеть сначала, чтобы соответствовать тексту, а затем соответствовать значению.

# define your form widget, in this case in a role
class UserRole < Capybara::UI::Role
  form :my_form do
    select :my_select, 'my_select'
  end
end

# then just submit your form params via #submit
role = UserRole.new

role.submit :my_form, my_select: '20120905'

Подробнее о capybara-ui forms здесь.