问题是您正在使用 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
你可以看到:
- 它根据文本、标签和值获取匹配选项列表,以及
- 然后对于每个匹配的选项,Watir-Classic 都会选择它。
对于您的具体示例,这意味着
- 2 个选项与输入“2”匹配:
<option value="2">1</option>
匹配,因为它value
是“2”
<option value="3">2</option>
匹配,因为它text
是“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>
如果你想坚持按文本选择,直接定位/选择选项元素:
id = "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id"
b.select_list(:id, id).option(:text, "2").select
#=> will select <option value="3">2</option>