Есть ли способ добавить события таймера в поток управления Protractor для измерения времени выполнения определенных задач?

Вот краткий пример теста, который щелкает поле для ввода некоторого значения:

it('should enter someValue into field', function() {
  var field = $('.someField');

  // Insert timer start function here
  field.click();
  this.switchToActiveElement().sendKeys('someValue');
  this.hitEnter();
  // Insert timer stop function here and output result!

  assert.eventually.equal(field.getText(), 'someValue');
});

Что я хотел бы сделать, так это время, сколько времени потребуется, щелкнуть поле и ввести какое-то значение, а затем каким-то образом вывести время выполнения этого. Первоначально я думал, что могу просто вставить функции console.time() и console.timeEnd(), но, конечно, это не будет работать с потоком управления транспортиром, верно?

Любая помощь в этом будет очень признательна. Спасибо!


person jjelly    schedule 21.06.2016    source источник
comment
можете ли вы определить свою собственную переменную time_begin и переменную time_end и измерить прошедшее время, сравнив их? Например. прочитайте системное время и назначьте его для time_begin перед тем, как вы нажмете, и прочитайте системное время и назначьте его для time_end, вычтите time_begin из time_end.   -  person Yu Zhang    schedule 22.06.2016
comment
Что ж, если вы используете jasmine-spec-reporter, у него есть опция для displayStackDuration -- Однако это фиксирует время каждого блока it, а не отдельных действий, включенных в этот блок. Не уверен, что ты этого хочешь.   -  person Gunderson    schedule 22.06.2016
comment
@YuZhang спасибо за комментарий! Проблема со вставкой переменных time_begin и time_end в закомментированные строки для измерения времени заключается в том, что транспортир на самом деле еще не выполнил никаких операций, поскольку они являются обещаниями, которые добавляются в очередь потока управления. Таким образом, таймер будет запускаться и останавливаться немедленно, что бесполезно.   -  person jjelly    schedule 22.06.2016
comment
@Gunderson, спасибо и за комментарий! Да, на самом деле я использую mocha, который фиксирует время блока it, как вы упомянули, но я не хочу включать утверждение в свое время. Я думал о перемещении утверждения за пределы блока it, чтобы решить эту проблему, но это сделало бы мой код менее красивым :(   -  person jjelly    schedule 22.06.2016


Ответы (1)


Все, что вам нужно сделать, это обратиться к своим переменным в контексте потока управления:

it('should enter someValue into field', function() {
  var field = $('.someField');
  var startTime;

  // Insert timer start function here
  browser.controlFlow().execute(function() {
      startTime = new Date().getTime();
  });

  field.click();
  this.switchToActiveElement().sendKeys('someValue');
  this.hitEnter();

  // Insert timer stop function here and output result!
  browser.controlFlow().execute(function() {
      var endTime = new Date().getTime();
      var elapsedTime = endTime - startTime;
      console.log('elapsedTime = ' + elapsedTime + 'ms');
  });

  assert.eventually.equal(field.getText(), 'someValue');
});

Время, которое вы записываете, может быть не слишком точным, потому что транспортир имеет встроенный waitForAngular() прямо перед выполнением щелчка и не ждет, пока что-то произойдет сразу после нажатия клавиши ввода. Вы можете добавить свой собственный browser.waitForAngular() перед записью endTime, если вы заинтересованы в том, чтобы зафиксировать, сколько времени потребовалось для установки страницы.

person martin770    schedule 23.06.2016
comment
Спасибо @martin770! Это помогает с тем, что мне нужно! - person jjelly; 24.06.2016