2016-12-09 1 views
1

Disons que j'ai la structure DOM suivanteComment puis-je casser une boucle d'éléments en interne

<table id="campaigns"> 
    <tr> 
     <th>Name</th> 
     <th>Status</th> 
    </tr> 
    <tr> 
     <td>first data</td> 
    </tr> 
    <tr data-id="1"> 
     <td>intern test at Fri, 09 Dec 2016 03:12:26 GMT</td> 
    </tr> 
    <tr data-id="2"> 
     <td>intern test at Fri, 09 Dec 2016 03:12:26 GMT</td> 
    </tr> 
    <tr data-id="3"> 
     <td>intern test at Fri, 09 Dec 2016 03:12:26 GMT edit</td> 
    </tr> 
    <tr data-id="4"> 
     <td>another data</td> 
    </tr> 
    <tr data-id="5"> 
     <td>next data</td> 
    </tr> 
</table> 

et voilà comment je le fais dans stagiaire

this.remote 
    .findAllByXpath("//*[@id='campaigns']/tr"") // get allitem from list 
     .then(function (options) { 
      return Promise.all(options.map(function (option) { 
       return option.getVisibleText() 
        .then(function (text) { 
         if (text.includes("intern test")) { // checked whether the value is exist 
          option.click(); // click the value 
         } 
         return text; 
        }) 
      })) 
     }) 

mon exigence est que de cliquer sur un le texte qui contient "test interne". Ce code semble correct, mais ce qui se passe est que lorsque le stagiaire clique déjà sur le premier élément de l'instruction if, l'élément suivant semble également effectuer le clic et l'affichage de l'élément. Comment arrêter cette boucle et continuer quand elle a trouvé le 1er élément?

Merci pour toute aide fournissent

+0

Je ne suis pas sûr que je comprends votre question. Pouvez-vous le reformuler? Y a-t-il plusieurs éléments à cliquer ou à multiplier? 'Promise.all' attendra que toutes les promesses soient résolues, le laissant ainsi fonctionner. Si vous voulez seulement attendre que * one * soit résolu, jetez un oeil à 'Promise.race()'. –

+0

merci pour la réponse. Je veux seulement cliquer sur le 1er élément satisfaire l'instruction if, pas le 1er élément trouvé. Promise.race ne satisfera pas l'instruction if car elle prendra le 1er élément –

Répondre

0

Il n'y a pas besoin de passer par tous les éléments pour trouver le premier élément contenant du texte « test interne »

Essayez le XPath suivant à l'aide findAllByXpath (je ne suis pas au courant Javascript - sélénium, donc, s'il vous plaît corriger la syntaxe si nécessaire):

//table[@id='campaigns']/tbody/tr/td[contains(text(),'intern test')]/.. 

retourne tous les éléments tr avec du texte contenant intern test l'intérieur de la table avec ID campaigns.

Utilisez l'indexation, comme 0, 1, 2 pour correspondre first, second and third éléments contenant intern test

+0

merci pour la réponse. Mais mon exigence est de cliquer sur l'élément ** tr **, pas ** l'élément ** td **, le ** xpath ** que vous avez suggéré n'aidera pas avec cette exigence –

+0

a édité ma réponse. S'il vous plaît essayez-le. juste ajouté "/ .." pour obtenir le parent, c'est-à-dire "tr" –

+1

Thanks.this m'aider. besoin de brosser mes compétences sur xpath –