2016-07-01 7 views
2

Я использую Selenium с Node.js я пытаюсь сделать следующийПреобразования массива обещаний findElements селена в массив объектов

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, но моя фактическая программа требует наличия всех значений перед продолжением.

+0

Ok, поэтому я понимаю, почему это происходит сейчас, но не знаю, как это исправить. 'ele.getText()' возвращает обещание, хотя 'ele' является' WebElement'. Тем не менее, мне по-прежнему нужен массив всех фактических результатов, а не просто обещаний. – rwolst

ответ

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); 
});