2013-08-23 19 views
16

Próbuję uzyskać wartość opcji wybranego elementu za pomocą kątomierza. Jednak nie mogę znaleźć elementu opcji.Jak uzyskać wartość opcji wybranego elementu

HTML

<select ng-options="opions.c as options.n for option in options" ng-model="model"> 
    <option value="0">Option 1</option> 
    <option value="1">Option 2</option> 
</select> 

Spec-file

describe('testing select option', function() { 
    it('', function() { 
     ptor = protractor.getInstance(); 

     //This will not get the option required 
     ptor.findElement(protractor.By.binding('model')); 
    }); 
}); 

I nie wydają się znaleźć sposób, aby pobrać wartość opcji jak nie znalazłem funkcji, które można używać to nie daje i wyjątek lub komunikat o błędzie.

Czy ktoś wie, jak rozwiązać ten problem?

+0

Nikt w tym wątku nie odpowiedział na pytanie zadane przez op - nawet op w ich odpowiedzi! * Wszystkie * odpowiedzi zostały zatwierdzone. – 7stud

+0

@ 7stud Jeśli spojrzysz na odpowiedź zamieszczoną przez siebie, będziesz wiedział, co chce wiedzieć, w rzeczywistości różni się od pytania, które opublikował. Pyta, jak uzyskać wybraną wartość z rozwijanego menu, podczas gdy jego odpowiedź brzmi: jak wybrać jedną z opcji z menu rozwijanego, klikając na nią. Nie ma pojęcia o tym, czego chce. – zsong

+0

Myślę, że stwierdzenie, że nie wiedziałem, czego chcę, w ogóle nie jest pomocne. Jeśli nie możesz zaoferować żadnej konstruktywnej odpowiedzi na ten wątek, nie odpowiadaj ani nie komentuj. To nie pomaga społeczności krytykować jej członków. Nie udało mi się podać wartości opcji wyboru w odpowiedzi, ale kod pokazuje, co było zamierzone. –

Odpowiedz

4

OK znowu, udało mi się dowiedzieć, jak pobrać element opcji z kątomierzem.

przykładowy kod poniżej pokazuje, jak to zrobić.

ptor.findElement(protractor.By.css('select option:nth-child(value of the option you require IE: the number)')).click(); 
33

miałem pewne problemy z listy rozwijanej działa dobrze, i spędził trochę czasu dzisiaj pracuje ją (a więc dzielę go tutaj w przypadku gdy ktoś inny znajdzie to przydatne).

We wcześniejszych wersjach Kątomierza użyto by.selectedOption, co faktycznie działa tak samo jak by.select, ale zwraca tylko wybraną pozycję. Tak więc, aby uzyskać tekst o wybranej opcji powyżej, można mieć:

expect(element(by.selectedOption('model')).getText()).toEqual('Option 1'); 

pisałem na blogu, jeśli chcesz więcej szczegółów, obejmuje on również funkcję pomocniczą dla wybierając opcję z menu rozwijanego: http://technpol.wordpress.com/2013/12/01/protractor-and-dropdowns-validation/

Najnowsze wersje kątomierz usunięciu tej funkcji, zastępując ją:

expect(element(by.id('my_id')).element(by.css('option:checked')).getText(); 

który jest bardziej elastyczny, ponieważ może on być stosowany do każdego z dystansu, natomiast selectedOption pracował tylko z modelem znalazcy.

+0

dzięki za podzielenie się z nami swoimi informacjami o badaniach! – Voles

+0

Ale jak uzyskać wartość właściwości "value"? Próbowałem getCssValue ("value"), ale to nie działało dla mnie. – Machtyn

+0

Dzięki. Co otworzyło mi oczy, był selektor 'option: checked'. Poprzednio wypróbowałem opcję 'selected: selected' bez rezultatu, mimo że zwróciło prawidłowe elementy w mojej konsoli Chrome. –

0

Spróbuj użyć xPath:

ptor.findElement(protractor.By.xpath('//select/option[1]'));

można użyć tej samej techniki, aby wybrać opcję, wartość:

protractor.By.xpath('//select/option[text()="Option 2"]'));

Mam potrzebne do zrobienia tego dla utworzenia form gdzie dane wejściowe są widoczne na podstawie wybranych list rozwijanych, np .:

makeFord = protractor.By.xpath('//select[@id="make"]/option[text()="Ford"]')); 
modelMustang = protractor.By.xpath('//select[@id="model"]/option[text()="Mustang"]')); 
makeFord.click(); 
modelMustang.click(); 
+3

Problem z używaniem xpath polega na tym, że ścieżki mogą się zmieniać wraz z rozwojem, co sprawia, że ​​testy są kruche i podatne na awarie. używanie css również może mieć ten sam wpływ. Używanie znaczników id jest najlepszym rozwiązaniem, o ile zespół frontendu zrozumie, że zmiany w tych nie są wymagane, ponieważ niektórzy deweloperzy z przodu nie lubią tagów id lub jak zaleca PaulL poniżej. –

-1

Aby wyliczyć znaczniki opcji, można spróbować użyć metody .all i należy uzyskać do niej dostęp najpierw przez rodzica.

element(by.model('model')).all(by.tagName('option')).then(function(arr) { 
     expect(arr.length).toEqual(2); 
}); 

Zapraszamy do obejrzenia odniesienia API dla inspiracji

http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.all

Edycja: również przestrzegać instrukcji stylu co zniechęca do używania XPath http://www.protractortest.org/#/style-guide

0

Oto w jaki sposób można uzyskać wartość opcji w wyborze:

HTML

<select ng-options="opions.c as options.n for option in options" ng-model="model"> 
    <option value="Africa">Option 1</option> 
    <option value="Switzerland">Option 2</option> 
</select> 

.spec plik

describe("Country <select>", function() { 

    it("should have 'Africa' as the value of the first option", function() { 

    browser.get('index.html'); 

    let all_options = element.all(
     by.options("opions.c as options.n for option in options") //use whatever string is assigned to the ng-options attribute in the html 
    ); 

    let first_option = all_options.get(0); //or all_options.first() 
    let second_option = all_options.get(1); //or all_options.last() 

    expect(
     first_option.getAttribute('value') 
    ).toEqual("Africa");       

    }); 

}); 

Aby uzyskać wartość z wybranej opcji (co może być rozwiązaniem programowo wybierane kątomierz wywołując click() na opcjach):

expect(
     element( 
     by.model('model') //'model' is the string assigned to the select's ng-model attribute         
    ).element(     
      by.css('option:checked') 
     ).getAttribute('value') 
    ).toEqual('Swizerland'); 
Powiązane problemy