2015-07-06 11 views
5

Migrazione da Casper.js a selenio per avere più strumenti.Il web driver selenio esegue iterazione e naviga su più collegamenti in node.js

Tentativo di iterare attraverso più collegamenti e spostarli utilizzando node.js e selenium-webdriver.

Impossibile trovare documentazione o esempi e continuo a ricevere un errore indipendentemente dal ciclo che cerco di eseguire.

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

Ogni ciclo tento di usare per scorrere i link ottengo un errore:

TypeError: undefined is not a function

Cosa c'è di sbagliato con i miei cicli?

Eventuali riferimenti validi su esempi/documentazione REAL USAGE sulla guida di selenio-webdriver con nodo?

Dopo aver cercato in lungo e in largo tutto ciò che sembra essere semi-documentato sono esempi java/python.

risposta

5

Direi che this documentation è abbastanza buono.

Il problema con il codice è, quando si guarda la documentazione, findElements restituisce un array di WebElement, e che non ha alcuna get metodo, una cosa che ho imparato è che se avete intenzione di giocare con selenium in javascript, hai bisogno di capire il concetto di Promise correttamente (e assicurati di non fare alcun modello anti-promessa), semplicemente mettilo, la maggior parte dei casi parli al driver (chiama qualche metodo in esso), in cambio ricevi una promessa ha il valore che desideri e non il valore reale stesso.

La funzione di retriving href basato su selettore css:

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

Esempio per la funzione precedente:

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; 
} 
Problemi correlati