2009-10-06 5 views
0

Un script que nous avons demandé à l'utilisateur pour quelques valeurs via des appels JavaScript successifs à window.prompt(). Selenium enregistre cette action, à la fois les textes d'invite et les valeurs que j'ai tapées, mais il ne semble pas pouvoir la lire correctement. Il «réussit» en ce qu'aucune erreur ne se produit, mais seule la première valeur de l'invite revient réellement à mon script. En outre, la valeur par défaut de la commande des enregistrements Sélénium rend la secondes valeur se retourne dans la place du premier, et le reste toujours vide:Commande de sélénium pour les invitations JavaScript un après l'autre

# [info] Executing: |answerOnNextPrompt | TEXT1 | | 
# [info] Executing: |select | id | label=mychoice | 
# [info] Executing: |answerOnNextPrompt | TEXT2 | | 
# [info] Executing: |assertPrompt | Please enter a value for q1 | | 
# [info] Executing: |answerOnNextPrompt | TEXT3 | | 
# [info] Executing: |assertPrompt | Please enter a value for q2 | | 
# [info] Executing: |answerOnNextPrompt | TEXT4 | | 
# [info] Executing: |assertPrompt | Please enter a value for q3 | | 
# [info] Executing: |assertPrompt | Please enter a value for q4 | | 

je réorganisés dans ce qui me semble plus sensible à:

# [info] Executing: |answerOnNextPrompt | TEXT1 | | 
# [info] Executing: |select | id | label=mychoice | 
# [info] Executing: |assertPrompt | Please enter a value for q1 | | 
# [info] Executing: |answerOnNextPrompt | TEXT2 | | 
# [info] Executing: |assertPrompt | Please enter a value for q2 | | 
# [info] Executing: |answerOnNextPrompt | TEXT3 | | 
# [info] Executing: |assertPrompt | Please enter a value for q3 | | 
# [info] Executing: |answerOnNextPrompt | TEXT4 | | 
# [info] Executing: |assertPrompt | Please enter a value for q4 | | 

Après cela, je reçois TEXT1 comme première valeur, mais le reste reste vide.

J'ai également essayé waitForPrompt à la place de chaque assertPrompt, mais pas de dés.

Je pense que Sélénium ne peut pas gérer réellement cette situation parce que answerOnNextPrompt semble avoir besoin de venir avant l'action qui déclenche l'invite, mais il est l'action qui déclenche l'invite suivante, donc après le premier déclenchement par select, il n'y a aucun moyen de le faire, car ils ne se cumulent pas.

J'aimerais avoir tort, mais ... des idées?

(Dans le cas contraire, je pourrais signaler un bug/quelque chose qu'ils doivent changer dans l'API, peut-être en combinant answerOnNextPrompt avec assertPrompt:. Il pourrait tout simplement prendre un argument optionnel avec la façon dont l'invite doit répondre)

La plate-forme est Selenium IDE 1.0.2 sur Firefox 3.5.3 sur win32.

+0

Quel est le résultat après avoir réorganisé le test? – Santi

+0

Désolé, ce n'était pas très clair, je l'ai édité. – Kev

Répondre

3

Cela ressemble certainement à une limitation dans le sélénium. Ce qui suit est de la source de sélénium browserbot.js:

windowToModify.prompt = function(message) { 
    browserBot.recordedPrompts.push(message); 
    var result = !browserBot.nextConfirmResult ? null : browserBot.nextPromptResult; 
    browserBot.nextConfirmResult = true; 
    browserBot.nextPromptResult = ''; 
    self.relayBotToRC.call(self, "browserbot.recordedPrompts"); 
    return result; 
}; 

Il semble traiter toutes les invites lorsque la fenêtre est « modifiée », et après chaque Il définit la réponse suivante à vide. Je voudrais faire une demande d'amélioration. Sans trop y penser, je suggère d'autoriser l'empilement de la commande anwerOnNextPrompt afin que vous puissiez mettre en file d'attente les réponses que vous souhaitez donner à chaque message.

Mise à jour:

Quelque chose de semblable sera également se produire pour les confirmations JavaScript consécutives. Le premier utilisera la réponse définie par select * OnNextConfirmation, et toutes les confirmations suivantes sélectionneront automatiquement OK (true).

windowToModify.confirm = function(message) { 
    browserBot.recordedConfirmations.push(message); 
    var result = browserBot.nextConfirmResult; 
    browserBot.nextConfirmResult = true; 
    self.relayBotToRC.call(self, "browserbot.recordedConfirmations"); 
    return result; 
}; 
0

Que diriez-vous celui-ci:

# [info] Executing: |select | id | label=mychoice | 
# [info] Executing: |answerOnNextPrompt | TEXT1 | | 
# [info] Executing: |assertPrompt | Please enter a value for q1 | | 
# [info] Executing: |answerOnNextPrompt | TEXT2 | | 
# [info] Executing: |assertPrompt | Please enter a value for q2 | | 
# [info] Executing: |answerOnNextPrompt | TEXT3 | | 
# [info] Executing: |assertPrompt | Please enter a value for q3 | | 
# [info] Executing: |answerOnNextPrompt | TEXT4 | | 
# [info] Executing: |assertPrompt | Please enter a value for q4 | | 

BTW, pourquoi ne pas utiliser un formulaire HTML régulier à la place un si grand nombre de ces invites javascript ennuyeux?

+0

Je viens d'essayer ça, il met simplement TEXT1 dans la première valeur et vide le reste encore. Nous émulions une interface utilisateur à laquelle tout le monde est déjà habitué dans ce contexte. Ça va changer un jour, ne t'inquiète pas. : P – Kev

Questions connexes