2015-07-06 5 views
5

Migration von Casper.js zu Selenium, um mehr Werkzeuge zu haben.Selenium Webdriver iterieren und navigieren über mehrere Links in node.js

Versuch, mehrere Links zu durchlaufen und mit node.js und selen-webdriver zu navigieren.

Kann keine Dokumentation oder Beispiele finden und ich bekomme immer einen Fehler, egal welche Schleife ich versuche auszuführen.

iLinkCount = oLinks.length; 
    console.log(oLinks); 
    console.log(iLinkCount); 

Code above outputs the link count to the console but I am unable to get their href tags to continue on with my testing.

driver.findElements(webdriver.By.css('snip')).then(function(oLinks) { 
// driver.findElements(webdriver.By.xpath("//snip")).then(function(oLinks) { 
    iLinkCount = oLinks.length; 
    console.log(oLinks); 
    console.log(iLinkCount); 

    // for(var oLink in oLinks){ 
    //  var sLink = oLink.getAttribute('href'); 
    //  console.log(sLink); 
    // } 


    for(var i = 0; i < iLinkCount; i++){ 
     var oLink = oLinks.get(i); 
     console.log(oLink); 
     // var sLink = oLinks[ i ].getAttribute('href'); 
     // console.log(sLink); 
    } 
}); 

Jede Schleife ich über die Verbindungen zu verwenden, versuchen zu iterieren bekomme ich einen Fehler:

TypeError: undefined is not a function

Was mit meinem Schleifen falsch?

Haben Sie gute Referenzen zu Beispielen/Dokumentation von REAL USAGE über Selen-Webdriver mit Knoten?

Nach der Suche weit und breit scheint alles, was halb dokumentiert ist, Java/Python-Samples.

Antwort

5

Ich würde sagen, dass this documentation ist ziemlich gut.

Das Problem mit Ihrem Code wird, wenn Sie in der Dokumentation suchen, findElements gibt einen Array von WebElement, und das hat keine get Methode, ist eine Sache, die ich gelernt habe, wenn du mit selenium in Javascript spielen werden, Sie müssen das Konzept von Promise richtig verstehen (und stellen Sie sicher, keine Anti-Versprechen Muster), einfach gesagt, die meisten Fälle, die Sie mit dem Treiber sprechen (rufen Sie eine Methode darin), erhalten Sie ein Versprechen dafür hat den gewünschten Wert und nicht den eigentlichen Wert.

Die Funktion href für retriving basierend auf CSS-Selektor:

function getAllHrefs(driver, cssValue){ 
    var selector; 
    if(!cssValue) selector = By.tagName('a'); 
    else   selector = By.css(cssValue); 
    return driver.findElements(selector).then(function(oLinks){ 
     var allPromises = oLinks.map(function(oLink){ 
      return oLink.getAttribute('href'); 
     }); 
     return Driver.promise.all(allPromises); 
    });  
} 

Beispiel für die obige Funktion:

var dummyPage = 'http://google.com' 
, Driver = require('selenium-webdriver') 
, By = require('selenium-webdriver').By 
, chrome = require('selenium-webdriver/chrome') 
, driver 
; 


driver = getDriverInstance(); 
driver.get(dummyPage); 
getAllHrefs(driver).then(function(hrefs){ 
    console.log('got hrefs: ', hrefs.length, hrefs); 
}); 


function getAllHrefs(driver, cssValue){ 
    var selector; 
    if(!cssValue) selector = By.tagName('a'); 
    else   selector = By.css(cssValue); 
    return driver.findElements(selector).then(function(oLinks){ 
     var allPromises = oLinks.map(function(oLink){ 
      return oLink.getAttribute('href'); 
     }); 
     return Driver.promise.all(allPromises); 
    });  
} 

function getDriverInstance(){ 
    var driverInstance = new Driver.Builder() 
     .usingServer() 
     .withCapabilities({ 
      browserName: 'chrome' 
     }) 
     .setChromeOptions(
      new chrome.Options() 
       .addArguments('--privileged') 
       .addArguments('--no-sandbox') 
     ) 
     .build(); 
    return driverInstance; 
} 
Verwandte Themen