Javascript更改事件不在黄瓜测试中触发

时间:2012-08-07 02:31:52

标签: javascript ruby-on-rails-3 selenium cucumber

我有两个文本字段,日期和时间都有一个类'date-time-field'和一个隐藏字段datetime。无论何时更改日期或时间,我都会尝试使用javascript将两者结合起来,并将其存储在datetime隐藏字段中。这是javascript(从coffeescript转换而来):

$('.date-time-field').change(function() {
  var date, time;
  date = $('#date').val();
  time = $('#time').val();
  return $('#start_time').val(date + " " + time);
});

我的黄瓜测试具有@javascript标记,因此它将在Firefox窗口中运行。只要我将焦点放在测试打开的Firefox窗口上,它就会通过,但是如果我将焦点移动到另一个窗口,我打开它会因为更改事件不会触发而失败。我担心如果用户做了一些奇怪的事情,这将在生产中重现。

步骤定义填写表格:

When /^I create a valid event$/ do
  fill_in :name, :with => "Blackbeard's modest event for modest folk"
  select Tier.first.number.to_s, :from => 'event_tier_id'
  select Venue.first.name, :from => 'event_venue_id'
  fill_in 'date', :with => "05/03/2012"
  fill_in 'time', :with => " 08:45"
  click_button 'Save'      
end

我是否应该使用其他事件,例如模糊,可能除了更改,或者它对于生产来说不是问题,我应该在我的测试中调用wait_for?

2 个答案:

答案 0 :(得分:4)

根据this discussion,当textarea失去焦点时,水豚的fill_in实际上不会触发change事件。另一方面,jQuery推迟了textarea 上的change事件,直到元素失去焦点(参见documentation)。

所以我猜测当你将焦点移动到另一个窗口时,fill_in不会触发change事件,因为焦点丢失了change之后永远不会触发事件。

然而,当焦点丢失时,在窗口仍处于焦点时单击保存按钮,并且(我猜)此成功触发更改,设置隐藏的datetime字段。

这只是一个基于一些信息的推测。在解决方案方面,上面的github讨论中发布了一些想法,我建议看一下。

希望有所帮助!

答案 1 :(得分:0)

以下是:selenium触发blur/change而不需要jquery或javascript执行的解决方法:

field.send_keys :tab