检索多个元素后的链式操作
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'),
// ...
]);
})
为了进行测试,我们必须使用 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'),
// ...
]);
})