2017-06-30 2 views
0

Tous mes tests Geb/Spock fonctionnaient parfaitement sur Firefox, puis j'ai essayé avec Chrome (v59) et il reste suspendu lorsqu'une fenêtre d'alerte ou de confirmation est déclenchée.Interaction avec <dialog> avec Geb/Selenium (uniquement avec Chrome)

Avec Firefox, j'utilisais withAlert{} ou withConfirm{} pour les gérer, mais cela ne fonctionne pas avec Chrome.

J'ai donc creusé un peu dans les vues et j'ai découvert que la boîte de dialogue était gérée par this widget. J'ai donc créé des accesseurs à <dialog> dans mon objet page mais Chrome est toujours incapable d'interagir avec lui (aucun moyen de détecter que la fenêtre pop-up est affichée ou de la fermer). J'ai essayé plusieurs choses comme utiliser displayed ou attendre que le texte soit affiché mais rien n'a fonctionné.

Je ne suis pas habitué à jQuery alors peut-être qu'il me manque quelque chose ici?

Voici un exemple du code que je dois interagir avec:

<dialog class="qq-alert-dialog-selector"> 
    <div class="qq-dialog-message-selector"></div> 

    <div class="qq-dialog-buttons"> 
     <button type="button" class="qq-cancel-button-selector">Close</button> 
    </div> 
</dialog> 

Et voilà comment je tente d'accéder à (dans mon objet page):

alertPopUp {$("dialog", class:"qq-alert-dialog-selector")} 
alertCloseButton {alertPopUp.children("div.qq-dialog-buttons").children("button")} 

Et enfin comment Je voudrais tester la pop-up:

when: "Trying to upload ..." 
uploadFileButton = incorrect.absolutePath 

then: "An alerting pop up occurs" 
waitFor{alertPopUp.displayed} 


when: "Closing the pop up" 
alertCloseButton.click(SubmitAClaim) 

then: "Number of uploaded files should not change" 
uploadedElements.size() == initialUploadedFiles 

Quelqu'un peut-il aider? Je suppose que cela a quelque chose à voir avec l'accent de chrome (je veux dire si elle est actuellement sur le pop-up ou sur la page derrière

EDIT:.

Après tout, il semble que le problème . n'est pas lié avec jQuery (bonne chose que je suppose) Nous pouvons vérifier la boîte de dialogue est ouvert grâce à open attribute à <dialog> je l'ai fait quelque chose comme ça.

when: "Trying to upload ..." 
uploadFileButton = incorrect.absolutePath 

then: "A alerting pop up occurs" 
waitFor {alertPopUp.getAttribute("open") == "true"} 

Mais je ne peux toujours pas interagir avec la boîte de dialogue: quand j'essaye de c lécher sur alertCloseButton il soulève un ElementNotVisibleException. Cela a donc quelque chose à voir avec la focalisation du navigateur, je suppose. Je essayé:

  • withWindow{} ou driver.switchTo().window() mais la seule fenêtre disponible est le principal.
  • withFrame() mais je reçois un NoSuchFrameException
  • driver.switchTo().alert() mais soulèvent un NoAlertRaisedException

Je me demande si quelqu'un sait comment Chrome considère étiquette <dialog> (alerte, confirmer, ...)?

Note: Selon caniuse.com, Chrome est le seul navigateur compatible avec <dialog> pour l'instant.

+0

J'ai réussi à tester si la fenêtre pop-up est affichée en utilisant 'waitFor {alertPopUp.getAttribute (" open ")! = Null}' elle passe mais je ne suis même pas sûre qu'elle s'affirme vraiment sur la bonne chose. Je continue à cliquer sur le bouton dans la boîte de dialogue. Le sélénium soulève une 'ElementNotVisibleException' et j'ai déjà vérifié: il n'y a pas plusieurs éléments sélectionnés avec un élément non visible. Il n'y en a qu'un ('alertCloseButton.size() == 1'). Est-ce que quelqu'un a une idée ou est-ce que je m'enregistre comme un problème sur ChromeDriver 2.30? – Saub

Répondre

0

Enfin J'ai réussi à trouver un moyen de résoudre ce problème.J'ai jeté un oeil dans google demo pour <dialog> utiliser et j'ai utilisé le js object fourni par Geb pour exécuter l'exemple js de Google. Cela donne enfin ceci:

when: "Trying to upload ..." 
uploadFileButton = incorrect.absolutePath 

then: "A alerting pop up occurs" 
waitFor {alertPopUp.getAttribute("open") == "true"} 


when: "Closing the pop up" 
report "After upload" 
js.exec """var dialog = document.querySelector(".qq-alert-dialog-selector"); 
    dialog.close(); 
    return true; 
""" 

then: "Number of uploaded files should not change" 
uploadedElements.size() == initialUploadedFiles 

Ceci est vraiment force brute et je ne l'aime pas car il repose beaucoup sur l'extrémité arrière, comment les dialogues sont mis en place, etc ... Mais il fonctionne. J'espère vraiment Geb/Selenium fournira quelque chose de plus facile à utiliser (comme <dialog> est W3C il deviendra habituel sur tous les navigateurs).