Capybara - 查找位于 table 行的禁用按钮

Capybara - Finding a disabled button located in table row

我有一个按钮

<button type="button" id="saveListing" class="button small save-button" data-bind="enable: saveEnabled, click: save"><i class="fa fa-save"></i> Save</button>

位于table.

的tr

我写了一个测试按钮状态的函数,简单地使用:

And(/^...the button "(.*?)" on "(.*?)" page is disabled$/) do |button_name, page|

  button_id = ConfigHelper.get_button_info(button_name, page)['id']
  button_class = ConfigHelper.get_button_info(button_name, page)['class']

  if !button_id.nil?
    find_button(button_id)[:disabled].should eq 'true'
  elsif !button_class.nil?
    find(button_class)[:disabled].should eq 'true'
  else
    button_text = ConfigHelper.get_button_info(button_name, page)['text']
    find('button', text: button_text)[:disabled].should eq "true"
  end
end

但是,此块不适用于 table 行中的按钮。我也尝试通过按钮 ID 添加检查,但它也没有用。不把tableid作为参数怎么实现呢? (因为我不想在功能中写 table id)

使用id时,错误为:

Capybara::ElementNotFound: Unable to find css ".saveListing"

或使用文字:

 Ambiguous match, found 4 elements matching css "button" (Capybara::Ambiguous)

谢谢。

saveListing 按钮 id,而不是 class。在 css 选择器中, 用于 classes井号用于ids

因此,您应该使用 #saveListing.save-button,而不是 .saveListing。这就是您的第一次匹配失败的原因。


至于第二个为什么会这样——我猜有 4 行,每行有一个按钮,Capybara 不知道你指的是哪一个。如果你想检查 所有 的条件,你可以使用 all 而不是 find 像这样:

all('button', text: button_text).each do |button|
  button[:disabled].should eq "true"
end

Capybaras find_button 根本不搜索 css 类 所以除非你已经覆盖 find_button 我不确定你为什么会从将其与 id 一起使用。 find_button 会根据按钮的id, value, text content, 或title 属性进行搜索,也支持禁用过滤器进行搜索。更稳定的(如果按钮的状态由于 JS 而改变)这些检查的版本将是

find_button('saveListing', disabled: true).should be #Note: no # in front of the id here since its not a css selector
find_button('button text', disabled: true).should be

这些会更稳定,因为它们会利用 Capybaras 的等待行为来找到禁用的按钮,而之前编写的方式会立即找到按钮并在尚未禁用时出错。