【问题标题】:How do you add a promise to the flow control queue using protractor?如何使用量角器向流控制队列添加承诺?
【发布时间】:2014-08-25 05:08:22
【问题描述】:

在我的测试中,在使用量角器运行一些 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 () {
    ...
  });

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

【问题讨论】:

    标签: angularjs promise protractor flow-control


    【解决方案1】:

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

    前者可以实现如下:

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

    您可以在blog post 中看到后者的示例。

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

    【讨论】:

    • 我使用了这种方法,但我使用了 protractor 现在支持的 browser.controlFlow().await(...) 简写,效果很好!
    【解决方案2】:

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

    browser.controlFlow().execute(function() {
        // various statements
    });
    

    【讨论】:

    • 很好的答案,但您应该明确表示,可以从这些“各种语句”中创建并返回一个承诺,这些“各种陈述”将被正确插入控制流中
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      您可以做的另一件事就是简单地依赖之前的操作。因此,例如,如果您只是单击一个按钮,它将看起来像这样

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多