2017-06-26 73 views
0

下面的代碼工作,除了我不想打印出解決的結果,我想能夠以JSON格式構造它們。 我認爲這一點,我需要等待所有的承諾得到解決,但我不知道如何!硒webdriver - 解決多個承諾

var webdriver = require('selenium-webdriver'), 
    By = webdriver.By, 
    until = webdriver.until; 

    var driver = new webdriver.Builder() 
     .forBrowser('chrome') 
     .build(); 

    driver.get('www.example.com'); 
    driver.sleep(2000); 

    driver.findElements(By.css('.listing')).then(function(resWraps){ 
     for (var i=0; i<resWraps.length; i++) { 
      resWraps[i].findElement(By.css('.title a')).getAttribute("innerHTML").then(function(title){ 
       console.log(title); 
      }); 
      resWraps[i].findElement(By.css('.price')).getAttribute("innerHTML").then(function(price){ 
       console.log(price); 
      });  
     } 
    }); 

因此,我列出了一個列表。然後我想在列表中的每個元素內找到多個元素。但我不知道如何等待所有的承諾才能解決,以使我最終的JSON數組。

+1

等待所有承諾....使用...'Promise.all' –

+0

@JaromandaX,感謝,但它仍然失敗隨機..我不知道如何處理' Promise.all'在循環內 –

+0

或者可能是因爲項目的動態重新排序:'UnhandledPromiseRejectionWarning:未處理的承諾拒絕(拒絕ID:1):StaleElementReferenceError:陳舊的元素引用:元素未附加到頁面文檔' –

回答

0

Promise.all解析數組,因此您需要將元素推送到數組,然後將其傳遞給Promise.all函數。喜歡的東西:

const promiseArray = [] 
for (var i=0; i<resWraps.length; i++) { 
    promiseArray.push(resWraps[i].findElement(By.css('.title a')).getAttribute("innerHTML")); 
} 

return Promise.all(promiseArray) 
    .then(resolvedList){ 
// do something with resolvedList 
} 

不知道這個代碼將運行,但它是一個例子,如果你看一下Promises的文檔,然後將其傳遞給Promise.all的參數必須是迭代。

希望這有助於