Protractor: WebElement.clear () ne met pas à jour le modèle

Créé le 26 nov. 2013  ·  26Commentaires  ·  Source: angular/protractor

L'appel de WebElement.clear () sur un élément d'entrée ne semble pas mettre à jour le modèle associé.

Vue:

<input ng-model="foo">
<div>{{foo}}</div>

Spéc.:

it("should update the model", function(){
    var input = element(by.css("input"));
    input.sendKeys("bar");
    input.clear();
    expect(element(by.css("div")).getInnerHtml()).toBe(""); // Fails, because it's still "bar"
});
bug

Commentaire le plus utile

J'ai eu un problème similaire avec une directive que j'utilisais et sendKeys ne mettant pas à jour le modèle. Cette solution a fonctionné pour moi même si je ne suis pas sûr qu'elle fonctionnera pour vous tous:

field.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "a"));
field.sendKeys(protractor.Key.BACK_SPACE);
field.clear();

Tous les 26 commentaires

Bonne prise. FYI dès que vous envoyez d'autres clés, le modèle est mis à jour.

Je ne sais pas quoi faire à propos de celui-ci, tout ce que le pilote fait pour effacer n'envoie aucun déclencheur pour Angular à $ digest. Ne pas le voir comme un énorme problème, alors passez à la publication 1.0.

Salut!

Existe-t-il une solution de contournement qui pourrait être utilisée jusqu'à ce qu'elle soit résolue?

J'ai essayé d'utiliser sendKeys () avec une chaîne vide mais cela n'a pas fonctionné.

Éditer:
Résolu le problème en envoyant une chaîne avec un seul espace blanc. Je suppose que je pourrais travailler parce que Angular ajuste l'entrée.

J'ai exactement le même problème. Par exemple, je teste la validation de mon formulaire de connexion et j'envoie un clear () dans le champ du mot de passe afin de confirmer que le message «Erreur de mot de passe requise» apparaît. J'ai essayé d'appeler clear () suivi de sendKeys ('') avec une chaîne vide mais cela ne déclenche pas la liaison de modèle. Y a-t-il une solution de contournement que j'ai manquée?

J'ai eu un problème similaire avec une directive que j'utilisais et sendKeys ne mettant pas à jour le modèle. Cette solution a fonctionné pour moi même si je ne suis pas sûr qu'elle fonctionnera pour vous tous:

field.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "a"));
field.sendKeys(protractor.Key.BACK_SPACE);
field.clear();

Génie! Cela fonctionne un régal. Je vous remercie!

aucun problème. heureux que cela ait fonctionné pour vous!

@wlingke Je

Heureux d'avoir pu aider :)

Bonjour les gars,

Hm j'ai probablement un problème un peu différent. Lorsque je clique sur le bouton, la fonction exécutée doit effacer l'objet modèle (la fonctionnalité est testée à l'unité pour qu'elle fonctionne).
Lorsque j'utilise le rapporteur, remplissez le formulaire, cliquez sur le bouton, il n'y a aucune raison pour que le modèle ne soit pas mis à jour, mais quand j'affirme les valeurs, ce sont ce que j'ai rempli. Donc, si je fais des tests e2e, il n'est pas vraiment acceptable d'effacer le formulaire avec ces hacks.

S'il y a quelque chose de mal que je fais, veuillez me le dire.
Meilleures salutations,
George

Je ne vois plus ce problème et j'ai poussé un test pour vérifier le comportement correct. Veuillez ouvrir un nouveau problème s'il se produit toujours pour vous!

@wlingke merci,

tu es un génie

@wlingke merci de 2017. J'ai toujours ce problème sur angular 2.

@EugeneSnihovsky Avez-vous des problèmes avec clear dans une application angulaire pure 2? J'ai des problèmes dans une application hybride avec la validation ne se déclenchant pas lors de l'utilisation de clear, mais je ne savais pas si j'avais cassé quelque chose ou s'il était lié à une application hybride.

moi aussi! sur ng2

J'ai toujours ce problème en 2017. Sur une entrée contenant «abc», .clear () suivi de .sendKeys («d») sur le champ d'entrée vide et aboutit à «abcd» dans le modèle angulaire en utilisant des formes réactives.

La solution de @wlingke ne fonctionne que tant que vous n'essayez pas de l'exécuter sur un système d'exploitation où CTRL n'est pas défini sur la touche de modification. Il est probablement plus sûr d'exécuter protractor.Key.BACK_SPACE * length de la valeur d'entrée pour le moment.

@wlingke merci de 2018, lol. J'ai toujours ce problème sur Angular 5 lorsque j'essaye de faire:

field.clear() // works
field.sendKeys() //works
field.clear() // doesn't update my reactive form

Ok, j'ai dû recourir à une solution de contournement plus complexe, mais elle est beaucoup plus fiable. Je n'ai eu aucun faux échec de test avec cela.


export const visibilityOf = (el: any) =>
  browser.wait(ExpectedConditions.visibilityOf(el) as any, 15000, 'Element taking too long to appear in the DOM')
const mapSerial = (fn: Function, list: any[]) => list.map(x => fn(x)).reduce((p, next) => p.then(next), Promise.resolve())

const clearInput = (name: string) => {
  const el = element(by.css('input[name=' + name + ']'))
  return visibilityOf(el)
   .then(() => el.getAttribute('value'))
   .then((text) => {
      const keysArray = text.replace(/ /g, '').split('')
      keysArray.push('')
      return mapSerial((key: string) => setTimeout(() => el.sendKeys(Key.BACK_SPACE), 0), keysArray)
    })
   .then(() => browser.wait(() => el.getAttribute('value').then(text => text.length === 0), 12000))
   .then(() => el)
}

J'ai essayé votre solution @evanjmg et je suis toujours coincé avec l'entrée ciblée. Non effacé, aucun nouveau contenu n'a été ajouté.

Je peux confirmer que c'est toujours un problème avec Angular 7.2.3 et Protractor 5.4.0 sur 73.0.3683.103.

@wlingke merci beaucoup, votre solution a fonctionné pour moi aussi.

Salut @juliemr Je peux confirmer que .clear() ne fonctionne toujours pas correctement . Je teste un formulaire et la seule façon de faire fonctionner le test est de faire ceci:

it('should run validations', async function () {
  await password.sendKeys('a');  
  await password.sendKeys(protractor.Key.BACK_SPACE);  
  await username.click()  // this line triggers a blur event on the password field
  expect(await passwordError.getText()).toMatch('Password is required');
});

clear() fait échouer mon test en mettant à jour le modèle dans le mauvais sens.

J'ai eu un problème similaire avec une directive que j'utilisais et sendKeys ne mettant pas à jour le modèle. Cette solution a fonctionné pour moi même si je ne suis pas sûr qu'elle fonctionnera pour vous tous:

field.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "a"));
field.sendKeys(protractor.Key.BACK_SPACE);
field.clear();

@wlingke Merci beaucoup! 2019 et c'est encore le chemin à parcourir :)

J'ai eu un problème similaire récemment. La solution de contournement consiste à sélectionner tout le texte existant, utilisez le retour arrière pour effacer le texte

Guys .. Si les solutions ci-dessus ne fonctionnent pas pour vous, essayez ci-dessous. Ça marche..
envoyer une chaîne vide avec un seul espace.
field.sendKeys(' ');

Remarqué ce problème lorsque nous avons essayé de tester une validation. Tout fonctionne manuellement, mais l'utilisation de setKeys et clear ne semble pas affecter Angular pour marquer l'entrée comme touchée ou sale.

Je me demande si le composant de validation que nous utilisons est chargé trop lentement et n'est pas réellement chargé au moment où le test a rempli le formulaire, ce n'est que 2 entrées dans mon cas. Je vais lancer un test de retard demain et voir si cela résout le problème.

Cette page vous a été utile?
0 / 5 - 0 notes