2

我正在尝试选择选项 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>

这是选择 2 的 Watir 代码:

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

3 回答 3

2

问题是您正在使用 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>

如果你想坚持按文本选择,直接定位/选择选项元素:

id = "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id"
b.select_list(:id, id).option(:text, "2").select
#=> will select <option value="3">2</option>
于 2016-12-02T00:23:32.000 回答
1

对于 Watir,您可以在只需要担心索引的情况下使用基于索引的选项。比如对于:

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

我们可以用,

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

因为它是给定 select_list 的第三个索引,它遵循基于零的索引排序。同样对于,

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

我们可以用

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

因为它是给定 select_list 的第四个索引。

于 2017-09-17T11:14:56.953 回答
0

#select匹配文本。如果要按值选择,则需要使用#select_value

b.select_list(id: "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select_value "2"
于 2016-12-01T23:17:53.073 回答