一尘不染

从Promise块返回函数中的值

selenium

我正在尝试编写一个函数(使用WebdriverJS
lib),该函数遍历元素列表,检查名称并构建与该名称相对应的xpath定位器。我在这里简化了xpath定位器,所以不用注意。

我在这里面临的问题是:1)调用此函数返回未定义。据我了解,这是因为return语句不在其位置,而是:2)将其放置在同步代码通常可以正常工作的正确位置,不适用于异步承诺,因此调用此函数将返回相同的未定义,但是因为return语句在“
driver.findElement”语句之前触发。

如果由于调用此函数而要获取createdTask变量,应如何在此处使用return语句?

var findCreatedTask = function() {

    var createdTask;
    driver.findElements(By.xpath("//div[@id='Tasks_Tab']")).then(function(tasks) {

        for (var index = 1; index <= tasks.length; index++) {
            driver.findElement(By.xpath("//div[@id='Tasks_Tab'][" + index + "]//div[@class='task-title']")).getText().then(function(taskTitle) {
                if (taskTitle == "testName") {
                    createdTask = "//div[@id='Tasks_Tab'][" + index + "]";
                    return createdTask;
                }
            });
        }
    });
};

阅读 271

收藏
2020-06-26

共1个答案

一尘不染

您可以先获取所有文本,promise.map然后再获取位置indexOf

var map = webdriver.promise.map;

var findCreatedTask = function() {
    var elems = driver.findElements(By.xpath("//div[@id='Tasks_Tab']//div[@class='task-title']"));
    return map(elems, elem => elem.getText()).then(titles => {
      var position = titles.indexOf("testName") + 1;
      return "//div[@id='Tasks_Tab'][" + position + "]";
    });
}
2020-06-26