Capybara无法找到带有文字

时间:2016-11-14 01:10:26

标签: ruby-on-rails rspec capybara capybara-webkit

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

变得不可见
expect(page).to have_css('.hidden-element', visible: :hidden, text: 'Hidden Content')

然而,看起来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.

如果我:allfalse,它会通过,但那不是我想要的:

expect(page).to have_css('.hidden-element', visible: :all, text: 'Hidden Content')

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

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

1 个答案:

答案 0 :(得分:2)

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

expect(page).to have_css('.hidden-element', visible: :hidden, text: 'hidden content')

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

expect(page).not_to have_css('.hidden-element', visible: :hidden, text: 'Hidden Content')

等待它被删除。

更新:Capybara有一个限制< 2.11.0使用visible: :hidden选项时,文字无法匹配。您可以通过执行类似

的操作来解决此问题
element = page.find('.hidden-element', visible: :all, text: 'hidden content')
expect(element).to match_css('.hidden-element', visible: :hidden)