2014-04-06 12 views
5

Chcę kliknąć element po jego tekście, a nie według jego wartości z listy rozwijanej.AngularJS + kątomierz Jak wybrać opcję rozwijaną na podstawie jej tekstu nie wartości

znalazłem ten wielki post: https://coderwall.com/p/tjx5zg ale to nie działa zgodnie z oczekiwaniami, szukaj dalej zawsze po meczu został znaleziony i nie jest kliknięcie na element,

jeśli ktoś ma lepszy przykład (a pracuje jeden) lub możesz naprawić ten kod i sprawić, że zadziała,

będę apperciate.

Jest to kod Dan Haller od słupka używany (Wszelkie prawa zastrzeżone dla niego)

function selectOption(selector, item){ 
    var selectList, desiredOption; 

    selectList = this.findElement(selector); 
    selectList.click(); 

    selectList.findElements(protractor.By.tagName('option')) 
     .then(function findMatchingOption(options){ 
      options.some(function(option){ 
       option.getText().then(function doesOptionMatch(text){ 
        if (item === text){ 
         desiredOption = option; 
         return true; 
        } 
       }); 
      }); 
     }) 
     .then(function clickOption(){ 
      if (desiredOption){ 
       desiredOption.click(); 
      } 
     }); 
    } 

Jest to select function element, który można używać tak:

var browser = protractor.getInstance(); 
browser.selectOption = selectOption.bind(browser); 
browser.selectOption(protractor.By.id('my-dropdown'), 'My Value'); 
+0

Próbowałem też „protractor.By.xpath ('wybierz opcję [text() = "Opcja 2"]')) ; " i to nie zadziałało –

+0

Generalnie używam 'sendKeys()', nie jestem pewien, czy jest to pożądane, czy nie. Na przykład, jeśli mam listę rozwijaną z listą nazw miast, użyłbym 'elem.sendKeys (desiredCityName)' i automatycznie wybierze odpowiednią opcję. – Aaron

Odpowiedz

12

Ta funkcja wybiera trzecią opcję w polu wyboru.

function selectDropdownByNumber(element, index, milliseconds) { 
    element.findElements(by.tagName('option')) 
     .then(function(options) { 
     options[index].click(); 
     }); 
    if (typeof milliseconds !== 'undefined') { 
     browser.sleep(milliseconds); 
    } 
} 
var mySelect = $('#my-dropdown'); 
selectDropdownByNumber(mySelect, 2); 

Więcej informacji można znaleźć tutaj - http://qainsight.blogspot.fr/2014/04/select-dropdown-value-in-protractor-js.html

+0

świetne rozwiązanie !! dzięki!! –

+2

Może to mieć związek z wersją Kątomierza, ale dla mnie metoda "findElements" nie działa. Istnieje jednak metoda zwana "wszystkim", która wykonuje zadanie. – LeFex

20

To pytanie jest podobne do: How to select option in drop down protractorjs e2e tests

Dopóki jesteś na najnowszej wersji kątomierz, można po prostu zrobić:

element(by.cssContainingText('option', 'BeaverBox Testing')).click(); 

Jeśli chcesz kliknąć numer, możesz zrobić:

var selectDropdownbyNum = function (element, optionNum) { 
    if (optionNum){ 
    var options = element.findElements(by.tagName('option')) 
     .then(function(options){ 
     options[optionNum].click(); 
     }); 
    } 
}; 
+3

Próbowałem w ten sposób. Ale mówi, że nie może znaleźć elementu. Niewidoczny – Russj

+1

"cssContainingText" działa dla mnie. to jest poprawna odpowiedź. zobacz także http://stackoverflow.com/a/24259419/1068746 –

+0

mimo że mogę zweryfikować, że mogę uzyskać element rozwijany i nadal otrzymuję [obiekt Object] nie ma metody "findElements" Myślę, że to dlatego, że robię bezpośredni połączyć się z chromem, a nie z samodzielnym serwerem selenowym – btm1

4

Jak chcesz wybrać opcję według wartości, można użyć:

var select = element.one(by.model('selectData')); 
select.$('[label="Option 1"]').click(); 
Powiązane problemy