检索到多个元素后的链操作

时间:2016-04-03 01:27:00

标签: node.js intern leadfoot

对于测试,我们必须使用intern / leadfoot填充复杂的页面。页面的每个部分都由一个单独的函数处理,该函数接收必要的元素和输入数据。

现在我们遇到了一个问题,即子函数中对这些元素的操作不再被链接,因为它们是元素而不是命令。

是否有可能再次将这些行动联系起来?我尝试使用setContext()或使用自定义命令创建新命令但到目前为止没有成功。

let inputs;
return this.remote
  .get('some/url')
  .findAllByTagName('input') // Finds two input elements
  .then(inputElements=> inputs = inputElements)
  .then(()=> Promise.all([
      inputs[0].clearValue(), // I would like to be able to write: inputs[0].clearValue().type('a')
      inputs[1].clearValue(),
  ]))
  .then(()=> Promise.all([
      inputs[0].type('a'),
      inputs[1].type('b'),
  ]))

1 个答案:

答案 0 :(得分:1)

元素与命令共享许多相同的方法,但它们具有不同的API。主要区别在于表示操作的Command方法返回Commands(Command类似于Prom,并在操作完成时解析),但表示操作的Element方法不返回Elements(Element不是类似Prom的)。这意味着您无法直接链接许多Element方法。

对于问题中描述的情况,您可以执行以下操作:

function clearAndType(input, value) {
    return remote.then(function (_, setContext) {
            // setContext is always the last argument to a Command then()
            // callback; the value returned by the previous Command is the
            // first argument, which is ignored here
            setContext(input);
        })
        .clearValue()
        .type(value);
}

var remote = this.remote;

return this.remote
    .get('some/url')
    .findAllByTagName('input')
    .then(function (inputs) {
        return Promise.all([
            clearAndType(inputs[0], 'a'),
            clearAndType(inputs[1], 'b'),
            // ...
        ]);
    })