2017-09-25 2 views
0

J'écris des tests fonctionnels pour l'application web sur Intern. J'ai un fichier dans lequel je décris toutes les actions sur le test, et il y a aussi un test où ces actions sont appeléesLa fonction setFindTimeout ne fonctionne pas pour moi

par exemple:

il y a un fichier Action.ts

dans il fonctionne dans le test qui sont appelés successivement

//1 
//open the registration window 
openRegistration(): Command<void> { 
    return Action.openRegistration(this.parent); 
} 

static openRegistration(command: Command<any>): Command<void> { 
    return command 
     // click on the authorization menu 
     .setPageLoadTimeout (10000) 
     .get(intern.args.url) 
     .end() 
} 

//2 
inputTextByCssSelector(selector: string, value: string): Command <void> { 
    return Input.inputTextByCssSelector(this.parent, selector, value); 
} 

static inputTextByCssSelector(
    command: Command<any>, 
    selector: string, 
    value: string 
): Command<void> { 
    return command 
     .setFindTimeout(10000) 
     .findByCssSelector(selector) 
     .click() 
     .type(value) 
     .end() 
     .end() 
} 

comme celui-ci

.then(() => action.openRegistration()) 
.then(() => input.inputTextByCssSelector(
    "input [name = userName]", 
    intern.args.username 
)) 
.then(() => input.inputTextByCssSelector(
    "input [name = password]", 
    intern.args.password 
)) 

Mais quand j'exécute le test, il tombe.

Si je mets un délai explicite à la fin de openRegistration par exemple comme celui-ci

openRegistration(): Command<void> { 
    return Action.openRegistration(this.parent); 
} 

static openRegistration(command: Command<any>): Command<void> { 
    return command 
     .setPageLoadTimeout(10000) 
     .get(intern.args.url) 
     .sleep(7000) 
     .end() 
} 

alors tout fonctionne

Pourquoi ne fonctionne pas setFindTimeout(10000) dans inputTextByCssSelector, mais avec sleep(7000) dans openRegistration fonctionne

Répondre

0

Que voulez-vous dire par "ça tombe"? Le test génère-t-il une erreur de dépassement de délai?

Un problème potentiel est la visibilité des composants. Y a-t-il un certain délai entre le moment où la page est chargée et les éléments avec lesquels vous essayez d'interagir devient visible (comme une animation de fondu en JS)? Les commandes findBy renvoient le premier élément trouvé, mais cet élément peut ne pas être visible. Si ce n'est pas visible, Intern ne peut pas interagir avec elle, et une commande comme type échouera. Pour attendre que l'élément soit visible, utilisez findDisplayedByCssSelector.

Notez que l'espacement est important dans les sélecteurs CSS. Le sélecteur "input [name = userName]" est actuellement à la recherche d'un élément avec l'attribut name=userName contenu dans un élément input. En supposant que l'intention réelle est de sélectionner une entrée avec un attribut de nom particulier, elle doit être au format 'input[name="userName"]'. Notez également que les commandes end() ne sont nécessaires qu'après les commandes find et qu'elles ne sont généralement pas nécessaires à la fin des chaînes de commande dans les commandes auxiliaires (les choses ont commencé à this.parent). Donc, par exemple, il n'y a pas besoin de end après le get dans openRegistration, et au plus un end serait nécessaire dans inputTextByCssSelector (pour la commande findByCssSelector).

0

J'ai essayé quelque chose de similaire à cela (n'utilisant tout simplement pas de TypeScript) quand j'ai commencé à apprendre comment utiliser intern et à rencontrer des problèmes similaires à ce que vous avez.

Le problème pour moi était que la chaîne Promise n'était pas maintenue correctement lorsque le test était exécuté. Vous devriez essayer d'apporter une modification subtile à votre code comme suit afin d'augmenter la cohérence de la chaîne Promise.

Il suffit donc par exemple, votre script de test est comme ça avant de commencer:

return this.remote 
    .then(() => action.openRegistration()) 
    .then(() => input.inputTextByCssSelector("input[name = userName]", intern.args.username)) 
    .then(() => input.inputTextByCssSelector("input[name = password]", intern.args.password)) 

La première chose que vous devez faire est de retirer les fonctions de direction. J'ai eu plusieurs problèmes lors de l'utilisation des fonctions de la flèche, à savoir le this.remote leadfoot/Session n'a pas été transmis de manière cohérente entre les méthodes quand je l'ai fait.

Ainsi, votre première instruction .then() appelle une méthode appelée openRegistration(), n'est-ce pas? Modifier votre méthode, au lieu, renvoyer un function qui exécute les étapes que vous recherchez:

static openRegistration(): Command<void> { 
    return function() { 
     return this.parent 
      .setPageLoadTimeout (10000) 
      .get(intern.args.url) 
      .end() 
    }; 
} 

Alors maintenant, votre script de test ressemblera à quelque chose comme ceci (et en supposant que vous répéter ce modèle pour toutes les méthodes que vous appelez) :

return this.remote 
    .then(action.openRegistration()) 
    .then(input.inputTextByCssSelector("input[name = userName]", intern.args.username)) 
    .then(input.inputTextByCssSelector("input[name = password]", intern.args.password)) 

Cela devrait résoudre votre problème.