2015-07-06 11 views
5

Migracja z Casper.js do Selenium, aby mieć więcej narzędzi.Selenium webdriver iteruje i przegląda wiele łączy w pliku node.js

Próba iteracji za pośrednictwem wielu łączy i nawigowania po nich za pomocą node.js i selenu-webdriver.

Nie mogę znaleźć żadnej dokumentacji ani przykładów i ciągle pojawia się błąd, bez względu na to, którą pętlę próbuję uruchomić.

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

Każda pętla próbuję użyć do iteracyjne nad linków pojawia się błąd:

TypeError: undefined is not a function

Co jest nie tak z moim pętli?

Wszelkie dobre referencje dotyczące przykładów/PRAWDZIWEGO użycia dokumentacji na temat kierowania selen-webdriver z węzłem?

Po wyszukaniu daleko i szeroko wszystkim, co wydaje się być częściowo udokumentowane, są próbki java/python.

Odpowiedz

5

Powiedziałbym, że this documentation jest całkiem niezły.

Problem z kodem jest, jeśli spojrzeć na dokumentacji, findElements zwraca tablicę WebElement i że nie ma get metody, jedna rzecz ja nauczyłem się, jeśli masz zamiar grać z selenium w javascript musisz poprawnie rozumieć pojęcie Promise (i upewnij się, że nie rób żadnego anty-obietnicy), po prostu powiedz, większość przypadków, w których rozmawiasz ze sterownikiem (wywołaj w nim jakąś metodę), otrzymasz w zamian obietnicę, że ma pożądaną wartość, a nie samą faktyczną wartość.

Funkcja pobierające href oparciu o selektor 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); 
    });  
} 

przykład do powyższej funkcji:

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; 
} 
Powiązane problemy