将一系列承诺从Selenium的findElements转换为一个对象数组

时间:2016-07-01 13:35:33

标签: node.js selenium q

我正在使用带有node.js的Selenium我正在尝试执行以下操作

var driver   = *webdriver instance*;
var my_xpath = *an xpath string*;
var ele;

Q.all(driver.findElements(webdriver.By.xpath(my_xpath))).then(function(elements) {
    for (ele in elements) {
        console.log(ele.getText());
    };
}

我的印象是Q.all会将driver.findElements返回的承诺数组转换为值数组,这样当我输出ele.getText()时,它就是一个值。但是在这种情况下,ele仍然是一个承诺。

我在这里缺少什么?

请注意,我意识到对于上面的示例,这是不必要的,我可以简单地使用ele.getText().then,但我的实际程序需要在继续之前获取所有值。

1 个答案:

答案 0 :(得分:0)

由于all返回单个承诺,因此无需将承诺与findElements聚合在一起。您还需要使用for循环而不是for-in循环迭代已解析的数组:

driver.findElements(webdriver.By.xpath(my_xpath)).then(function(elements) {
    for (var i = 0; i < elements.length; i++) {
        elements[i].getText().then(function(text) {
            console.log(text);
        })
    };
});

您还可以使用map直接获取包含每个元素的文本的数组:

var map = webdriver.promise.map;

var elements = driver.findElements(By.xpath(my_xpath));

map(elements, e => e.getText()).then(function(texts) {
  console.log(texts);
});