如何在 select 列表中 select 特定选项?
How to select particular option in a select list?
我正在尝试 select 选项 2,但首先是 selecting 2 然后更改为 1。
这是 select 列表的 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>
这是 selecting 2 的 Watir 代码:
b.select_list(:id,"IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select "2"
#select
匹配文本。
如果你想 select 按值你需要使用 #select_value
:
b.select_list(id: "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select_value "2"
问题是您正在使用 Watir-Classic 的 select
方法,其参数与选项的文本和另一个选项的值都匹配。
如果你看一下 code for the Watir::SelectList#select
method:
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 selects it.
对于您的具体示例,这意味着
- 2 个选项匹配输入“2”:
<option value="2">1</option>
匹配,因为它的 value
是“2”
<option value="3">2</option>
匹配,因为它的 text
是“2”
- Watir-Classic 按此特定顺序 select 选择每个选项,这就是为什么您会看到下拉列表切换到“1”然后切换到“2”的原因
鉴于该方法的编写方式以及您的 select 列表的编写方式,您不能使用 select
方法。虽然最好的选择是转移到 Watir(以前的 Watir-Webdriver),但 Watir-Classic 中有一些解决方法。
通过专门 select 仅基于 value
属性的选项消除歧义:
id = "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id"
b.select_list(:id, id).select_value "3"
#=> will select <option value="3">2</option>
如果你想坚持selecting by text,直接locate/select选项元素:
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
因为它是给定 select_list 的第三个索引,并且它遵循从零开始的索引排序。同样,
<option value="3">2</option>
我们可以使用
browser.select_list(id: 'IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id').options[3].select
因为它是给定的第 4 个索引 select_list。
我正在尝试 select 选项 2,但首先是 selecting 2 然后更改为 1。
这是 select 列表的 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>
这是 selecting 2 的 Watir 代码:
b.select_list(:id,"IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select "2"
#select
匹配文本。
如果你想 select 按值你需要使用 #select_value
:
b.select_list(id: "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id").select_value "2"
问题是您正在使用 Watir-Classic 的 select
方法,其参数与选项的文本和另一个选项的值都匹配。
如果你看一下 code for the Watir::SelectList#select
method:
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 selects it.
对于您的具体示例,这意味着
- 2 个选项匹配输入“2”:
<option value="2">1</option>
匹配,因为它的value
是“2”<option value="3">2</option>
匹配,因为它的text
是“2”
- Watir-Classic 按此特定顺序 select 选择每个选项,这就是为什么您会看到下拉列表切换到“1”然后切换到“2”的原因
鉴于该方法的编写方式以及您的 select 列表的编写方式,您不能使用 select
方法。虽然最好的选择是转移到 Watir(以前的 Watir-Webdriver),但 Watir-Classic 中有一些解决方法。
通过专门 select 仅基于 value
属性的选项消除歧义:
id = "IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id"
b.select_list(:id, id).select_value "3"
#=> will select <option value="3">2</option>
如果你想坚持selecting by text,直接locate/select选项元素:
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
因为它是给定 select_list 的第三个索引,并且它遵循从零开始的索引排序。同样,
<option value="3">2</option>
我们可以使用
browser.select_list(id: 'IDITForm@additionalVehicleDrivers|1@youngestDriverExperienceVO@id').options[3].select
因为它是给定的第 4 个索引 select_list。