[Java][UISpec4J] Intercepter plusieurs fenêtres

Intercepter plusieurs fenêtres [Java][UISpec4J] - Java - Programmation

Marsh Posté le 28-07-2008 à 10:28:26    

Bonjour,
 
Je suis actuellement en train de tester UISpec4J afin de pouvoir automatiser des tests d'interface graphique Swing. Cependant, mon application, lance au démarrage 2 fenêtres en simultanée ce qui fait planter la commande d'interception des fenêtres, me retournant l'erreur suivante :
 

Citation :


Exception in thread "main" junit.framework.AssertionFailedError: Unexpected window shown - this window should be handled with Wind
owInterceptor.
Window contents:
<window title="1">
<button label="0"/></window>
        at org.uispec4j.interception.toolkit.UISpecDisplay.assertAcceptsWindow(UISpecDisplay.java:117)
        ...


Le compilateur dit que le problème provient lors de la création via new Frames2() dans AdapterFrames2.java
 
Y'a t'il moyen d'intercepter 2 fenêtres, ou plus, en simultanée. Les fenêtres sont des JFrames et donc à priori doivent être interceptées avec WindowInterceptor, mais je ne trouve pas de solution à la récupération de plsuieurs éléments. Merci de ne pas me proposer d'utiliser un autre outil (Jemmy et cie) car mon objectif est justement de comparer les différents outils.
 
Merci d'avance
 
Nicolas
 
NB : je joins les parties intéressantes des différents fichiers (le code est pas beau car ce sont des reprises de fichiers déjà existants, mais il est bon).
 
Frames2.java (GUI) :

Code :
  1. ...
  2. public class Frames2 {
  3. private JButton bouton;
  4. public Frames2() {
  5.  int nb_fenetres = 2;
  6.  for (int i=0; i<nb_fenetres; i++) {
  7.   creerFrame(i);
  8.  }
  9. }
  10. public JFrame creerFrame(int nb) {
  11.  String txt = String.valueOf(nb);
  12.  JFrame frame = new JFrame();
  13.  frame.setTitle(txt); // Titre de la fenetre
  14.         bouton = new JButton("0" );
  15.                 ...
  16. }
  17. ...
  18. }


 
FICHIER IMPORTANT : AdapterFrames2.java (interception de fenêtre)

Code :
  1. ...
  2. public class AdapterFrames2 implements UISpecAdapter {
  3.   private Window window;
  4.  
  5.   public Window getMainWindow() {
  6.   if (window == null) {
  7.    window = WindowInterceptor.run(new Trigger() {
  8.     public void run() {new Frames2();}
  9.    });
  10.   }
  11.   return window;
  12.   }
  13. ...
  14. }


 
UISpec4JFrames2.java (Définition des actions)

Code :
  1. ...
  2. public class UISpec4jFrames2 extends UISpecTestCase {
  3. AdapterFrames2 adapt;
  4. static {
  5.  UISpec4J.init();
  6. }
  7. /*
  8.  * Definition des TextBox et Boutons à récupérer
  9.  */
  10. private Button button;;
  11.    
  12. /*
  13.  * Initialisation du test
  14.  */
  15. protected void setUp() throws Exception {
  16.                 super.setUp();
  17.        
  18.  adapt = new AdapterFrames2();
  19.                 setAdapter(adapt);
  20.        
  21.         /*
  22.       * Récupération des différents éléments
  23.       */
  24.                this.button = getMainWindow().getButton();
  25.                UISpec4J.setWindowInterceptionTimeLimit(1000);
  26.       }
  27.       ...
  28. }


Message édité par vivi5421 le 28-07-2008 à 10:58:40
Reply

Marsh Posté le 28-07-2008 à 10:28:26   

Reply

Marsh Posté le 31-07-2008 à 16:34:16    

Bonjour,
 
Je suis l'un des auteurs de UISpec4J.
 
Pour le moment, il n'y a pas de moyen direct pour intercepter simultanément plusieurs JFrame. C'est techniquement faisable, mais le besoin ne s'est pas encore présenté à nous, et la plupart de nos API sont adaptées aux cas les plus courants où l'on intercepte une seule fenêtre principale ou bien des séquences de fenêtres.
 
Avec les API actuelles, il faut un peu ruser pour résoudre votre problème.
 
Tout d'abord, vous ne pouvez pas utiliser la méthode UISpecTestCase.getMainWindow(), qui comme sont nom l'indique s'attend à trouver une seule fenêtre principale. Le mieux reste que vous utilisiez un TestCase classique, en prenant bien soin d'appeler UISpec.init() dans un bloc d'initialisation statique pour prendre de vitesse la mécanique d'initialisation de Swing et installer la mécanique d'interception.  
 
Ensuite, dans votre test, vous pouvez récupérer deux fenêtres en imbricant deux appels à WindowInterceptor.run(), comme illustré dans l'exemple suivant :
 

Code :
  1. final Window[] windows = new Window[2];
  2. windows[1] = WindowInterceptor
  3.    .run(new Trigger() {
  4.      public void run() throws Exception {
  5.        windows[0] = WindowInterceptor
  6.          .run(new Trigger() {
  7.            public void run() throws Exception {
  8.              // ici vous appelez votre main(), ou bien n'importe quelle fonction qui déclenche
  9.              // l'apparition des deux JFrame
  10.              JFrame frame1 = new JFrame("frame 1" );
  11.              frame1.setVisible(true);
  12.              JFrame frame2 = new JFrame("frame 2" );
  13.              frame2.setVisible(true);
  14.            }
  15.          });
  16.       }
  17.    });
  18.     System.out.println(windows[0].getTitle());
  19.     System.out.println(windows[1].getTitle());


 
Cela vous aide-t-il ?
 
Si vous avez de nouveau besoin d'aide et que l'usage de l'anglais vous rebute, vous pouvez nous contacter directement via contact@uispec4j.org
 
Cordialement,
 
Régis.

Reply

Marsh Posté le 01-08-2008 à 15:17:06    

Bonjour,  
 
Déjà merci beaucoup pour l'aide proposée. Alors en effet, cette méthode fonctionne parfaitement pour mon cas de base. Mais lorsque je cherche à l'appliquer sur mon projet plus complexe, il y a alors l'erreur suivante :

Citation :


Exception in thread "main" junit.framework.AssertionFailedError: No window was shown (timeout expired)
       at junit.framework.Assert.fail(Assert.java:47)
       at org.uispec4j.interception.handlers.ShownInterceptionDetectionHandler.waitWindow(ShownInterceptionDetectionHandler.java:31)
       ...


 
J'ai bien sur essayé d'allonger le temps d'attente pour l'interception, sans succès. Mais en fait, en regardant bien le code source, j'ai découvert que sur les 3 frames du projet complexes, les 2 dernières sont en fait des JDialog. Peut-être en est-ce la cause, bien qu'elles ne soient pas modales (elles ne bloquent pas le focus lors de l'exécution). Je vais essayer tout de même avec cette méthode :
 

Code :
  1. WindowInterceptor
  2.       .init(applyButton.triggerClick())
  3.       .process(new WindowHandler("first dialog" ) {
  4.         public Trigger process(Window window) {
  5.           // ... perform some operations on the first window ...
  6.           return window.getButton("OK" ).triggerClick(); // return a trigger that will close it
  7.         }
  8.       })
  9.       .process(new WindowHandler("second dialog" ) {
  10.         public Trigger process(Window window) {
  11.           // ... perform some operations on the second window ...
  12.           return window.getButton("OK" ).triggerClick(); // return a trigger that will close it
  13.         }
  14.       })
  15.       .run();


En plaçant l'interception de la première JFrame dans le run()
 
Merci beaucoup pour l'aide en tout cas.


Message édité par vivi5421 le 01-08-2008 à 16:30:43
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed