87 votes

Comment passer à la nouvelle fenêtre du navigateur, qui s'ouvre après avoir cliqué sur le bouton ?

J'ai une situation où, lorsque je clique sur le bouton, la nouvelle fenêtre du navigateur s'ouvre avec les résultats de la recherche.

Existe-t-il un moyen de se connecter et de se concentrer sur la nouvelle fenêtre de navigateur ouverte ?

Et travaillez avec, puis revenez à la (première) fenêtre d'origine.

0 votes

Nous pouvons effectuer le changement automatiquement - vérifiez ici pour l'utilisation avancée -. testautomationguru.com/

121voto

Surya Points 1026

Vous pouvez passer d'une fenêtre à l'autre comme indiqué ci-dessous :

// Store the current window handle
String winHandleBefore = driver.getWindowHandle();

// Perform the click operation that opens new window

// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
}

// Perform the actions on new window

// Close the new window, if that window no more required
driver.close();

// Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);

// Continue with original browser (first window)

4 votes

Je peux confirmer que la solution acceptée fonctionne systématiquement dans Chrome mais pas dans IE. La poignée de la nouvelle fenêtre n'est pas reconnue dans IE. @Elmue est incorrect car getWindowHandles() renvoie un ensemble et un ensemble ne garantit pas l'ordre . Le dernier élément n'est pas toujours la dernière fenêtre. Je suis surpris que son commentaire obtienne beaucoup de upvotes.

0 votes

@silver : Je n'ai aucune idée de ce dont vous parlez. Dans mon code WindowHandles renvoie une ReadOnlyCollection<string> pour laquelle je peux garantir que la dernière entrée est toujours la dernière fenêtre ouverte. Je l'ai testé. Si cela fonctionne parfaitement en C#, mais est mal implémenté en Java, vous devriez le signaler comme un bug.

2 votes

@Elmue Il s'agit d'un fil de discussion Java. Veuillez lire celui de Luke (développeur Selenium). réponse concernant getWindowHandles() . C'est un comportement connu (pas un bug) de la méthode et du Set<T> de Java en particulier. Par conséquent, switchTo().window(handles[handles.length-1]) n'est pas garantie en Java. On ne peut pas prétendre qu'une solution C# est correcte.

12voto

Prashanth Sams Points 959

Ce script vous aide à basculer d'une Fenêtre parentale à un Fenêtre enfant et retour cntrl à la fenêtre parent

String parentWindow = driver.getWindowHandle();
Set<String> handles =  driver.getWindowHandles();
   for(String windowHandle  : handles)
       {
       if(!windowHandle.equals(parentWindow))
          {
          driver.switchTo().window(windowHandle);
         <!--Perform your operation here for new window-->
         driver.close(); //closing child window
         driver.switchTo().window(parentWindow); //cntrl to parent window
          }
       }

1 votes

Driver.close() fonctionnera pour une nouvelle fenêtre. S'il s'agit d'un nouvel onglet, utilisez le code suivant pour fermer le nouvel onglet : driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "w") ;

12voto

user1999663 Points 21

Juste pour ajouter au contenu ...

Pour revenir à la fenêtre principale (fenêtre par défaut) .

utilice driver.switchTo().defaultContent();

4voto

Invy Points 130

Surya, ta méthode ne marchera pas, pour deux raisons :

  1. vous ne pouvez pas fermer le pilote pendant l'évaluation du test comme il perdra le focus avant de passer à l'élément actif, et vous obtiendrez NoSuchWindowException.
  2. Si le test est exécuté sur ChromeDriver, vous n'obtiendrez pas une fenêtre, mais un onglet au clic dans votre application. Comme SeleniumDriver ne peut pas agir avec les onglets Il ne fait que passer d'un Windows à l'autre, il se bloque au moment où l'on clique sur le nouvel onglet qui s'ouvre, et il s'arrête au bout d'un certain temps.

1 votes

Vous pouvez en fait utiliser l'appel à driver.close() puisque vous changez de gestionnaire de fenêtre sur le pilote et que vous demandez à la fenêtre sur laquelle vous vous trouvez de se fermer. Je l'utilise régulièrement dans mon code lorsque je traite avec plusieurs fenêtres. driver.Quit() est l'appel qui va tuer le test. Dans Chromedriver, vous pouvez toujours appeler getWindowHandles() pour obtenir la liste des fenêtres disponibles. Je ne vois pas de raison d'utiliser un onglet dans un test web.

0 votes

@Elmue La question initiale indiquait qu'un clic ouvrait une deuxième fenêtre, créant ainsi une poignée de fenêtres multiples. Je peux faire l'appel driver.close() ; et faire fermer ma fenêtre qui a actuellement le focus. Je peux alors passer à n'importe quelle autre fenêtre active de mon choix. driver.close() et driver.quit() ne partagent pas la même fonctionnalité. Un appel à driver.quit() tuera l'instance active du driver, alors que close ne tue que la poignée de la fenêtre en cours. De plus, je n'ai pas encore vu d'appel qui ouvre uniquement un onglet après un clic lorsque le javascript du site Web crée une nouvelle fenêtre.

0 votes

J'avais tort et j'ai supprimé mon commentaire. Vous pouvez également supprimer votre réponse.

2voto

StatusQuo Points 448

J'utilise un itérateur et une boucle while pour stocker les différents poignées de fenêtre et ensuite passer de l'une à l'autre.

//Click your link
driver.findElement(By.xpath("xpath")).click();
//Get all the window handles in a set
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);
//perform actions on new window
driver.close();
driver.switchTo().window(parent);
            }

0 votes

Il ne parvient pas à passer aux nouveaux onglets, mais il effectue des clics sur le nouvel onglet souhaité. Pourquoi ?

0 votes

Y a-t-il une raison pour laquelle ce code pourrait rendre le test très lent ? Il semble qu'après ce bout de code, il faille environ 10 minutes pour effectuer une quelconque action dans le Newwin.

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