20

我有一个带有标签的选择框:

<label for="slide_orientation">Slide orientation</label>
<select disabled="" class="property" id="slide_orientation" name="slide_orientation">
  <option value="horizontal">Horizontal</option>
  <option value="vertical" selected="selected">Vertical</option>
</select>

如您所见,选择框已禁用。当我尝试用 找到它时field_labeled("Slide orientation"),它返回一个错误:

Capybara::ElementNotFound: Unable to find field "Slide orientation"
from /Users/pascal/.rvm/gems/ruby-1.9.3-p392/gems/capybara-2.0.2/lib/capybara/result.rb:22:in `find!'

When the select box is not disabled, field_labeled("Slide orientation")returns the select element just fine.

这是预期的行为吗?如果是这样,我将如何寻找禁用的元素?就我而言,我需要它来测试它是否被禁用。

4

4 回答 4

37

Capybara 2.1.0 支持disabledfilter。您可以使用它轻松找到禁用的字段。

field_labeled("Slide orientation", disabled: true)

您需要明确指定它,因为disabled默认情况下过滤器是关闭的。

于 2013-09-03T01:42:35.070 回答
11

如果它具有禁用属性,则此选项通过。

运行js: truepage.evaluate_script

it "check slider orientation", js: true do
    disabled = page.evaluate_script("$('#slide_orientation').attr('disabled');")
    disabled.should == 'disabled' 
end

更新

或者你可以使用have_css

page.should have_css("#slide_orientation[disabled]") 

(从这个出色的答案中窃取)

于 2013-03-13T23:22:33.867 回答
6

由于这个问题的答案是旧的,并且从那时起事情已经发生了一点变化,所以这里是一个UPDATE

如果您只想检查某个字段是否被禁用,您现在可以执行以下操作:

expect(page).to have_field 'Slide orientation', disabled: true

根据这个 PR: https ://github.com/teamcapybara/capybara/issues/982

于 2018-07-20T13:55:26.057 回答
3

安德烈亚斯和这个答案让我走上了最终解决方案的轨道。可以通过以下方式找到具有特定标签(而不是 HTML id)的禁用字段:

label_field = all("label").detect { |l| (l.text =~ /#{label}/i).present? }
raise Exception.new("Couldn't find field '#{label}'") if label_field.nil?
the_actual_field = first("##{label_field[:for]}")

检查该字段是否被禁用可以用一个语句来完成:

page.should have_css("##{label_field[:for]}[disabled]") 

它仍然感觉像是一种解决方法,而不是最好的类似 Capybara 的解决方案,但它确实有效!

于 2013-03-14T15:14:58.907 回答