【问题标题】:Capybara: Verify that ajax-loaded content is not presentCapybara:验证是否不存在 ajax 加载的内容
【发布时间】:2014-02-13 16:04:26
【问题描述】:
visit "/whatever"
expect(page).to have_no_content "This is loaded in asynchronously"

这应该失败,但通过了。为什么?当页面第一次加载时,内容不存在,Capybara 合理地不会等待它。

既然 Capybara 2.0 宣布了wait_until 坏消息,那么等待这个内容的幸运方式是什么?

【问题讨论】:

    标签: selenium rspec capybara selenium-webdriver


    【解决方案1】:
    visit "/whatever"
    wait_for_ajax do
      expect(page).to have_no_content "This is loaded in asynchronously"
    end
    

    然后,在spec_helper

    def wait_for_ajax
      sleep(Capybara.default_wait_time)
      yield
    end
    

    请注意,每次运行此规范时,都会等待 Capybara 的 default_wait_time 结束。但我不确定你会如何检查类似的东西。如果您的 ajax 执行速度很快,您可以通过将 default_wait_time 设置为 1 秒来弥补这一点。

    【讨论】:

    • 这个页面解释了为什么 wait_until 被贬值:elabs.se/blog/53-why-wait_until-was-removed-from-capybara 所以说 page.should not_have 方法现在将有效地使用 capybara 等待时间。 chadoh 的第一个例子是我对处理 ajax 加载的投票,第二个 - 我的规则是永远不要使用 sleep 方法。这是一种让您的测试变慢的可靠方法。
    • 如果当前存在您断言不应该存在的内容,或者如果存在您断言不应该存在的内容,页面将等待。但是,如果您断言内容不存在,并且它不存在,它就会停止在那里等待。它不会等待检查内容是否最终没有通过 ajax 加载。但在这种情况下,我需要它。
    • 啊我现在明白了你想要达到的目标。试试这个链接natontesting.com/2012/02/27/…。根据您的水豚版本,您可能需要删除 wait_until。这样你的步骤就可以等待 ajax 完成然后断言。
    • @Dono 谢谢!这正是我所需要的。我使用最新的解决方案添加了一个单独的答案,因此未来的访问者无需通过 cmets 和过时的博客帖子进行搜索。
    • 别担心,伙计。不久前,我与 ajax 进行了大规模的战斗。这几乎救了我:)
    【解决方案2】:
    visit "/whatever"
    wait_for_ajax do
      expect(page).to have_no_content "This is loaded in asynchronously"
    end
    

    然后,在spec_helper

    def wait_for_ajax
      page.evaluate_script("jQuery.active") == 0
      yield
    end
    

    这将评估脚本直到它为真,然后运行您的断言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多