我正在尝试从元素列表中返回一个元素,然后执行其他一些操作,例如单击,拖放等。我尝试了以下代码,但遇到错误,提示nodes.click()不是函数
var nodes = vectorpo.yfilesCanvasMain.all(
by.css("g text[fill-opacity='1']")
)
.each(function (eachnode, index) {
eachnode.getText().then(function (text) {
if (text == 'hello world') {
return eachnode;
}
})
});
nodes.click();
答案 0 :(得分:1)
根据您的问题陈述,您有兴趣过滤掉元素数组,并希望对过滤后的元素列表执行某些操作。 正如我所说的问题并正确理解的那样,函数“每个”都不适合此操作,因为“每个”功能旨在迭代ElementArrayFinder对象的每个元素,因此在调用每个elementFinder之后返回并解决Promise。 '函数用于解决不同类型的问题。
那么,解决您提到的问题的正确方法是什么?
ElementArrayFinder类还提供函数“过滤器” 。此功能用于过滤出此元素列表。因此,“过滤器”功能不会返回任何承诺,而是会在应用内部定义的过滤条件后返回ElementArrayFinder的对象。请参阅以下适用于您共享代码的代码段。
vectorpo.yfilesCanvasMain.all(by.css("g text[fill-opacity='1']")).filter(eachNode, index){
return eachNode.getText().then(function(text){
return text === 'hello world';
});
}).first().click();
first()。click()之前的代码将再次返回ElementArrayFinder的对象,该对象满足带有“ hello world”文本的元素的条件。这就是为什么我们使用first()从ElementArrayFinder对象中获取第一个元素的原因。
ElementArrayFinder.each()
仅可以返回null,如果您坚持使用each()
存档目标,则可以执行以下操作:
var found, node;
vectorpo.yfilesCanvasMain.all(
by.css("g text[fill-opacity='1']")
)
.each(function (eachnode, index) {
// if had found the wanted node, end this loop in advance
if (found) return;
eachnode.getText().then(function (text) {
if (text == 'hello world') {
node = eachnode; // assign wanted node to outside variable `node`
found = true; // change flag: found to true
}
})
})
.then(function() {
// the function inside this `then()` will only be executed when above `each()` complete
// if the ouside variable is not null or undefined,
// means find wanted node, then click
if (node) node.click();
});
即使您可以通过each()
归档相同的目标,但它比filter()
还复杂,我建议您使用filter()
答案 1 :(得分:0)
我们可以将每个节点附加到eachnode
数组中,然后返回它,而不是返回ElementFinder[]
。然后,我们需要遍历数组以单击每个数组。
// Make a reusable function
async function reusableFunction() {
var nodes = []; // Change 1: Initialize local array
vectorpo.yfilesCanvasMain
.all(by.css("g text[fill-opacity='1']"))
.each(function(eachnode, index) {
eachnode
.getText()
.then(function(text) {
if (text === 'hello world') {
nodes.push(eachnode); // Change 2: add the node to an array
}
})
});
return nodes; // Change 3: return
}
var nodeArray = await reusableFunction(); // Change 4: function call
// Change 5: since we return an array of nodes,
// we need to loop through the array to click each one
nodeArray.forEach(function(node) {
node.click();
});
答案 2 :(得分:0)
在检查了其他几个选项之后,我尝试了以下方法。我试图找到所选元素的索引值,并希望将该值返回给我的调用函数。但是,当我尝试输出返回的值时,我得到的是空
function getNodeIndex () {
var nodeIndex
var nodes = vectorpo.yfilesCanvasMain.all(by.css("g text[fill-opacity='1']"));
return nodes.each(function (eachNode, index) {
// for (var i = 0; i < noOfNodes.length; i++) { //Somereason if I use for loop the i is always shows as length of the element when I try to print in below if statement
eachNode.getText().then(function (text) {
if (text == 'hello world') {
nodeIndex = index;
console.log("printing index value is " + nodeIndex);
//the nodeIndex is printing correct value
}
})
return nodeIndex;
})
在另一个脚本中,我使用了以下脚本
getNodeIndex().then(function(value){
console.log("printing node index after retrieving in function ", value)
})
此处的值显示为null。请让我知道我在这里想念什么。
您的大多数代码是正确的,但在return
上却是错误的。
进行以下微小更改可以解决您的问题。
return nodes.each(function (eachNode, index) {
eachNode.getText().then(function (text) {
if (text == 'hello world') {
nodeIndex = index;
console.log("printing index value is " + nodeIndex);
}
});
})
.then(function(){
return nodeIndex;
})
答案 3 :(得分:0)
在关闭if语句后写返回nodeIndex
function getNodeIndex(){
var nodeIndex
var nodes = vectorpo.yfilesCanvasMain.all(by.css(“ g text [fill-opacity ='1']”)));
返回节点。each(function(eachNode,index){
// for(var i = 0; i PS:我正在使用移动浏览器键入此答案,因此缩进可能看起来不正确。