web-dev-qa-db-fra.com

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

J'ai la situation, lorsque vous cliquez sur le bouton ouvre la nouvelle fenêtre du navigateur avec les résultats de la recherche.

Est-il possible de se connecter et de se concentrer sur la nouvelle fenêtre du navigateur ouvert?  

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

68

Vous pouvez basculer entre les fenêtres comme 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)
93
Surya

Juste pour ajouter au contenu ...

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

utiliser driver.switchTo().defaultContent();

11
Amarnath Rayudu

Ce script vous aide à passer d'une fenêtre parent à une fenêtre enfant et à revenir à 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
          }
       }
10
Prashanth Sams

Surya, ton chemin ne fonctionnera pas, pour deux raisons:

  1. vous ne pouvez pas fermer le pilote pendant l'évaluation du test car il perdra le focus , avant de passer à l'élément actif, et vous obtiendrez NoSuchWindowException.
  2. si les tests sont exécutés sur ChromeDriver, vous n’obtiendrez pas une fenêtre mais un onglet qui s’affiche dans votre application. Comme SeleniumDriver ne peut pas agir avec des onglets , il ne fait que basculer d’une fenêtre à l’autre, il se bloque au clic lorsque le nouvel onglet est en cours d’ouverture et se bloque lors de l’expiration du délai. 
3
Invy

Modifier le registre pour IE:

 ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER\Logiciel\Microsoft\Internet Explorer\Principal
  2. Cliquez avec le bouton droit de la souris sur → Nouveau → Valeur de chaîne → Nom de la valeur: TabProcGrowth (créer s'il n'existe pas).
  3. TabProcGrowth (clic droit) → Modifier ... → Données de la valeur: 0

Source:Problème de commutation de fenêtres de Selenium WebDriver dans Internet Explorer 8-10

Dans mon cas, IE a commencé à détecter de nouveaux descripteurs de fenêtre après la modification du registre.

Tiré du blog MSDN:

Croissance du processus Tab: Définit la vitesse à laquelle IE crée les processus Nouvel onglet.

L'algorithme "Max-Number": il spécifie le nombre maximal de processus de tabulation pouvant être exécutés pour une seule session d'isolement pour un processus de trame unique à un niveau d'intégrité obligatoire (MIC) spécifique. Les valeurs relatives sont:

  • TabProcGrowth = 0: les onglets et les cadres sont exécutés dans le même processus; les cadres ne sont pas unifiés entre les niveaux MIC.
  • TabProcGrowth = 1: tous les onglets d'un processus de trame donné sont exécutés dans un processus de tabulation unique pour un niveau MIC donné.

Source:L'ouverture d'un nouvel onglet peut lancer un nouveau processus avec Internet Explorer 8.0


Options Internet:

  • Sécurité → Décocher Activer le mode protégé pour toutes les zones (Internet, Intranet local, Sites de confiance, Sites restreints)
  • Avancé → Sécurité → Décocher Activer le mode protégé amélioré _

Code:

Navigateur: IE11 x64 (Zoom: 100%)
OS: Windows 7 x64
Sélénium: 3.5.1
WebDriver: IEDriverServer x64 3.5.1

public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle(); // Save parent window
WebElement clickableElement = driver.findElement(by);
clickableElement.click(); // Open child window
WebDriverWait wait = new WebDriverWait(driver, 10); // Timeout in 10s
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
    Set<String> handles = driver.getWindowHandles();
    // Switch to child window
    for (String handle : handles) {
        driver.switchTo().window(handle);
        if (!parentHandle.equals(handle)) {
            break;
        }
    }
    driver.manage().window().maximize();
}
return parentHandle; // Returns parent window if need to switch back
}



/* How to use method */
String parentHandle = Selenium.openWindow(driver, by);

// Do things in child window
driver.close();

// Return to parent window
driver.switchTo().window(parentHandle);

Le code ci-dessus inclut un if-check pour vous assurer que vous ne passez pas à la fenêtre parente car Set<T> n'a pas la garantie de commander en Java . WebDriverWait semble augmenter les chances de succès, comme l'indique l'énoncé ci-dessous.

Cité de Luke Inman-Semerau : (développeur pour Selenium)

Le navigateur peut prendre du temps pour reconnaître la nouvelle fenêtre, et vous pouvez tomber dans votre boucle switchTo () avant que la fenêtre contextuelle apparaisse.

Vous supposez automatiquement que la dernière fenêtre est retournée par getWindowHandles () sera le dernier ouvert. Ce n'est pas nécessairement vrai, car ils ne sont pas garantis pour être retournés dans n'importe quel ordre.

Source:Impossible de gérer une fenêtre contextuelle dans IE, le contrôle n'est pas transféré vers une fenêtre contextuelle


Articles Similaires:

2
silver

J'utilise un itérateur et une boucle while pour stocker les différentes poignées de fenêtre, puis commuter d'avant en arrière.

//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);
            }
2
StatusQuo

Vous pouvez utiliser: 

driver.SwitchTo().Window(WindowName);

Où WindowName est une chaîne représentant le nom de la fenêtre sur laquelle vous souhaitez activer le focus. Appelez cette fonction à nouveau avec le nom de la fenêtre d'origine pour y revenir lorsque vous avez terminé.

1
Breeze91

Donc, le problème avec beaucoup de ces solutions est que vous supposez que la fenêtre apparaît instantanément (rien ne se produit instantanément et les choses se passent beaucoup moins instantanément dans IE). De plus, vous supposez qu'il n'y aura qu'une fenêtre avant de cliquer sur l'élément, ce qui n'est pas toujours le cas. De plus, IE ne renverra pas les descripteurs de fenêtre dans un ordre prévisible. Je ferais donc ce qui suit.

 public String clickAndSwitchWindow(WebElement elementToClick, Duration 
    timeToWaitForWindowToAppear) {
    Set<String> priorHandles = _driver.getWindowHandles();

    elementToClick.click();
    try {
        new WebDriverWait(_driver,
                timeToWaitForWindowToAppear.getSeconds()).until(
                d -> {
                    Set<String> newHandles = d.getWindowHandles();
                    if (newHandles.size() > priorHandles.size()) {
                        for (String newHandle : newHandles) {
                            if (!priorHandles.contains(newHandle)) {
                                d.switchTo().window(newHandle);
                                return true;
                            }
                        }
                        return false;
                    } else {
                        return false;
                    }

                });
    } catch (Exception e) {
        Logging.log_AndFail("Encountered error while switching to new window after clicking element " + elementToClick.toString()
                + " seeing error: \n" + e.getMessage());
    }

    return _driver.getWindowHandle();
}
0
 main you can do :

 String mainTab = page.goToNewTab ();
 //do what you want
 page.backToMainPage(mainTab);  

 What you need to have in order to use the main   

        private static Set<String> windows;

            //get all open windows 
            //return current window
            public String initWindows() {
                windows = new HashSet<String>();
                driver.getWindowHandles().stream().forEach(n ->   windows.add(n));
                return driver.getWindowHandle();
            }

            public String getNewWindow() {
                List<String> newWindow = driver.getWindowHandles().stream().filter(n -> windows.contains(n) == false)
                        .collect(Collectors.toList());
                logger.info(newWindow.get(0));
                return newWindow.get(0);
            }


            public String goToNewTab() {
                String startWindow = driver.initWindows();
                driver.findElement(By.cssSelector("XX")).click();
                String newWindow = driver.getNewWindow();
                driver.switchTo().window(newWindow);
                return startWindow;
            }

            public void backToMainPage(String startWindow) {
                driver.close();
                driver.switchTo().window(startWindow);
            }
0
Ran Adler