2017-06-26 4 views
0

Der Code unten funktioniert, außer dass ich nicht nur die Ergebnisse ausdrucken möchten, wenn gelöst, möchte ich in der Lage sein, sie im JSON-Format zu strukturieren. Ich denke, dafür muss ich warten, bis alle Versprechen gelöst sind, aber ich weiß nicht wie!Selenium webdriver - lösen mehrere Versprechen

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

Also, ich bekomme eine Liste. Dann würde ich gerne mehrere Elemente in jedem Element der Liste finden. Aber ich kann nicht warten, bis alle Versprechen gelöst sind, um mein endgültiges JSON-Array zu erstellen.

+1

für alle Versprechen zu warten .... verwenden ... 'Promise.all' –

+0

@JaromandaX, danke, aber es immer noch nicht dem Zufall .. Ich bin nicht sicher, wie zu handhaben' Promise.all' in einer Schleife –

+0

oder vielleicht wegen der dynamischen Umordnung der Elemente: 'UnhandledPromiseRejectionWarning: Unbehandelte Versprechensverweigerung (Ablehnungs-ID: 1): StaleElementReferenceError: Veraltete Elementverweis: Element ist nicht an das Seitendokument angehängt' –

Antwort

0

Promise.all löst ein Array auf, so dass Sie Elemente in ein Array schieben und dann an die Promise.all-Funktion übergeben müssen. Etwas wie:

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 
} 

nicht sicher, ob dieser Code ausgeführt wird, aber es ist ein Beispiel, wenn Sie in der Dokumentation suchen Promises dann das Argument, das zu Promise.all geben hat iterable sein.

hoffe, das hilft