2013-08-05 13 views
5

Chciałbym policzyć liczbę, powiedzmy, elementów div z "ładną" klasą. Mam selektor div.nice, ale nie wiem, której klasy/metody caspers użyć.phantomjs/casperjs count Elementy DOM

Istnieje metoda tester.assertElementCount, ale czy jest coś, co po prostu zwraca liczbę elementów?

+0

Myślę, że trzeba stworzyć do tego swoją własną funkcję. Wygląda na to, że najprostszym sposobem jest sprawdzenie, czy element istnieje i użycie css ": nth-of-type (i)". Poniżej zamieszczam odpowiedź na to pytanie. –

Odpowiedz

4

Jeśli można użyć jQuery jej dość prosta:

var count = $('div.classname').length; 

Znalazłeś SO Post który wydaje się wyjaśnić za pomocą jQuery z casperjs mam żadnego doświadczenia z casperjs więc nie mogę wiele pomóc tam.

+0

'FAIL ReferenceError: Nie można znaleźć zmiennej: $'. jak mogę "zainstalować" jquery w caspersie? – ducin

+0

@tkoomzaaskz edytował odpowiedź, mam nadzieję, że to pomaga. –

+0

tak, pomogło, dziękuję! – ducin

5

Wystarczy

document.querySelectorAll("div.nice").length 
+0

hmm, więc nie muszę tego robić w funkcji 'Oceń'? – ducin

+0

Nie, jest to "dokument" w kontekście oceny strony. –

+5

Zwraca "0" dla mnie. – StockB

3

Jednym z przykładów CasperJS 1,1-beta3 polega checking the number of Google search results for CasperJS. Odwołuje się do __utils__.findAll(), która jako argument przyjmuje selektor. To pozwala sprawdzić ilość sztuk powrócił pomocą właściwości dostępne length do dowolnego obiektu JS:

test.assertEval(function() { 
    return __utils__.findAll("h3.r").length >= 10; 
}, "google search for \"casperjs\" retrieves 10 or more results"); 

Nigdy nie próbowałem, ale wydaje się, że ta funkcja narzędzie może być używane poza warunkowa, a to pozwoli ci zgłosić liczbę elementów bez użycia jQuery, jak zalecała poprzednia odpowiedź.

+0

Jednak funkcje '__utils__' są wstrzykiwane w zdalnym środowisku DOM_, więc można uzyskać do nich dostęp tylko w funkcji przekazanej jako parametr do' casper.evaluate() 'lub' test.assertEval() '. – lfurini

+1

Tak, to prawda. Chodzi mi o to, że używanie '__utils__' poza warunkowym jest po prostu w porządku (np. Jako ogólny mechanizm logowania/debugowania). Nie chciałem sugerować, że można go używać poza blokami "assess" lub "assertEval". Czy mogę jakoś zaktualizować swoją odpowiedź, aby była jaśniejsza? –

+1

Może mógłbyś dodać mały przykład, taki jak ten: 'var count = this.evaluate (function() {return __utils __. FindAll (" h3.r "). Length;});' – lfurini

0

można również skorzystać assertElementCount dochodzić rachubę elment

test.assertElementCount("div.nice", 1) 
+0

To nie odpowiada na pytanie "jak mogę policzyć te elementy". – lfurini

3

Casper zapewnia getElementsInfo, można użyć długość atrybut aby uzyskać liczbę elementów. np.

casper.getElementsInfo('myElement').length 
+1

powinien być komentarzem –

0

Nie znalazłem powyższych odpowiedzi, aby pomóc mojej sprawie.

Myślę, że celem było policzenie liczby elementów bez konieczności oceny kodu js w kontekście strony, co może być frustrujące w nadgodzinach i mieć sprzeczne zmienne i funkcje.

Zamiast tego, byłoby miło wykorzystać kontekst automatyzacji Caspera. Można to zrobić za pomocą kombinacji ".exists()" i css psuedo wybieraka ": nth-of-type (I)"

Poniższy kod robi to ...

var counter = 1;   //set to one, for css selector setup 

casper.then(function() { //wait your turn 
    //loop through our element 
    while(casper.exists('div span:nth-of-type(' + counter + ')')) { 
     counter++;  //count the results 
    } 
}); 

Możesz uczynić tę funkcję i przekazać wszystkie argumenty lub po prostu skopiować i wkleić ją jako krok.

Najlepsza część, możesz śledzić to z powtórzeniem oświadczenia dla całkiem fajnej pętli.

casper.then(function(){ 
    this.repeat(counter, function() { 
     console.log("Another one - item #" + counter); 
    }); 
});