2016-11-01 3 views
2

Je suis surtout familier avec le java sélénium, et je suis nouveau à la fois JS et Protractor. Disons que je suis en train de cliquer sur une option dans une liste d'options avec un identifiant commun ..Sélection par texte avec Protractor

var options = $('.options'); 

Comment pourrais-je obtenir tous les éléments avec cet identifiant commun, puis sélectionnez l'une par son texte? Je ne peux pas faire driver.findElements comme je pouvais en Java car il n'y a pas de référence au pilote ..

C'est ce que je l'ai essayé jusqu'à présent, mais sa ne fonctionne pas et je pense que son manque d'expérience en raison de mon JS

this.selectCompanyCode = function(companyCode) { 
    dropDownMenus[0].click(); 
    var companyCodeOptions = $('[ng-bind-html="companyCode"]'); 
    companyCodeOptions.filter(function (elem) { 
     return elem.getText().then(function text() { 
      return text === companyCode; 
     }); 
    }).first().click(); 
}; 
+0

Avez-vous vu ma réponse? Vous avez modifié votre question après avoir posté ma réponse. J'ai ajouté un '.click()' à ma réponse pour que mon code fasse exactement la même chose que votre code ci-dessus, sauf qu'il n'utilise pas '.each()' pour parcourir tout le tableau car ce n'est pas nécessaire. Sinon, ajoutez un commentaire sur ce qui ne fonctionne pas ... en essayant de vous aider. – Gunderson

+0

@Gunderson, j'ai vu ta réponse. Je ne voulais juste pas presser ce segment de code dans la section des commentaires. J'ai mis à jour mon code sur mon message à ce que je l'ai changé à partir de votre suggestion, mais je reçois maintenant une erreur «impossible de lire la propriété» de l'erreur indéfinie .. Serait-ce comment j'essaie de passer le paramètre companyCode ? – Tree55Topz

+0

Assez sûr que l'erreur a à voir avec 'dropDownMenus [0] .click()'; Habituellement, vous utiliseriez '.get()' pour récupérer un élément par index d'un ElementArrayFinder (voir le lien dans ma réponse ci-dessous). Mais vous n'avez pas non plus de référence à dropDownMenus dans cette fonction. Est-ce une variable globale?Sinon, c'est définitivement indéfini. Vous pouvez également avoir besoin d'une déclaration de retour de companyCodeOptions.filter. Donc 'return companyCodeOptions.filter (...)' – Gunderson

Répondre

3

Sélectionner tous les éléments avec l'identificateur commun: $$('.options'); Permet de sélectionner tous les éléments avec une classe de .options - équivalent de element.all(by.css('.options')). Cela renvoie un ElementArrayFinder. Voir aussi .get() pour savoir comment choisir un élément par index dans ElementArrayFinder.

Trouver par le texte, vous pouvez utiliser cssContainingText(css, text). Par exemple, var loginBtn = element(by.cssContainingText('button.ng-scope', 'Login'));

Mais si pour une raison quelconque les ne fournissent pas les résultats escomptés, vous pouvez utiliser .filter() (docs here) sur un ElementArrayFinder passer par le réseau d'éléments et de trouver un élément basé sur une condition que vous spécifiez. Par exemple,

var allOptions = $$('.options'); 
allOptions.filter(function (elem) { 
    return elem.getText().then(function (text) { 
     return text === 'What you want'; 
    }); 
}).first().click(); 

Et, bien que je ne l'ai jamais utilisé Sélénium régulier Java (donc je ne sais pas si cela est la même chose), mais il est en effet une référence browser (et donc findElements fonction): http://www.protractortest.org/#/api?view=ProtractorBrowser .

J'espère que ça aide!

Edit:

Comment utiliser votre code

this.selectCompanyCode = function(companyCode) { 
    // where is dropDownMenus defined? This has function no reference to it. 
    dropDownMenus.get(0).click(); // should be this 
    var companyCodeOptions = $$('[ng-bind-html="' + companyCode + '"]'); 
    return companyCodeOptions.filter(function (elem) { 
     return elem.getText().then(function text() { 
      return text === companyCode; 
     }); 
    }).first().click(); 
}; 

deuxième édition: En supposant le code de l'entreprise est unique, vous n'avez probablement pas besoin d'utiliser le filtre. Essayez ceci:

this.selectCompanyCode = function(companyCode) { 
    dropDownMenus.get(0).click(); 
    var companyCodeOptions = $('[ng-bind-html="' + companyCode + '"]'); 
    return companyCodeOptions.click(); 
}; 
+0

le dropDownMenus est un localisateur que j'ai identifié, var dropDownMenus = $$ ('. Select2-choice.ui-select-match.ng-scope'); Je vois qu'il me manquait une déclaration de retour, laissez-moi faire un tourbillon. Merci pour l'aide! – Tree55Topz

+0

il est dit companyCodeOptions.filter n'est pas une fonction – Tree55Topz

+0

@ Tree55Topz désolé mon mauvais, n'a pas vu companyCodeOptions a été défini comme un seul élément, je l'ai changé pour utiliser '$$' afin qu'il crée un tableau d'éléments. Voir aussi ma deuxième édition, pas sûr qu'il soit même nécessaire d'utiliser 'filter()' dans ce cas. – Gunderson