rspec - 不推荐使用'#text_field'定位textareas。“

时间:2013-10-26 00:09:36

标签: ruby rspec textarea

我有一个测试断言: -

expect(browser.text_fields[2].id).to eq "new_user_email"

它已通过,但我收到此弃用警告消息:

Locating textareas with '#text_field' is deprecated.  
Please, use '#textarea' method instead.

我尝试将测试更改为

expect(browser.textarea[2].id).to eq "new_user_email"

但得到了

undefined method `[]' for #<Watir::TextArea:0x00000001c128d8>

我试过

expect(browser.textareas[2].id).to eq "new_user_email"

并获取

 Failure/Error: expect(browser.textareas[2].id).to eq "new_user_email"

   expected: "new_user_email"
        got: ""

我查看了源代码,但它没有帮助我: -

VALID_TEXT_FIELD_TAGS = %w[input textarea]

def tag_name_matches?(tag_name, _)
  VALID_TEXT_FIELD_TAGS.include?(tag_name)
end

def by_id
  el = super
  el if el and not NON_TEXT_TYPES.include? el.attribute(:type)
end

def validate_element(element)
  if element.tag_name.downcase == 'textarea'
    warn "Locating textareas with '#text_field' is deprecated. Please, use '#textarea' method instead."
  end
  super
end

如何摆脱弃用警告?

1 个答案:

答案 0 :(得分:1)

我猜测你的页面有多个文本字段和多个文本区域。

text_fields的原始代码会抓取文本字段和文本区域,并将它们放入同一个集合中。这有点令人惊讶,可能是为什么watir不赞成这种行为。

使用textarea仅返回单个对象,而不是集合。这就是[]未定义的原因。

使用textareas只返回 文本区域,而不是两者的组合。这个文本区域可能是页面上的第一个文本区域,稍后您还有另一个文本区域没有ID。如果你没有多个,我希望你会得到一个错误,说没有这样的元素。

我强烈建议不要依赖你元素的位置;它往往会使你的测试太脆弱。相反,您应该根据需要使用选择器(CSS或XPath)。例如,您应该可以使用类似

的内容
browser.textarea(id: 'new_user_email')