如何找到与 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 无法对此进行优化,因此效率可能不高,但对于偶尔使用并不总是很重要。
我习惯用 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 无法对此进行优化,因此效率可能不高,但对于偶尔使用并不总是很重要。