1
votes

Rapporteur - cliquez dans For Each ne se comportant pas comme prévu

Dans le code du rapporteur suivant

const tabs = await element.all(by.id('tab'));
tabs.forEach(async tab => {
  tab.click().then(function() {
  element.all(by.id('radio1')).click();
});
}); 
 await element(by.id('saveAndContinue')).click();

on clique sur radio1 uniquement dans le dernier onglet car la dernière ligne de saveAndContinue est masquée et donc le clic () échoue

Pendant Le sommeil fonctionne en dehors de la boucle FOR, ce n'est pas le cas lorsque je veux laisser du temps avant le clic radio1

EDIT 1 : le problème est que chaque ligne s'exécute MAIS radio1 clique pour le dernier onglet non onglet précédemment cliqué. Le clic de tabulation est rapide pour que radio1 soit cliqué.


2 commentaires

Je pense que vous constaterez que .forEach () ne fonctionne pas bien avec async / await. Vous voudrez peut-être utiliser une ancienne boucle for régulière. C'est mon expérience de toute façon. Cela pourrait faire partie de votre problème.


j'ai essayé: const tabs = attendre element.all (by.name ("tab")); for (let i = 0; i


4 Réponses :


1
votes

Quelques points à noter, l'attribut "id" doit être unique. Vous ne devriez pas avoir plusieurs éléments avec le même identifiant, cela peut provoquer un comportement farfelu. consultez cette réponse en tant que source L'ID doit être unique dans toute la page?

De plus, element.all () va renvoyer un tableau d'éléments, vous essayez donc de cliquer sur un tableau d'éléments.

voir la documentation pour element.all () sur la documentation du rapporteur https://www.protractortest.org/#/api?view=ElementArrayFinder

En supposant que les éléments sont renvoyés sous forme de tableau, malgré l'utilisation d'identifiants HTML dupliqués, vous devrez les cliquer individuellement comme tel

element.all(by.id('radio1')).then(function (myIds) {
myIds[0].click();
myIds[1].click();
});

Ou bien sûr, faites une boucle à travers eux.

Bonne chance


3 commentaires

merci pour la réponse 1) oui l'ID est unique 2) le problème n'est pas s'il obtient un tableau d'éléments OU un seul, tab.Click () passe simplement au suivant sans cliquer sur aucune radio 1 dans les onglets précédents


Si l'ID = radio1 est unique, tout votre code n'a pas de sens. Cela signifie que sur toute la page, il n'y a qu'un seul élément avec l'id = radio1, alors utilisez simplement element (by.id ('radio1')). Click ()


Je suis désolé pour la réponse au commentaire incorrecte précédente. Il y a plus d'une radio avec id = radio1 dans différentes catégories de liste de radio. plusieurs lignes avec des radios, id = radio1, radio2, etc. J'ai ajouté la question originale ci-dessus avec Modifier 1



2
votes

Comme vous n'avez pas joint de code HTML ni de capture d'écran de votre application, voici ma photo dans le noir ... Essayez ceci et faites-moi savoir si cela fonctionne

let tabs = element.all(by.id('tab'));
let radioButtons = element.all(by.id('radio1'));

let tabCount = await tabs.count();
for (let i = 0; i < tabCount; i++) {
  await tabs.get(i).click();
  let radioCount = await radioButtons.count();
  for (let j = 0; j < radioCount; j++) {
    await radioButtons.get(j).click();
  }
}
await element(by.id('saveAndContinue')).click();


1 commentaires

Merci beaucoup, après des modifications personnalisées de votre code, cela a finalement fonctionné !! sur lequel j'ai ajouté un commentaire séparément



1
votes

1) manqué attendre avant tab.click()

2) element.all (). click () ne devrait pas fonctionner

< pré> XXX


2 commentaires

1) J'ai essayé une variante de code avec AWAIT avant tab.click () mais sans succès 2) element.all (). Click () fonctionne pour le dernier onglet, et quand je dors avant le dernier bouton et passe à un autre onglet précédent , alors tous les radio1 de cet onglet déplacé sont cliqués? 3) variation qui encore ne fonctionne pas: const tabs = wait element.all (by.id ('tab')); tabs.forEach (async tab => {wait tab.click (). then (async function () {//browser.sleep(2000); const radios = wait element.all (by.id ('radio1')); radios.forEach (async rd => {rd.click ();});});});


yong, je l'ai résolu comme indiqué dans: commentez ici



0
votes

Merci à Sergey Pleshakov ci-dessus les travaux suivants (après un petit changement):

async doGateway2bComplexHappyPath() {
let tabs = element.all(by.id('tab'));

let tabCount = await tabs.count();
for (let i = 0; i < tabCount; i++) {
  tabs.get(i).click();
  //browser.sleep(1000);
  element.all(by.id('radio1')).click();
  //browser.sleep(1000);
}

 //await browser.sleep(1000);
 await element(by.id('saveAndProceed')).click();
}


3 commentaires

Attention à cela. Cliquez sur () est une promesse. Le mot clé await doit résoudre cette promesse, si vous ne l'utilisez pas, il peut être exécuté, mais la bonne séquence d'action n'est pas garantie. Si vous commencez à utiliser 'await', continuez à le faire jusqu'à la fin. Un autre problème est element.all ... click () . Pensez-y de cette façon - vous dites qu'il y a plusieurs éléments et que vous exécutez 1 clic ... quel élément l'obtient? Personnellement, je ne connais pas la réponse, mais essayez d'être précis - par exemple element.all (). First (). Click () ou last () ou < code> get (numéro)


Wait échoue pour Cliquez avec l'erreur 'Échec: Élément non interactif' supprimant la passe d'attente cependant Warn est === >> UnhandledPromiseRejectionWarning: ElementNotVisibleError: élément non interactif
(node: 33548) UnhandledPromiseRejectionWarning: Rejet de promesse non gérée. Cette erreur est née soit en jetant à l'intérieur d'une fonction async sans bloc catch, soit en rejetant une promesse qui n'a pas été gérée avec .catch (). (ID de rejet: 1) (nœud: 33548) [DEP0018] DeprecationWarning: les rejets de promesse non gérés sont obsolètes.


J'ai également résolu mes erreurs de console à l'aide de: stackoverflow.com/a/48899752/3627914