Capybara 无法找到带有文本的隐藏元素

322*_*896 5 rspec ruby-on-rails capybara capybara-webkit

在我的应用程序中,我有一个页面会弹出一个模式,该页面将更新其中的一些内容并在不确定的时间后自行关闭(并变得不可见)。在我的规范中,我试图等到模式解除。我的策略是让 Capybara 等待模态上的内容变得不可见

expect(page).to have_css('.hidden-element', visible: :hidden, text: 'Hidden Content')
Run Code Online (Sandbox Code Playgroud)

但是,看起来 Capybara 将无法获取隐藏元素的文本,并且我收到错误消息:

expected to find css ".hidden-element" with text "Hidden Content" but there were no matches. Also found "", which matched the selector but not all filters.
Run Code Online (Sandbox Code Playgroud)

如果我做:allor false,它会通过,但这不是我想要的:

expected to find css ".hidden-element" with text "Hidden Content" but there were no matches. Also found "", which matched the selector but not all filters.
Run Code Online (Sandbox Code Playgroud)

鉴于我无法更改我的应用程序,我想知道为什么这不起作用,或者在这种情况下实现这一目标的最佳方法是什么。谢谢!

我正在使用 RSpec、Capybara、Capybara-webkit。

Tho*_*ole 7

如果元素实际上在页面上变得不可见,而不是从页面中完全删除,则主要区别在于,当可见时,文本与应用了 CSS(文本转换等)的可见文本相匹配。因此,如果 HTML 中的元素文本实际上是“隐藏内容”,但text-transform: capitalize在可见时已应用于它,则在检查不可见元素时需要针对 HTML 表单进行测试

expect(page).to have_css('.hidden-element', visible: :hidden, text: 'hidden content')
Run Code Online (Sandbox Code Playgroud)

另一方面,如果 HTML 中的文本与您显示的一样,并且该元素实际上已从页面中删除(而不仅仅是隐藏),您可以执行以下操作

expect(page).not_to have_css('.hidden-element', visible: :hidden, text: 'Hidden Content')
Run Code Online (Sandbox Code Playgroud)

等待它被删除。

更新:使用visible: :hidden文本无法匹配的选项时,Capybara < 2.11.0 存在限制。您可以通过执行类似的操作来解决它

element = page.find('.hidden-element', visible: :all, text: 'hidden content')
expect(element).to match_css('.hidden-element', visible: :hidden)
Run Code Online (Sandbox Code Playgroud)