如何从element.all每个元素中返回元素

时间:2019-06-21 20:18:02

标签: javascript protractor

我正在尝试从元素列表中返回一个元素,然后执行其他一些操作,例如单击,拖放等。我尝试了以下代码,但遇到错误,提示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();

4 个答案:

答案 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:我正在使用移动浏览器键入此答案,因此缩进可能看起来不正确。