Механизировать установку поля с повторяющимся именем
-
13-09-2019 - |
Вопрос
Я использую mechanize, и у меня возникла проблема с одной формой...форма содержит два поля выбора с одинаковым названием.
Как я могу выбрать второй вариант?
т. е.NumNights второе происшествие.
я нашел в документах что-то вроде этого:
form.set_fields( :foo => ['bar', 1] )
но это не сработало:
form.field_with(:name => [ 'NumNights', 2 ]).options[no_days.to_i-1].select
Решение
Получите ссылку на форму и выполните итерацию по элементам.Что- то вроде этого :
my_fields = form.fields.select {|f| f.name == "whatever"}
my_fields[1].whatever = "value"
После того как вы закончите заполнять формы, отправьте их.Я не запускал этот код, но я думаю, что он должен сработать.
Другие советы
У Geo есть достойное решение, но в нем есть несколько упущенных возможностей.
Если вы находите только один элемент, вероятно, эффективнее использовать Enumerable#find вместо Enumerable#select, а затем Array#first поверх этого.В качестве альтернативы вы можете просто выполнить переназначение во время выбора.
Если вы посмотрите на предлагаемый подход, есть вероятность, что вы вызовете исключение, если поле с таким именем не найдено:
# Original approach
my_fields = form.fields.select {|f| f.name == "whatever"}
# Chance of exception here, calling nil#whatever=
my_fields[1].whatever = "value"
Я бы посоветовал использовать Enumerable#select и просто выполнять работу внутри цикла, так гораздо безопаснее:
my_fields = form.fields.select do |f|
if (f.name == "whatever")
# Will only ever trigger if an element is found,
# also works if more than one field has same name.
f.whatever = 'value'
end
end
Другой подход заключается в использовании Enumerable#find, который возвращает не более одного элемента:
# Finds only a single element
whatever_field = form.fields.find { |f| f.name == "whatever" }
whatever_field and whatever_field.whatever = 'value'
Конечно, вы всегда можете дополнить свой код перехватами исключений, но это кажется контрпродуктивным.