2016-07-22 16 views
5

Mam sytuację, w której używam kątomierza do kliknięcia losowego łącza na stronie. (Tam jest dużo). Mam wiele linków, których nie chcę klikać, więc chcę wiedzieć, kiedy mój losowy link znajduje się w tej tablicy i wygenerować nowy losowy link.Generowanie nowej wartości losowej, jeśli wartość jest w tablicy

Oto mój kod roboczych kliknąć losowy link na stronie

var noClickArray = ['link2', 'link3']; // array much bigger than this 
var parent = this; 

function() { 
    var links = element.all(by.css('.links')); 
    return links.count().then(function(count) { 
    var randomLink = links.get(Math.floor(Math.random() * count)); 
    randomLink.getText().then(function(text) { 
     parent.selectedLink = text; // used in a different function 
     var containsLink = _.includes(noClickArray, text); 
    }); 
    return randomLink.click(); 
    }); 
} 

używam lodash znaleźć jeśli tekst randomLink jest w noClickArray ale nie wiem, jak zachować generowania wartości losowych aż wartość nie istnieje w tablicy. Jak mogę to zrobić?

+1

nie byłoby lepiej mieć oddzielny przełącznik wyboru na linki? na przykład '.clickableLinks', w ten sposób nie trzeba dokonywać iteracji lub filtrowania całej listy, aby sprawdzić, czy jest poprawna. – DBS

+0

Lub użyj obiektu, w którym link jest kluczem, aby zobaczyć, czy link/klucz znajduje się w obiekcie. – IMTheNachoMan

Odpowiedz

5

Myślę, że nadmiernie komplikujesz problem. Chciałbym tylko odfiltrować linki nie chcesz, aby kliknąć użyciu filter() wcześniej:

function() { 
    var links = element.all(by.css('.links')); 
    links = links.filter(function (link) { 
     return link.getText().then(function(text) { 
      return !_.includes(noClickArray, text); 
     }); 
    }); 

    return links.count().then(function(count) { 
    var randomLink = links.get(Math.floor(Math.random() * count)); 
    return randomLink.click(); 
    }); 
} 
+0

Zazwyczaj robię rzeczy bardziej skomplikowane :) to wygląda na naprawdę czyste rozwiązanie. dzięki! – cocoa

3

Można po prostu użyć wywołanie rekurencyjne, aż pojawi się non czarnej liście odnośnik. W ten sposób będzie można uniknąć kosztów uzyskania tekst dla wszystkich linków:

function() { 
    return element.all(by.css('.links')).then(function clickRandom(links) { 

    // remove a random link from the array of links 
    var link = links.splice(Math.floor(Math.random() * links.length), 1)[0]; 

    return link && link.getText().then(function(text) { 
     if(noClickArray.indexOf(text) === -1) { // if not black listed 
     return link.click(); // click link 
     } 
     return clickRandom(links); // try again 
    }); 

    }); 
}