Как выбрать конкретную опцию в списке выбора?

Я пытаюсь выбрать вариант 2, но сначала он выбирает 2, а затем меняется на 1.

Это HTML-код списка выбора:

<select id="IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id">
  <option style="background-color: rgb(252, 218, 175);" value="-1">Select</option>
  <option value="1">0</option>
  <option value="2">1</option>
  <option value="3">2</option>
  <option value="4">3</option>
  <option value="5">4</option>
  <option value="1000000">5</option>
  <option value="1000001">more than 5</option>
</select>

Это код Watir для выбора 2:

b.select_list(:id,"IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select "2"

3 ответа

Решение

Проблема в том, что вы используете Watir-Classic select Метод с параметром, который соответствует как тексту опции, так и значению другой опции.

Если вы посмотрите на код для Watir::SelectList#select метод:

def select(item)
  matching_options = []
  perform_action do
    matching_options = matching_items_in_select_list(:text, item) +
      matching_items_in_select_list(:label, item) +
      matching_items_in_select_list(:value, item)
    raise NoValueFoundException, "No option with :text, :label or :value of #{item.inspect} in this select element" if matching_options.empty?
    matching_options.each(&:select)
  end
  first_present_option_value matching_options, :text
end   

Ты это видишь:

  1. Он получает список подходящих опций на основе текста, метки и значения и
  2. Затем для каждого соответствующего параметра Watir-Classic выбирает его.

Для вашего конкретного примера это означает, что

  1. 2 варианта соответствуют вводу "2":
    • <option value="2">1</option> совпадает с его value это "2"
    • <option value="3">2</option> совпадает с его text это "2"
  2. Watir-Classic выбирает каждую из этих опций в определенном порядке, поэтому вы видите выпадающий переключатель "1", а затем "2"

Учитывая, как метод написан и как написан ваш список выбора, вы не можете использовать select метод. Хотя лучшим выбором является переход на Watir (ранее Watir-Webdriver), в Watir-Classic есть обходные пути.

Устраните неоднозначность, выбрав опцию на основе только value атрибут:

id = "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id"
b.select_list(:id, id).select_value "3"
#=> will select <option value="3">2</option>

Если вы хотите придерживаться выбора по тексту, непосредственно найдите / выберите элемент option:

id = "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id"
b.select_list(:id, id).option(:text, "2").select
#=> will select <option value="3">2</option>

Для Watir вы можете использовать опции, основанные на индексах, когда вам нужно беспокоиться только об индексе. Например, для:

<option value="2">1</option>

Мы можем использовать,

browser.select_list(id: 'IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id').options[2].select

Так как это 3-й индекс данного select_list, и он следует за порядком индекса на основе нуля. Аналогично для

<option value="3">2</option>

Мы можем использовать

browser.select_list(id: 'IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id').options[3].select

Так как это 4-й индекс данного select_list.

#select соответствует тексту. Если вы хотите выбрать по значению, вы должны использовать #select_value:

b.select_list(id: "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select_value "2"
Другие вопросы по тегам