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

Chain operations after several elements have been retrieved

为了进行测试,我们必须使用 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'),
  ]))

元素与命令共享许多相同的方法,但它们具有不同的 API。一个主要的区别是 Command 方法表示动作 return 命令(一个命令类似于承诺,并在动作完成时解析),但是表示动作的元素方法不 return 元素(一个元素不是承诺-像)。这意味着您不能直接链接许多 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'),
            // ...
        ]);
    })