92 votes

Toutes les suggestions pour les tests de code d’extjs dans un navigateur, de préférence avec sélénium ?

Nous avons utilisé sélénium avec beaucoup de succès à gérer le haut niveau site essais (en plus des vastes python doctests à un niveau de module). Mais maintenant, nous utilisons extjs pour beaucoup de pages et ses révèle difficile d’incorporer le sélénium ne testerait les composants complexes tels que grilles.

Quelqu'un avait succès en écrivant des tests automatisés pour les pages web d’extjs ? Beaucoup de recherche sur Google trouve des gens avec des problèmes similaires, mais peu de réponses. Merci !

173voto

Ates Goral Points 47670

L'obstacle le plus important dans les tests de ExtJS avec le Sélénium est que ExtJS ne rend pas des éléments HTML standard et Selenium IDE naïvement (et à juste titre) de générer des commandes ciblées sur les éléments qui agissent simplement comme décoration -- les éléments superflus qui aident ExtJS avec l'ensemble du bureau-look-and-feel. Voici quelques conseils et astuces que j'ai recueillies lors de l'écriture automatisée de Sélénium dans une application ExtJS.

Conseils Généraux

Localisation Des Éléments

Lors de la génération de Sélénium cas de test par l'enregistrement des actions de l'utilisateur avec Selenium IDE sur Firefox, le Sélénium permettra de les actions enregistrées sur les id des éléments HTML. Cependant, pour la plupart des éléments cliquables, ExtJS utilise id générés comme "ext-gen-345", qui sont susceptibles de changer lors d'une visite ultérieure à la même page, même si aucun code n'des modifications ont été apportées. Après l'enregistrement des actions de l'utilisateur pour un test, il doit y avoir un manuel effort pour passer à travers toutes ces actions qui dépendent id générés et de les remplacer. Il existe deux types de remplacements peuvent être effectués:

Le remplacement d'un Id Localisateur avec un CSS ou XPath Locator

CSS localisateurs de commencer avec "css=" XPath et les localisateurs de commencer par "//" (le "xpath=" préfixe est facultatif). CSS locators sont moins détaillées et sont plus faciles à lire et doit être préférée à l'expression XPath locators. Cependant, il peut y avoir des cas où XPath locators doivent être utilisés, car un CSS localisateur ne peuvent tout simplement pas le couper.

L'Exécution De JavaScript

Certains éléments nécessitent plus qu'une simple souris/clavier interactions en raison de la complexité de rendu réalisé par ExtJS. Par exemple, un Ext.forme.CombBox n'est pas vraiment un <select> élément, mais une saisie de texte avec un décollement de la liste déroulante qui est quelque part en bas de l'arborescence du document. Afin de simuler correctement une zone de liste déroulante de sélection, il est possible d'abord de simuler un clic sur la flèche de la liste déroulante, puis cliquez sur la liste qui s'affiche. Cependant, la localisation de ces éléments par le biais de CSS ou XPath locators peut être lourd. Une alternative consiste à localiser le ComoBox composant lui-même et appeler des méthodes sur elle pour simuler la sélection:

var combo = Ext.getCmp('genderComboBox'); // returns the ComboBox components
combo.setValue('female'); // set the value
combo.fireEvent('select'); // because setValue() doesn't trigger the event

En Sélénium de l' runScript commande peut être utilisée pour effectuer l'opération ci-dessus sous une forme plus concise:

with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }

Faire face à l'AJAX et au Rendu Lent

Le sélénium a "*AndWait" saveurs pour toutes les commandes en attente pour le chargement de la page lorsqu'une action de l'utilisateur les résultats dans les transitions de page ou recharge. Cependant, depuis l'AJAX récupère n'impliquent pas de réelle chargement de la page, ces commandes ne peuvent pas être utilisés pour la synchronisation. La solution consiste à utiliser des indices visuels comme la présence/absence d'un AJAX indicateur de progrès ou de l'apparition de lignes dans une grille, des composants supplémentaires, des liens etc. Par exemple:

Command: waitForElementNotPresent
Target: css=div:contains('Loading...')

Parfois, un élément n'apparaît qu'après un certain laps de temps, selon la vitesse de ExtJS rend les composants après une action de l'utilisateur les résultats dans un changement de vue. Au lieu d'utiliser arbitraire des retards dans l' pause de la commande, l'idéal est d'attendre jusqu'à ce que l'élément d'intérêt vient à notre portée. Par exemple, cliquez sur un élément, après un temps d'attente pour qu'il apparaisse:

Command: waitForElementPresent
Target: css=span:contains('Do the funky thing')
Command: click
Target: css=span:contains('Do the funky thing')

En s'appuyant sur l'arbitraire des pauses n'est pas une bonne idée, étant donné que des différences de calendrier que résultat de l'exécution de tests sur différents navigateurs ou sur des machines différentes, fera le cas de test feuilletée.

Non cliquable Éléments

Certains éléments ne peuvent pas être déclenchées par l' click commande. C'est parce que l'écouteur d'événement est en fait sur le conteneur, en regardant les événements de souris sur ses éléments enfant, que, finalement, la bulle à la mère. Le contrôle onglet est un exemple. Cliquez sur un onglet, vous avez pour simuler un mouseDown événement à l'étiquette d'onglet:

Command: mouseDownAt
Target: css=.x-tab-strip-text:contains('Options')
Value: 0,0

Validation Sur Le Terrain

Les champs de formulaire (Ext.le formulaire.* les composants) associés à des expressions régulières ou vtypes pour la validation de déclencher la validation avec un certain retard (voir l' validationDelay de la propriété qui est fixé à 250 ms par défaut), après que l'utilisateur entre du texte ou immédiatement lorsque le champ perd le focus -- ou des flous (voir l' validateOnDelay de la propriété). Afin de déclencher la validation sur le terrain après la publication du type de Sélénium commande pour entrer du texte à l'intérieur d'un champ, vous devez effectuer une des opérations suivantes:

  • Déclenchement Retardé La Validation

    ExtJS déclenche la validation de la minuterie lorsque le champ reçoit keyup événements. Pour déclencher le minuteur, simplement émettre un mannequin événement keyup (il n'a pas d'importance qui vous l'utiliser comme ExtJS l'ignore), suivie d'une courte pause est plus longue que la validationDelay:

    Command: keyUp
    Target: someTextArea
    Value: x
    Command: pause
    Target: 500
    
  • Le Déclenchement De Validation Immédiate

    Vous pouvez injecter un flou de l'événement dans le champ de déclencher la validation immédiate:

    Command: runScript
    Target: someComponent.nameTextField.fireEvent("blur")
    

La vérification des Résultats de Validation

Après la validation, vous pouvez vérifier la présence ou l'absence d'un champ erreur:

Command: verifyElementNotPresent   
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]

Command: verifyElementPresent   
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]

Notez que le "display: none" vérification est nécessaire, car une fois qu'une erreur s'affichent, puis il doit être caché, ExtJS aurez simplement à masquer l'erreur de terrain au lieu de le retirer de l'arbre du DOM.

L'élément de Conseils spécifiques

En cliquant sur un Poste.forme.Bouton

  • Option 1

    Commande: cliquez sur Cible: css=bouton:contains ("Enregistrer")

    Sélectionne le bouton par sa légende

  • Option 2

    Commande: cliquez sur Cible: css=#enregistrez-bouton options

    Sélectionne le bouton par son id

La sélection d'une Valeur à partir d'un Poste.forme.Zone de liste déroulante

Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }

La première définit la valeur et puis explicitement les feux de l'événement select dans le cas où il y a des observateurs.

11voto

NBRed5 Points 121

Les gens de bons chez Ext JS ont eu la gentillesse assez de poster ce sujet sur leur blog ici. J’espère que cette aide.

5voto

Jonny Leeds Points 741

Ce blog m'a beaucoup aidé. Il écrit beaucoup sur le sujet et il semble que c'est toujours active. Le gars semble aussi apprécier un bon design.

Il parle de l'aide de l'envoi de javascript pour faire des requêtes et l'utilisation de l'Ext.ComponentQuery.méthode de requête pour récupérer les choses de la même manière que vous faites dans votre ext application en interne. De cette façon, vous pouvez utiliser xtypes et itemIds et n'avez pas à vous inquiéter au sujet d'essayer d'interpréter tous les fous de l'auto-générés choses.

J'ai trouvé cet article en particulier très utile.

Peut publier quelque chose d'un peu plus de détails sur bientôt ici - encore en train d'essayer d'obtenir ma tête autour de la façon de le faire correctement

4voto

Marko Dumic Points 6055

J'ai testé mon ExtJs application web avec selenium. L'un des plus gros problème a été de sélectionner un élément dans la grille afin de faire quelque chose avec elle.

Pour cela, j'ai écrit méthode d'assistance (en SeleniumExtJsUtils classe qui est une collection de méthodes utiles pour faciliter l'interaction avec ExtJs):

/**
 * Javascript needed to execute in order to select row in the grid
 * 
 * @param gridId Grid id
 * @param rowIndex Index of the row to select
 * @return Javascript to select row
 */
public static String selectGridRow(String gridId, int rowIndex) {
    return "Ext.getCmp('" + gridId + "').getSelectionModel().selectRow(" + rowIndex + ", true)";
}

et quand j'en avais besoin pour sélectionner une ligne, je venais de l'appeler:

selenium.runScript( SeleniumExtJsUtils.selectGridRow("<myGridId>", 5) );

Pour que cela fonctionne, j'ai besoin de ma carte d'identité sur la grille et ne pas laisser ExtJs générer son propre.

4voto

Master-Test Points 31

Pour détecter que cet élément n’est visible, vous utilisez la clause :``

Il est préférable d’utiliser ceci :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X