16

在我的测试中,在使用量角器运行一些 ui 测试之前,我正在调用外部库以将数据播种到我们的后端。

'use strict'

var dataBuilder = require('data_builder.js');

describe('test', function () {
  var testData = {
    name: 'foo',
    title: 'bar',
    ...
  };

  beforeEach(function () {
    //create test data on the backend
    dataBuilder.create(testData).then(function (id) {
      testData.id = id.id;
    });
  });



  it('test something', function () {
    ...
  });

因此, dataBuilder 返回的承诺在 it() 实际完成之前没有得到解决。如何将 dataBuilder 返回的 promise 添加到 webDriver 的流控制中?

4

4 回答 4

15

Protractor 在 protractor 对象上公开 WebDriverJS 承诺,因此您可以使用该flow.await方法或创建新的承诺并使用flow.execute.

前者可以实现如下:

flow = protractor.promise.controlFlow()

flow.await(dataBuilder.create(testData)).then( function(id) {
    testData.id = id.id;
})

您可以在这篇博文中看到后者的示例。

这可以在it函数本身中完成,或者如果这对所有测试都是通用的,请考虑将其放在onPrepare量角器配置的函数中。

于 2014-07-04T00:15:24.000 回答
12

在我的量角器测试中,我使用以下模式将一些内容添加到 webDriver 的流控制中。如果从这些“各种语句”中创建并返回一个 Promise,则该 Promise 将正确地插入到控制流中。

browser.controlFlow().execute(function() {
    // various statements
});
于 2014-07-04T20:20:38.817 回答
2

在这种特定情况下,您可以像这样使用done回调beforeEach

beforeEach(function (done) {
   dataBuilder
      .create(testData)
      .then(function (id) {
         testData.id = id.id;
      })
      .finally(done);
});

接受done回调参数表示设置是异步的。

于 2016-04-28T09:35:18.357 回答
1

我从不记得语法,所以我使用一种hack更容易记住的类型,因为它依赖于 promise 的行为方式(所以基本上你可以在每个基于 promise 的系统中使用它)

browser.sleep(1).then(()=> {
  return someAsyncPromiseAction();
})

你可以做的另一件事就是简单地依赖它之前的动作。因此,例如,如果您只是单击一个按钮,它将如下所示

$(' ... ').click().then( () => { return someAsync(); })

虽然这不会向流控制添加承诺,但您仍然会得到相同的结果。

于 2017-03-14T23:01:49.563 回答