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

j'ai situation, quand cliquez sur le bouton ouvre la nouvelle fenêtre du navigateur avec des résultats de recherche.

y a-t-il un moyen de se connecter et de se concentrer sur une nouvelle fenêtre de navigateur ouverte?

et travailler avec elle, puis retourner à l'original(première) fenêtre.

66
demandé sur Emna 2012-03-06 21:29:37

11 réponses

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)
90
répondu Surya 2015-06-09 09:04:12

juste pour ajouter au contenu ...

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

utiliser driver.switchTo().defaultContent();

11
répondu user1999663 2013-01-22 09:20:17

ce script vous aide à passer d'une fenêtre Parent à une fenêtre enfant et retour cntrl à 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
          }
       }
9
répondu Prashanth Sams 2014-05-07 19:49:14

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

  1. vous ne pouvez pas fermer driver lors de l'évaluation du test comme il va perdre la mise au point , avant de passer à l'élément actif, et vous obtiendrez NoSuchWindowException.
  2. si le test est exécuté sur ChromeDriver, vous n'obtiendrez pas de fenêtre, mais cliquez sur tab dans votre application. Comme SeleniumDriver ne peut pas agir avec les onglets , commute seulement entre windows, il accroche sur le clic où le nouvel onglet est en train d'ouvrir, et se bloque sur le timeout.
3
répondu Invy 2012-07-31 10:20:54

j'utilise iterator et boucle while pour stocker les différentes poignées de fenêtre et puis basculer 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
répondu StatusQuo 2012-06-01 21:28:08

modifier registry for IE:

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
  2. clic droit → nouveau → valeur de la chaîne de caractères → valeur nom: TabProcGrowth (créer s'il n'existe pas)
  3. TabProcGrowth (clic droit) → Modifier... → Données de valeur: 0

Source: Selenium WebDriver windows commutation problème dans Internet Explorer 8 à 10

pour mon cas, IE a commencé à détecter de nouvelles poignées de fenêtre après l'édition du registre.

tiré du blog MSDN:

Tab process Growth: fixe la vitesse à laquelle IE crée de nouveaux processus Tab.

l'algorithme" Max-Number": il spécifie le nombre maximum de les processus tab qui peuvent être exécutés pour une seule session d'isolement pour un processus à une seule trame à un niveau d'intégrité obligatoire spécifique (CIM). Les valeurs relatives sont:

  • TabProcGrowth=0 : les onglets et les trames fonctionnent dans le même processus; les trames ne sont pas unifiées entre les niveaux MIC.
  • TabProcGrowth =1: Tous les onglets d'un processus de trames donné s'exécutent dans un seul processus d'onglets pour un niveau MIC donné.

Source: ouvrir 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 à Accès restreint)
  • Avancé → Sécurité → Décocher Permettent D'Améliorer L' Mode Protégé

Code:

du 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 s'assurer que vous ne passez pas à la fenêtre parent car Set<T> n'a pas de commande garantie en Java . WebDriverWait semble augmenter les chances de succès comme soutenu par l'énoncé ci-dessous.

Cité Luc Inman-Semerau : (Développeur pour le Sélénium)

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 popup n'apparaisse.

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

Source: incapable de gérer un popup dans IE,le contrôle n'est pas transférer à la fenêtre popup


Related Posts:

2
répondu silver 2018-05-06 02:16:09

vous pouvez utiliser:

driver.SwitchTo().Window(WindowName);

où WindowName est une chaîne de caractères représentant le nom de la fenêtre vers laquelle vous voulez changer de focus. Appeler cette fonction à nouveau avec le nom de la fenêtre d'origine pour y revenir lorsque vous avez terminé.

1
répondu Breeze91 2012-03-06 19:38:08
 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
répondu Ran Adler 2018-01-10 09:09:25

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 produisent de manière significative moins instantanément dans IE). Aussi, vous êtes en supposant qu'il n'y aura qu'une seule fenêtre avant de cliquer sur l'élément, ce qui n'est pas toujours le cas. Aussi IE ne retournera pas les poignées de fenêtre dans un ordre prévisible. Je voudrais donc faire 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
répondu Dominic Giallombardo 2018-05-27 02:09:29

si vous avez plus d'un navigateur (utilisant java 8)

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class TestLink {

  private static Set<String> windows;

  public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver();
    driver.get("file:///C:/Users/radler/Desktop/myLink.html");
    setWindows(driver);
    driver.findElement(By.xpath("//body/a")).click();
    // get new window
    String newWindow = getWindow(driver);
    driver.switchTo().window(newWindow);

    // Perform the actions on new window
    String text = driver.findElement(By.cssSelector(".active")).getText();
    System.out.println(text);

    driver.close();
    // Switch back
    driver.switchTo().window(windows.iterator().next());


    driver.findElement(By.xpath("//body/a")).click();

  }

  private static void setWindows(WebDriver driver) {
    windows = new HashSet<String>();
    driver.getWindowHandles().stream().forEach(n -> windows.add(n));
  }

  private static String getWindow(WebDriver driver) {
    List<String> newWindow = driver.getWindowHandles().stream()
        .filter(n -> windows.contains(n) == false).collect(Collectors.toList());
    System.out.println(newWindow.get(0));
    return newWindow.get(0);
  }

}
-1
répondu Ran Adler 2014-10-06 12:08:20

j'aime le mode de commutation automatique des fenêtres que je peux contrôler en utilisant les objets de page.

quand il y a plusieurs fenêtres ouvertes, n'importe quelle méthode de cet objet de page, sera exécutée sur une fenêtre de navigateur qui a le titre correspondant.

@Window(".* some windows title goes here .*")
public class ToolsQANewWindow {

    // your page object code

}

vérifier ici pour les étapes détaillées - http://www.testautomationguru.com/selenium-webdriver-automatic-switching-between-browser-windows-using-guice-method-interceptor/

-2
répondu vins 2017-06-08 15:32:20