- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
自升级到 Capybara 2.4 后,我一直遇到这个问题。以前,这个 block 工作正常:
page.document.synchronize do
page.should have_no_css('#ajax_indicator', :visible => true)
end
意思是强制等到ajax指示符消失了再进行下一步。
由于上面的代码返回了一个 RSpec::Expectations::ExpectationNotMetError
,所以同步不会重新运行该 block ,而只是抛出错误。不确定为什么这在我之前使用的版本中有效(我相信 2.1)。
synchronize
block 仅重新运行返回如下内容的 block :
Capybara::ElementNotFound
Capybara::ExpectationNotMet
以及某个驱动程序添加到该列表中的任何内容。
查看 Justin 的回复以获得更全面的解释和不使用 synchronize
的示例,或者查看我的回复以获取直接解决方案。
跟进:此后我重新审视了这个问题,所以这里有一些提示:
1) document.synchronize 通常没有任何用处,正如其他人所提到的,大多数发现者都有内置等待。您可以在有意义时使用 wait: 0
手动强制它不等待。
请注意,因此,以下内容并不等效:
!assert_css('#ajax_indicator')
assert_no_css('#ajax_indicator')
前者会等到元素存在,而后者会等到元素不存在,即使它们在其他方面逻辑上是等价的。
2) 导致我们最初插入同步的问题是由于某种先有鸡还是先有蛋的问题。
#ajax_indicator
在这种情况下会在有事件加载时出现,然后消失。我们无法区分指标还没有出现,出现了又消失了。
虽然我还没有 100% 解决这个问题,但提高我们测试可靠性的是寻找指标以确保页面加载已达到某个点,例如
do_thing_that_triggers_ajax
find('#thing-that-should-exist')
assert_no_selector('#ajax_indicator', visible: true)
这不同于断言 #ajax_indicator 存在然后断言它不存在,因为在那种情况下,如果 ajax 发生得太快, capybara 可能无法捕捉到它。
根据您的脚本,您可能会找到更可靠的指标。
最佳答案
have_no_css
匹配器已经在等待元素消失。问题似乎是在 synchronize
block 中使用它。 synchronize
方法仅针对某些异常重新运行,不包括 RSpec::Expectations::ExpectationNotMetError
。
删除 synchronize
似乎做了你想做的事——即强制等待直到元素消失。换句话说,只需执行以下操作:
page.should have_no_css('#ajax_indicator', :visible => true)
工作示例
这是一个页面,比如“wait.htm”,我认为它重现了您的问题。它有一个链接,单击该链接会等待 6 秒,然后隐藏指示器元素。
<html>
<head>
<title>wait test</title>
<script type="text/javascript" charset="utf-8">
function setTimeoutDisplay(id, display, timeout) {
setTimeout(function() {
document.getElementById(id).style.display = display;
}, timeout);
}
</script>
</head>
<body>
<div id="ajax_indicator" style="display:block;">indicator</div>
<a id="hide_foo" href="#" onclick="setTimeoutDisplay('ajax_indicator', 'none', 6000);">hide indicator</a>
</body>
</html>
以下规范表明,通过使用 page.should have_no_css
而无需手动调用 synchronize
,Capybara 已经强制等待。当只等待 2 秒时,规范失败,因为元素没有消失。等待 10 秒时,规范通过,因为元素有时间消失。
require 'capybara/rspec'
Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = 'file:///C:/test/wait.htm'
RSpec.configure do |config|
config.expect_with :rspec do |c|
c.syntax = [:should, :expect]
end
end
RSpec.describe "#have_no_css", :js => true, :type => :feature do
it 'raise exception when element does not disappear in time' do
Capybara.default_wait_time = 2
visit('')
click_link('hide indicator')
page.should have_no_css('#ajax_indicator', :visible => true)
end
it 'passes when element disappears in time' do
Capybara.default_wait_time = 10
visit('')
click_link('hide indicator')
page.should have_no_css('#ajax_indicator', :visible => true)
end
end
关于ruby - capybara 与 has_no_css 同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254584/
我有一个文件字段,其中包含 opacity: 0并且正在重叠一个假按钮。它是一种常见的 css 技术,可以伪造一种在不同浏览器中一致显示的“上传按钮”。 Capybara 不允许我打电话 attach
我正在尝试为我的 ROR 应用程序编写一些 capybara cucumber 脚本,但发现很难通过每次都进行更改并运行完整功能来使脚本正确。 是否有适用于 Capybara 的 REPL(Read
像这样的html 我的代码是 attach_file("ok","./fileset/publisher/upload_pic.jpg") 但我失败了: 失败: Capybara::Element
我想在我的代码中设置不同的 Capybara 等待时间,具体取决于它们通常需要多长时间才能完全加载?我是否必须重复更改 Capybara.default_wait_time 还是有更好的方法? 最佳答
在 Capybara 中,是否可以在新窗口而不是当前窗口中打开链接? 最佳答案 如果此元素是链接,您只需获取其 href 并在新窗口中打开它: url = find('.some_link')[:hr
对于编辑记录的集成测试,我尝试用新文本替换表单输入字段中的现有文本: find("input[@id='course_title']").set("a safer workplace") 但是,每次我
我有一个动态生成的表单,如下所示: Do you like Pizza? [ ] Yes [ ] No HTML 看起来像这样: Do you like Pizza?
我正在尝试填写两个标有 id="admin_passsword"的文本框。我可以轻松访问第一个文本框,但由于除了占位符和上面的标签之外没有任何区别,我不知道如何访问第二个文本框来填写该字段。
我是一个新手,尝试使用 Capybara 测试我的 Rails 项目,但是当我尝试从我的 div 中检测一些字符串时,我对 page 和 page.body 的含义感到困惑:(in :js=>true
我在使用 rspec、capybara、capybara-webkit 和 timecop 的某些集成规范中看到错误。 Capybara::FrozenInTime: time appears
我使用以下 html 堆栈创建了自定义上传表单: 文件字段通过 display: none 的 css 隐藏属性(property)。因此,当她单击标签(自定义样式)时,用户会调用文件
假设我在 Mac OS X 上安装了 PhantomJS,我可以编写一个普通的旧 Ruby 脚本(没有 Cucumber,没有 RSpec)来驱动 Poltergeist 吗?换句话说,我想要一些 g
我希望单击我的测试应用程序上出现的弹出消息(如果存在)。我对 capybara 很陌生,似乎找不到办法做到这一点。我以前有过使用 watir 的经验,如果我使用 watir 的话,会是这样的: if
我目前使用 Watir-webdriver 进行所有前端测试,但开发团队使用 Capybara 在 Jenkins CI 上运行测试。我们都使用相同的 Cucumber 功能。 值得我们进行两次有效的
Capybara的API似乎不支持配置HTTP代理。有没有什么方法可以和它一起使用? 上下文:我使用 capybara 和 cucumber 来测试 Rails 应用程序,并使用 akephalos
我很好奇是否有更好的方法来测试页面中是否存在完整的 URL(包括协议(protocol))。 使用 Capybara 2.10.2 和 Rails 5.0.0.1,我有以下设置: rails_help
我有以下测试: it 'shows the current quantity of items inside cart' do item = create(:item) visit
我正在使用 Capybara 自动截取一些屏幕截图。 我需要 chrome 浏览器最大化运行,但我似乎无法让它工作。 基于 https://sites.google.com/a/chromium.or
下面是两个单选按钮的 html 代码,它们只是“值”属性不同 我想做的是选择“value =2”的单选按钮 我尝试使用“选择(“AmountOption”)”选择第一个单选按钮,但我想选择第二个单
我尝试使用几种变体来检查 Capybara 的 200 Ok HTTP 响应,但没有一个变体不起作用: response.should be_success page.status.should be
我是一名优秀的程序员,十分优秀!