没有 JavaScript 水豚不会选择单选按钮

Capybara is not choosing radio button without JavaScript

我有一个 Rails 应用程序,在一个表单中有两个单选按钮。

我注意到我的 Capybara 测试(使用 RSpec)没有 select“否”单选按钮,除非它 运行 带有 JavaScript 驱动程序(我使用 selenium_chrome_headless)。测试套件还有许多其他 Capybara 测试,无需 JS 即可提交表单,除非需要,否则我会避免启用 JS 驱动程序。

在这种情况下,我不明白是什么阻止了 Capybara select 没有 JS 的单选按钮

ERB表格(使用simple_form):

<%= b.input :baz,
  as: :radio_buttons,
  label: ''
%>

生成这个 HTML:

<fieldset class="form-group radio_buttons optional foo_bar_baz form-group-valid">
  <legend class="col-form-label pt-0"></legend>
  <input type="hidden" name="foo[bar_attributes][baz]" value="">

  <div class="form-check">
    <input class="form-check-input is-valid radio_buttons optional" type="radio" value="true" checked="checked" name="foo[bar_attributes][baz]" id="foo_bar_attributes_baz_true">
    <label class="collection_radio_buttons" for="foo_bar_attributes_baz_true">Yes</label>
  </div>

  <div class="form-check">
    <input class="form-check-input is-valid radio_buttons optional" readonly="readonly" type="radio" value="false" name="foo[bar_attributes][baz]" id="foo_bar_attributes_baz_false">
    <label class="collection_radio_buttons" for="foo_bar_attributes_baz_false">No</label>
  </div>
</fieldset>

还有水豚测试:

describe 'Selecting "No"', js: true do
  it 'saves the information' do
    fill_in 'Name', with: 'Alice'
    choose 'No'
    click_button 'Continue'
  end
end

哪个有效。

但是当我 运行 没有 js: true 的相同测试时,提交表单会发送来自 foo_bar_attributes_baz_true 的默认值。我没有从 Capybara 那里得到一个错误,说它找不到或选择单选按钮(虽然我确实尝试给它一个 id 或 CSS select 或者,但总是结果在相同的查询参数中)。

两种设置(有和没有 JavaScript 驱动程序)之间有什么不同,这使得 Capybara choose 方法实际上不会设置输入值,除非启用 JavaScript?

发生这种情况是因为您的“否”单选按钮是只读的 - 因此无法选择。 我假设当 运行 一个真正的浏览器时,你有一些 JS 正在删除单选按钮的只读性。

更新:在考虑更多之后。 readonly 属性在单选按钮 元素上实际上无效,因此 Capybara 中存在一个错误,它正在考虑该属性,但您的 HTML 在技术上也是无效的,所以...

仅供参考:Capybara 主分支现在应该忽略单选按钮上的只读属性