2013-08-23 2 views
16

J'essaie d'obtenir la valeur d'option d'un élément sélectionné en utilisant Protractor. Cependant, je ne suis pas en mesure de trouver l'élément d'option.Comment obtenir la valeur d'option de l'élément select

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 fichier

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

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

Je ne peux pas sembler trouver un moyen de saisir la valeur de l'option que je ne l'ai pas trouvé une fonction que je peux utiliser cela ne donne pas et exception ou message d'erreur.

Est-ce que quelqu'un sait comment résoudre ce problème?

+0

Personne dans ce fil n'a répondu à la question posée par l'op - pas même l'op dans leur réponse! * Toutes * réponses downvoted. – 7stud

+0

@ 7stud Si vous regardez la réponse affichée par lui-même, vous saurez ce qu'il veut savoir est effectivement différente de la question qu'il a posté. Il demande comment obtenir la valeur sélectionnée à partir de la liste déroulante tandis que sa réponse est en fait comment sélectionner l'une des options de la liste déroulante en cliquant dessus. Il n'a aucune idée de ce qu'il veut. – zsong

+0

Je pense que dire que je ne savais pas ce que je voulais n'est pas utile du tout. Si vous n'êtes pas en mesure d'offrir une réponse constructive à ce sujet, veuillez ne pas répondre ou commenter. Cela n'aide pas la communauté à critiquer seulement ses membres. J'ai omis d'indiquer la valeur de l'option de sélection dans la réponse, mais le code montre ce qui était prévu. –

Répondre

4

ok encore J'ai maintenant été capable de comprendre comment saisir l'élément d'option avec rapporteur.

L'exemple de code ci-dessous montre comment accomplir ceci.

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

J'ai eu quelques problèmes pour obtenir des listes déroulantes fonctionnent bien, et ont passé un certain temps aujourd'hui son élaboration (et donc je partage ici au cas où quelqu'un d'autre trouve utile). Sur les versions antérieures de Protractor, il y avait un by.selectedOption, qui fait exactement la même chose que by.select, mais ne renvoie que l'élément sélectionné. Donc, pour obtenir le texte de l'option choisie ci-dessus, vous pourriez avoir:

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

J'ai écrit un billet de blog si vous voulez plus de détails, il couvre également une fonction d'aide pour sélectionner l'option dans le menu déroulant: http://technpol.wordpress.com/2013/12/01/protractor-and-dropdowns-validation/

les versions récentes de protractor ont supprimé cette fonction, le remplacer par:

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

ce qui est plus souple, car il peut être appliqué à l'un des moteurs de recherche, alors que selectedOption ne fonctionnait avec un viseur de modèle.

+0

merci de partager vos informations de recherche avec nous! – Voles

+0

Mais comment obtenez-vous la valeur de la propriété 'value'? J'ai essayé getCssValue ('value') mais cela n'a pas fonctionné pour moi. – Machtyn

+0

Merci. Ce qui m'a ouvert les yeux, c'était le sélecteur 'option: checked'. J'avais déjà essayé l'option ': selected' en vain, même si elle renvoyait les éléments appropriés dans ma console Chrome. –

0

Essayez d'utiliser XPath:

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

Vous pouvez utiliser la même technique pour choisir une option en valeur:

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

J'ai besoin de le faire pour la mise en place des formulaires où les entrées sont visibles en fonction des listes déroulantes sélectionnées, par exemple:

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

le problème avec l'utilisation de xpath est que les chemins peuvent changer au fur et à mesure du développement, ce qui rend les tests fragiles et susceptibles d'échouer. l'utilisation de CSS peut également avoir le même effet. L'utilisation de tags d'identification est la meilleure solution à condition que l'équipe frontale comprenne que des modifications ne sont pas nécessaires car certains développeurs frontaux n'aiment pas les tags d'identification ou comme le recommande PaulL ci-dessous. –

-1

Afin d'énumérer les balises d'option, vous pouvez essayer d'utiliser la méthode .all et vous devriez y accéder d'abord par le parent.

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

Jetez un oeil à la référence API d'inspiration

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

Edit: suivez aussi le guide de style qui décourage l'utilisation de XPath http://www.protractortest.org/#/style-guide

0

Voici comment vous pouvez obtenir la valeur d'une option dans un select:

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> 

fichier .spec

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

    }); 

}); 

Pour obtenir la valeur d'une option sélectionnée (qui peut être une option programme sélectionnée avec protractor en appelant un clic() en option):

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'); 
Questions connexes