web-dev-qa-db-fra.com

Méthode WebDriver.getWindowHandle ()

Je suis nouveau dans l'apprentissage de sélénium. WebDriver.getWindowHandle () documentation n'est pas très clair pour moi et l'exemple ne fonctionne pas comme indiqué dans le livre. J'ai donc pensé à confirmer la valeur renvoyée par cette méthode. 

1) Disons que je suis à la page PAGE1. Donc, getWindowHandle () devrait renvoyer le descripteur à PAGE1. (Correct)

2) Maintenant de cette page, je vais à la PAGE2 (par hyperlien et ouvrant une nouvelle fenêtre). Mon livre dit maintenant que getWindowHandle () devrait renvoyer le descripteur à PAGE2. Cependant mon programme retourne toujours le handle de PAGE1. 

Sélénium v2.43

Reproductible sur Firefox et Chrome à la fois. 

Question: Quelle est la valeur exacte que getWindowHandle () doit renvoyer?

WebDriver wd = new ChromeDriver();
wd.get("file://D:/Projects/Selenium/Startup/web/ch3/switch_main.html");

String h1 = wd.getWindowHandle();// original handle
System.out.println("First handle = " + h1);

WebElement clickhere = wd.findElement(By.id("clickhere"));
clickhere.click();//moved to a new child page<

String h2 = wd.getWindowHandle();
System.out.println("Second handle = " + h2);// this handle is not different than h1

4
Ketan

getWindowHandle() obtiendra l’analyseur de la page actuellement contrôlée par webDriver. Ce descripteur est un identifiant unique pour la page Web. Ceci est différent à chaque fois que vous ouvrez une page, même s'il s'agit de la même URL.

getWindowHandles() (n'oubliez pas le 's') vous donnera toutes les poignées de toutes les pages que le pilote Web comprend ouvertes. Notez que lorsque vous les mettez dans une liste, ils sont répertoriés dans l'ordre dans lequel ils ont été ouverts.

Vous pouvez utiliser SwitchTo().Window("handle") pour passer à la fenêtre souhaitée.

Vous pouvez utiliser SwitchTo().Window("mywindowID"), si vous connaissez l'ID de la fenêtre.

SwitchTo().Window("") retournera toujours à la fenêtre de base/principale.

SwitchTo().Frame("popupFrame") va accéder au Popup venant de la fenêtre que le WebDriver contrôle actuellement.

5
Chuck Brown

Si le lien ouvre une nouvelle fenêtre, vous devriez avoir une nouvelle fenêtre dans la variable WebDriver. Vous pouvez mettre en boucle les poignées de fenêtres actuelles avec getWindowHandles

Voir cet exemple à partir de http://www.thoughtworks.com/products/docs/twist/13.3/help/how_do_i_handle_popup_in_Selenium2.html

  String parentWindowHandle = browser.getWindowHandle(); // save the current window handle.
  WebDriver popup = null;
  Iterator<String> windowIterator = browser.getWindowHandles();
  while(windowIterator.hasNext()) { 
    String windowHandle = windowIterator.next(); 
    popup = browser.switchTo().window(windowHandle);
    if (popup.getTitle().equals("Google") {
      break;
    }
  }
4
isalgueiro

Lorsque vous ouvrez la nouvelle fenêtre, la variable WebDriver ne la remplacera pas automatiquement. Vous devez utiliser la méthode switchTo() pour basculer vers la nouvelle fenêtre, en utilisant le nom de la nouvelle fenêtre ou son descripteur (que vous pouvez obtenir avec getWindowHandles() et en recherchant celle qui n'est pas la fenêtre actuelle).

3
Sizik

Avec Selenium 2.53.1 utilisant firefox 47.0.1 en tant que WebDriver en Java: Vous devez ouvrir les fenêtres/navigateurs séparés dans son propre pilote. J'ai le même problème. Peu importe le nombre de fenêtres ou d'onglets que j'ai ouverts, "driver.getWindowHandles ()" ne renverrait qu'un seul descripteur, il était donc impossible de basculer entre les onglets. J'ai trouvé que Chrome fonctionnait beaucoup mieux pour moi.

Une fois que j'ai commencé à utiliser Chrome 51.0, je pouvais obtenir tous les descripteurs. Le code suivant montre comment accéder à plusieurs pilotes et à plusieurs onglets dans chaque pilote.

// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS/BROWSERS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

 // STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
 ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());

 // REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)

 // LOOP TO OPEN AS MANY TABS AS YOU WISH
 for(int i = 0; i < TAB_NUMBER; i++) {
    driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
    // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
    Thread.sleep(100);

 // STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
 ArrayList tabs2 = new ArrayList<String> (driver2.getWindowHandles());

 // NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
 for(int ii = 0; ii <= TAB_NUMBER; ii++) {
    driver2.switchTo().window(tabs2.get(ii));
    // LOGIC FOR THAT DRIVER'S CURRENT TAB
 }

 // PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
 for(int ii = 0; ii <= TAB_NUMBER; ii++) {
    drvier2.switchTo().window(tabs2.get(ii));
    // LOGIC FOR THAT DRIVER'S CURRENT TAB
 }

J'espère que cela vous donne une bonne idée de la façon de manipuler plusieurs onglets dans plusieurs fenêtres de navigateur.

0
Charles Woodson

J'ai utilisé ce code pour mon projet 

String oldTab = driver.getWindowHandle();

public static void switchingToNewTabUsingid(WebDriver driver,WebDriverWait wait,String id,String oldTab)
    {
        wait.until(ExpectedConditions.elementToBeClickable(By.id(id)));
        driver.findElement(By.id(id)).click();
        ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
        newTab.remove(oldTab);
        driver.switchTo().window(newTab.get(0));
    }

// Effectuer l'opération ici sur l'onglet commuté

public static void comingBackToOldTab(WebDriver driver,String oldTab)
    {
        driver.close();
        driver.switchTo().window(oldTab);
    }
0
OPTIMUS