【问题标题】:How can I alleviate timing/AJAX woes using Capybara/Capybara Webkit/RSpec click_button and page.select?如何使用 Capybara/Capybara Webkit/RSpec click_button 和 page.select 缓解时间/AJAX 问题?
【发布时间】:2011-08-25 16:27:07
【问题描述】:

为了简单起见,我省略了大部分测试,只包含了有问题的代码。它是:

click_button('Search')  
page.select 'Preferred', :from => 'ticket_service_type'  

当我运行它时,我收到以下信息:

Failure/Error: page.select 'Preferred', :from => 'ticket_service_type'
Capybara::ElementNotFound:
  cannot select option, no select box with id, name, or label 'ticket_service_type' found`

此按钮单击事件触发的 AJAX 请求与 select 标签没有任何关系,因此在测试中颠倒顺序会导致测试通过。我知道 Capybara 的默认等待时间是 2 秒,所以我把它改成了 10 秒:

Capybara.default_wait_time = 10

这不会导致测试通过。我怎样才能让这两种方法相互配合,并按照用户操作网页的顺序工作?

(如果我发布了规范中的代码,我敢打赌这会很快解决。)

【问题讨论】:

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


    【解决方案1】:

    来自The Cucumber Book(强调我的):

    幸运的是,Capybara 知道如何以简单的方式处理这种情况。 如果我们添加显式调用 find,为页面上尚不存在的 DOM 元素传递 CSS 选择器,Capybara 将稍等片刻(50 毫秒)并重试,直到该元素出现。如果它在一段时间后没有出现(默认为两秒,虽然这是可配置的),它将引发异常,导致步骤定义失败。

    所以让您的 AJAX 向 DOM 写入一些内容,然后在您的步骤定义中找到()它。这并不理想。在我的例子中,我引入了一个(隐藏的)DOM 元素只是为了方便测试,但我还没有找到其他方法。

    【讨论】:

    • 我想也许你没有捡起我扔下的东西。 ;-) 断言与此 AJAX 请求无关。当页面加载时,元素存在并且它存在的断言通过。在规范内启动按钮单击后,找到相同元素的断言将永远不会通过。随后的任何断言也不会。这是我的困境。
    • 是的,我不接。您是说在 click_button('Search') 之前和之后的页面上都存在 #ticket_service_type -- 但是 -- page.select 如果您先 click_button('Search') 则无法找到它?
    • 完全正确,克里斯。老实说,这并不是那么有趣。我可以像人类一样执行操作并查看结果,但是以无头方式测试这个东西不太有效。
    • 我没有遇到你描述的行为。只有两件事浮现在脑海中,1)你在场景中有@javascript标签? 2) 在 click_button('Search') 之后 save_and_open_page 的内容是什么样的?实际上#ticket_service_type 元素是否仍在 DOM 中?
    • 我完全忘记了save_and_open_page!将检查出来。谢谢你的提醒,克里斯。
    【解决方案2】:

    请务必将 :js => true 添加到依赖于 JavaScript 的集成测试中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2012-02-29
      • 2023-03-05
      相关资源
      最近更新 更多