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 的等待行为来找到禁用的按钮,而之前编写的方式会立即找到按钮并在尚未禁用时出错。
我有一个按钮
<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 的等待行为来找到禁用的按钮,而之前编写的方式会立即找到按钮并在尚未禁用时出错。