【问题标题】:Trying to move e2e code into a function with no success试图将 e2e 代码移动到函数中但没有成功
【发布时间】:2018-05-01 15:54:00
【问题描述】:

问题是由于承诺解决,我为所有要搜索的元素传递了一个 xPath 以及要搜索的字符串,我希望返回该元素。这是代码:

export class Library {
  static findListItem(xPath: string, findItem: string): any {
    let z = 0;
    const allItemsXPath = xPath.split('[X]');
    const itemXPath = xPath.split('X');
    console.log(xPath + ' : ' + findItem);
    const itemList = element.all(by.xpath(allItemsXPath[0] + allItemsXPath[1])).map(function (item) {
      return item.getText();
    });
    itemList.then(function (itemText) {
      console.log(itemText.length);
      for (let k = 0; k < itemText.length; k++) {
        itemFound = true;
        console.log(itemText[k] + ' : ' + findItem);
        if (itemText[k] === findItem) {
          z = k + 1;
          console.log('found ' + z);
        }
      }
    }).then(() => {
      console.log(itemXPath[0] + z + itemXPath[1]);
      // element(by.xpath(itemXPath[0] + z + itemXPath[1])).click();
      return element(by.xpath(itemXPath[0] + z + itemXPath[1]));
    });
  };

用于单击的注释行有效。它可以看到元素并单击它。我想将元素返回给调用者然后点击。

如果返回不在 .then 部分中,则返回发生得太快并且 z = 0。按照现在的方式,没有返回任何内容。

【问题讨论】:

    标签: protractor e2e-testing


    【解决方案1】:

    你的函数findListItem没有返回值,在itemList.then之前加return

    static findListItem(xPath: string, findItem: string): any {
       ...
    
       return itemList.then(function (itemText) {
          ...
       });
    }
    
    Library.findListItem(xxx, yyy).then(function(item){
       return item.click();
    })
    

    我对您的以下代码有疑问,要查找匹配的项目,您每次迭代将itemText 的一个字符与整个字符串findItem 进行比较。你确定你能用下面的代码找到匹配的吗?

     for (let k = 0; k < itemText.length; k++) {
        itemFound = true;
        console.log(itemText[k] + ' : ' + findItem);
        if (itemText[k] === findItem) {
          z = k + 1;
          console.log('found ' + z);
        }
      }
    

    【讨论】:

    • 该函数在函数头中使用“any”返回值。 itemlist 发生的事情是它上面定义的行抓取下拉列表中的所有值并使用 .map 将承诺转换为文本数组。您提到的 itemlist.then 使它等待承诺解决,因此没有返回那里。 itemList 是一个字符串数组,所以 itemList[k] 是一个字符串,而不是一个字符。希望这是有道理的
    • 您确实声明了函数的返回值类型,但是您没有为函数提供任何明确的return 语句,请仔细检查。所以当你调用findListItem()时,它会返回undefined
    • 谢谢,帮了大忙。虽然它返回一个承诺,所以在使用 const obj = 调用函数之后,我必须使用 obj.then(function(elem) { elem.click(); });有没有办法在承诺解决后返回 obj?如果没有,这将起作用,再次感谢 Yong!
    • 在您的情况下无法返回不承诺。
    • 我理解并再次感谢您。你已经解决了我的问题。
    猜你喜欢
    • 2019-10-26
    • 2011-08-10
    • 2013-09-28
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多