如何用Capybara的has_select反驳选项的存在?

问题描述 投票:0回答:2

假设您有一个仅包含以下选项的选择列表:

<option>Second Fake Option</option>

并且您想断言选择列表包含带有文本“Fake Option”的选项:

<option>Fake Option</option>

当有人这样反驳这一点时:

refute has_select?('list_id',
  with_options: ['Fake Option'])

测试失败。看来水豚成功地部分匹配了文本

Fake Option
与文本
Second Fake Option
。更进一步,以下也失败了:

refute has_select?('select_id',
  with_options: [''])

然而以下通过:

refute has_select?('select_id',
  with_options: ['BORK'])

with_options:
options:
的文档描述了有关我们尝试匹配的选项list的行为,但没有谈到部分匹配文本本身的行为。 这里关于SO的其他问题指的是相同的记录行为......但不涉及反驳或选项文本的匹配。

虽然我可以使用

assert
options:
相反的行为,如下所示:

assert has_select?('select_id',
  options: ['Second Fake Option'])

当您有很长的选择列表并想要反驳列表中某个特定选项的存在时,这可能会很痛苦。

如何正确地反驳选择列表中特定选项的存在?

testing capybara
2个回答
1
投票

部分文本匹配是默认行为,但可以使用 :exact 选项覆盖。另外,您应该调用

refute_select
,而不是反驳谓词 - 错误消息会好得多

refute_select('select_id', with_options: ['Fake Option'], exact: true)

注意:如果页面上没有“select_id”选择元素,这也会通过,这可能不是您想要的。如果您想验证选择是否存在,但它没有特定选项,那么类似

select = find_field('select_id')
refute_selector(select, :option, 'Fake Option', exact:  true)

可能是你想要的,也可以通过匹配来完成

select = find_select('select_id')
refute_matches_selector(select, :select, with_options['Fake Option'], exact: true)

0
投票

您可以直接通过

反驳该选项的存在
assert_no_selector("option[value='Fake Option']", visible: :all)

注意

visible: :all
如果选择的选项被隐藏,它仍然会匹配/拒绝匹配。

© www.soinside.com 2019 - 2024. All rights reserved.