Ruby on rails 如何使用Capybara/Capybara Webkit/RSpec单击按钮和page.select来缓解计时/AJAX难题?

Ruby on rails 如何使用Capybara/Capybara Webkit/RSpec单击按钮和page.select来缓解计时/AJAX难题?,ruby-on-rails,capybara,rspec-rails,Ruby On Rails,Capybara,Rspec Rails,为了简单起见,我省略了大部分测试,只包含了有问题的代码。它是: click_button('Search') page.select 'Preferred', :from => 'ticket_service_type' 运行此操作时,我收到以下信息: Failure/Error: page.select 'Preferred', :from => 'ticket_service_type' Capybara::ElementNotFound: cannot selec

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

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标记无关,因此颠倒测试顺序会导致测试通过。我知道水豚的默认等待时间是2秒,所以我用以下方法将其更改为10秒:

Capybara.default_wait_time = 10
这不会导致测试通过。我如何才能让这两种方法彼此配合,并按照用户操作网页的顺序工作

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

我的:

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


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

请确保添加:js=>true到依赖JavaScript的集成测试。

我想也许你没有领会我所说的。

我想断言与此AJAX请求无关。当页面加载时,元素存在,并且它存在的断言通过。在规范内部启动按钮单击后,发现相同元素的断言将永远不会通过。随后的任何断言也不会出现。这就是我的困境。是的,我不会接受的。你是说,在点击“搜索”按钮之前和之后,票证服务类型都存在于页面上。如果你先点击“搜索”按钮,则select无法找到它?没错,克里斯。老实说,这真的没那么有趣。我可以像人一样执行这些动作并看到结果,但是以无头的方式测试这件事并不是很有效。我还没有接触到你描述的行为。我只想到两件事,一是场景中有@javascript标记?点击“搜索”按钮后,保存和打开页面的内容是什么样的?事实上,ticket\u service\u type元素仍然在DOM中吗?我完全忘记了save\u和open\u页面!我来看看。谢谢你的提醒,克里斯。