如何找到与 Capybara 的特定文本不匹配的元素?

How to find an element that doesn't match a specific text with Capybara?

我习惯用 Capybara 搜索 first('div', text: 'asdf'),但是有没有办法搜索没有文本的元素?

我试过 first('div', text: /^(?!asdf)/),它仍然匹配 div 和 'asdf' 文本。

我检查以确保我的正则表达式是正确的:https://rubular.com/r/CN6MYKJNahiohD

有什么想法吗?

不确定 Capybara,只是猜测您可能正在尝试设计一个表达式来排除 asdf 字符串中的单词边界,可能接近于:

^(?!.*\basdf\b).*$

表达式在 regex101.com, if you wish to explore/simplify/modify it, and in this link 的右上面板进行了解释,如果您愿意,您可以观察它如何与一些示例输入匹配。

测试

re = /^(?!.*\basdf\b).*$/s
str = 'some content before, then asdf as a word, some after
some content before, then noasdf as a word, some after'

str.scan(re) do |match|
    puts match.to_s
end

我目前的解决方法:

selected_element = 
   (all('div').select do |d|
      d.has_no_text?('asdf', wait: false)
   end).first

如果找到 none,它将 return nil

不知道返回的实际元素的文本内容是什么,很难说出了什么问题,但负正则表达式会变得复杂(尤其是当元素有多行内容时)所以可以很安全地假设问题出在你的正则表达式。在这种情况下,有时使用过滤器块会更容易

first('div') do |element|
  !element.text.include?('asdf')
end

注意:Capybara 无法对此进行优化,因此效率可能不高,但对于偶尔使用并不总是很重要。